Нахождение приближающей функции в виде квадратичной функции

Рассмотрим приближающую функцию в виде F(x,a,b,с) = ax2+bx+c.

Наша задача – отыскать значения параметров a, b и c.

Рассмотрим функцию .

Задача сводится к отысканию минимума функции Ф(a,b,c). Используем необходимое условие экстремума: ; ; .

Учитывая, что , , , получим систему вида:

После дальнейших преобразований

Теперь, поделив уравнения системы на n и введя обозначения:

,

получим систему:

 

Программа нахождения уравнения регрессии в виде квадратного трехчлена методом наименьших квадратов:

program kvadr_regr;{ Уравнение регрессии y=ax^2+bx+c}

const p=30;

type matrix=array[1..3,1..3] of real;

var x,y: array [1..p] of real;

i,j,n: byte;

a,b,c,

s,y1,

Mx,My,Mxx,Mxy,Mxxxx,Mxxx,Mxxy: real;

det,detA,detB,detC : real;

ma:matrix;

{формирование матрицы их коэффициентов при a,b,c}

procedure matr;

begin

ma[1,1]:=Mxxxx; ma[1,2]:=Mxxx; ma[1,3]:=Mxx;

ma[2,1]:=Mxxx; ma[2,2]:=Mxx; ma[2,3]:=Mx;

ma[3,1]:=Mxx; ma[3,2]:=Mx; ma[3,3]:=1;

end;

{замена в матрице j-го столбца столбцом свободных членов}

procedure zamena(j:integer);

begin ma[1,j]:=Mxxy;

ma[2,j]:=Mxy;

ma[3,j]:=My;

end;

function determ(a:matrix):real;

begin

determ:=a[1,1]*a[2,2]*a[3,3]+a[1,2]*a[2,3]*a[3,1]+a[2,1]*a[3,2]*a[1,3]-(a[1,3]*a[2,2]*a[3,1]+a[1,2]*a[2,1]*a[3,3]+ a[2,3]*a[3,2]*a[1,1]);

end;

BEGIN Write('Введите N - число пар таблицы - ');

Readln(N);

Writeln('Введите попарно координаты точки X Y - ');

For i:=1 to n do readln(x[i],y[i]);

Mx:=0; Mxx:=0; Mxy:=0; Mxxxx:=0; Mxxx:=0; Mxxy:=0;

For i:=1 to n do

begin

Mx:=Mx+x[i]; My:=My+y[i];

Mxx:=Mxx+x[i]*x[i]; Mxy:=Mxy+x[i]*y[i];

Mxxx:=Mxxx+x[i]*x[i]*x[i];

Mxxy:=Mxxy+sqr(x[i])*y[i];

Mxxxx:=Mxxxx+sqr(sqr(x[i]));

end;

Mx:=Mx/n; Mxx:=Mxx/n; My:=My/n;

Mxy:=Mxy/n; Mxxxx:=Mxxxx/n;

Mxxx:=Mxxx/n; Mxxy:=Mxxy/n;

matr; det:=determ(ma);

matr; zamena(1); detA:=determ(ma);

matr; zamena(2); detB:=determ(ma);

matr; zamena(3); detC:=determ(ma);

a:=detA/det;

b:=detB/det;

c:=detC/det;

s:=0;

Writeln(' Y[i] Y1[i] (Y[i]-Y1[i])^2 S');

For i:=1 to n do

begin

y1:=a*x[i]*x[i]+b*x[i]+c;

s:=s+sqr(Y[i]-y1) ;

writeln(y[i]:10:6,y1:15:6,sqr(y[i]-y1):15:6,' s=',s:10:6)

end;

Writeln('S=',s:10:6);

Writeln('y=',a:10:6,'*x^2+',b:10:6,'*x+',c:10:6);

END.

 

Введите N - число пар таблицы - 10

Введите попарно координаты точки X Y -

0.6 1.9

0.7 2.3

0.8 2.2

0.9 2.8

0.5 1.8

1.1 3.1

1.0 2.9

0.4 1.7

0.2 1.2

1.2 4.0

Y[i] Y1[i] (Y[i]-Y1[i])^2 S

1.900000 1.923679 0.000561 s= 0.000561

2.300000 2.150211 0.022437 s= 0.022997

2.200000 2.407188 0.042927 s= 0.065924

2.800000 2.694609 0.011107 s= 0.077032

1.800000 1.727590 0.005243 s= 0.082275

3.100000 3.360782 0.068007 s= 0.150282

2.900000 3.012474 0.012650 s= 0.162932

1.700000 1.561945 0.019059 s= 0.181992

1.200000 1.321987 0.014881 s= 0.196873

4.000000 3.739535 0.067842 s= 0.264715

S= 0.264715

y= 1.522199*x^2+ 0.286469*x+ 1.203805