Аппроксимация данных методом наименьших квадратов

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}

 

В практике вычислений функция действительной переменной часто задается в виде таблицы значений функции при фиксированных значениях аргумента. Эта таблица может быть получена либо в результате расчета «трудно вычислимой» функции, либо в результате эксперимента. Требуется определить значение функции, не совпадающие со значениями, заданными в таблице. Для этого исходную функцию заменяем другой, достаточно близкой к исходной. Аналогичная задача возникает, если исходная функция представляет собой экспериментальную кривую. Данная задача может быть решена методами интерполяции и аппроксимации. В случае интерполяции подобранная функция называется интерполирующей и проходит через все заданные точки, называемые узлами интерполяции. Во втором случае аппроксимирующая функция может и не проходить через узловые точки. В качестве аппроксимирующей функции могут использоваться как простейшие формулы (эмпирические) с двумя или тремя параметрами (линейная, показательная, логарифмическая и др. функции), так и многочлен (полином) определенной степени. Неизвестные параметры эмпирических формул и коэффициенты многочлена могут определяться методом выбранных точек, методом средних или методом наименьших квадратов.

При использовании метода наименьших квадратов аппроксимирующая функция дает наиболее вероятные значения искомой функции.