Нахождение приближающей функции в виде квадратичной функции
Рассмотрим приближающую функцию в виде 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