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

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}

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

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




double arrow
Сейчас читают про: