Аппроксимация данных методом наименьших квадратов
END.
Repeat
BEGIN
Begin
Begin
Begin
Begin
Begin
Begin
Var
Const
Type
Пример программы 2.
{$N+}
Program Newton;
{Решение систем нелинейных алгебраических уравнений методом Ньютона}
Uses Crt;
IntType = Integer; {Целый тип данных}
RealType = Extended; {Вещественный тип данных}
ArrayType = Array[1..2] of RealType; {Массив вещественного типа}
MatrixType = Array[1..2,1..2] of RealType; {Матрица вещественного типа}
BoolType = Boolean;
NameOut = 'D:\FORTRAN\PRAC_F77\Var-Uru\NEWTON\newton-p.out';
Eps= 0.1E-6;
A = 9.0;
B = 10.0;
C = 3.2;
D = 0.3;
E = -3.0;
i, n : IntType;
x,y,x0,y0 : RealType;
F,F1,dx : ArrayType;
Yacobi : MatrixType;
Flag : BoolType;
ff : Text;
Function FunF(x,y: Real): RealType;
{Вычисление значения функции F(x,y)}
FunF:= A*x*x + B*y*y - 1;
End;
Function FunG(x,y: Real): RealType;
{Вычисление значения функции G(x,y)}
FunG:= Sin(C*x + D*y) - E*x;
End;
Function DivFx(x,y: Real): RealType;
{Вычисление значения производной функции dF(x,y)/dx}
DivFx:= 2*A*x;
End;
Function DivFy(x,y: Real): RealType;
{Вычисление значения производной функции dF(x,y)/dy}
DivFy:= 2*B*y;
End;
Function DivGx(x,y: Real): RealType;
{Вычисление значения производной функции dG(x,y)/dx}
DivGx:= C*Cos(C*x+D*y) - E;
End;
Function DivGy(x,y: Real): RealType;
{Вычисление значения производной функции dG(x,y)/dy}
DivGy:= D*Cos(C*x+D*y);
End;
{ГОЛОВНАЯ ПРОГРАММА}
ClrScr; {Очистка экрана}
Assign(ff, NameOut);
ReWrite(ff);
Write ('Введите начальное приближение к корню x:');
ReadLn(x0);
WriteLn(ff, 'Начальное приближение x= ',x0);
WriteLn(ff,' ');
WriteLn;
Write ('Введите начальное приближение к корню y:');
ReadLn(y0);
WriteLn(ff, 'Начальное приближение y= ',y0);
WriteLn(ff,' ');
WriteLn;
x:= x0; y:= y0;
n:=0; {Начальное число итераций}
Flag:=true; {Флажок= Истина}
{Вычисление функции}
F[1]:= FunF(x,y);
F[2]:= FunG(x,y);
{Вычисление Якобиана}
Yacobi[1,1]:= DivFx(x,y);
Yacobi[1,2]:= DivFy(x,y);
Yacobi[2,1]:= DivGx(x,y);
Yacobi[2,2]:= DivGy(x,y);
WriteLn(ff, 'x=',x:15:7,' y=',y:15:7,
' f(x,y)=', F[1]:15:7,' g(x,y)=', F[2]:15:7);
WriteLn('x=',x:15:7,' y=',y:15:7,
' f(x,y)=', F[1]:15:7,' g(x,y)=', F[2]:15:7);
{Вычисление корней (приращений) по методу Крамера: через определитель}
dx[1]:= (-F[1]*Yacobi[2,2]+F[2]*Yacobi[1,2])
/(Yacobi[1,1]*Yacobi[2,2]-Yacobi[2,1]*Yacobi[1,2]);
dx[2]:= (-Yacobi[1,1]*F[2]+F[1]*Yacobi[2,1])
/(Yacobi[1,1]*Yacobi[2,2]-Yacobi[2,1]*Yacobi[1,2]);
x:= x+dx[1];
y:= y+dx[2];
{Новые значения функции}
F1[1]:= FunF(x,y);
F1[2]:= FunG(x,y);
{Вычисление погрешности}
For i:=1 to 2 do
if(Abs(F1[i]-F[i]) > Eps) Then Flag:= False;
{Если погрешность велика, то Флажок = Ложь}
n:=n+1; {Определение количества итераций}
Until Flag or (n > 100);
WriteLn(ff,'Расчет oкончен');
WriteLn(ff,' ');
WriteLn('Расчет oкончен');
WriteLn;
WriteLn(ff, 'Количество итераций, n=',n:10);
WriteLn('Количество итераций, n=',n:10);
Close(ff);
WriteLn (' ДЛЯ ПРОДОЛЖЕНИЯ НАЖМИТЕ ЛЮБУЮ КЛАВИШУ!!!');
Repeat Until KeyPressed; {Ожидает нажатия любой клавиши, модуль Crt}
{Используется для задержки информации на экране}
ClrScr;{Очищает экран, модуль Crt}
В практике вычислений функция действительной переменной часто задается в виде таблицы значений функции при фиксированных значениях аргумента. Эта таблица может быть получена либо в результате расчета «трудно вычислимой» функции, либо в результате эксперимента. Требуется определить значение функции, не совпадающие со значениями, заданными в таблице. Для этого исходную функцию заменяем другой, достаточно близкой к исходной. Аналогичная задача возникает, если исходная функция представляет собой экспериментальную кривую. Данная задача может быть решена методами интерполяции и аппроксимации. В случае интерполяции подобранная функция называется интерполирующей и проходит через все заданные точки, называемые узлами интерполяции. Во втором случае аппроксимирующая функция может и не проходить через узловые точки. В качестве аппроксимирующей функции могут использоваться как простейшие формулы (эмпирические) с двумя или тремя параметрами (линейная, показательная, логарифмическая и др. функции), так и многочлен (полином) определенной степени. Неизвестные параметры эмпирических формул и коэффициенты многочлена могут определяться методом выбранных точек, методом средних или методом наименьших квадратов.
При использовании метода наименьших квадратов аппроксимирующая функция дает наиболее вероятные значения искомой функции.