Далее займемся отысканием наилучшего приближения.
Разложим функцию
В дальнейшем для сокращения записи будем пользоваться определением скалярного произведения в пространстве функций
Подставляя (3.7) в условие (3.6), получим
Дифференцируя это выражение по
Определитель этой системы есть определитель Грама функций
При использовании ортонормированной системы функций
т.е.
Доказано, что в любом линейно нормированном пространстве при линейной аппроксимации вида (3.4) наилучшее приближение существует, хотя оно может быть не единственным.
В тех случаях, когда функции
В качестве
Рассмотрим частный случай, когда необходимо найти наилучшее приближение функции, заданной таблично. Для вещественных функций, заданных на конечном множестве точек, скалярное произведение определяется формулой
где
Условие наилучшего среднеквадратичного приближения записывается следующим образом:
Полагая
Наиболее употребительный вариант метода наименьших квадратов соответствует случаю степенного вида функций
Система уравнений (3.8) при этом принимает вид
где
3.5 Схема алгоритма
Рис. 3.1 Основная программа
Рис. 3.2 Процедура ввода данных
Рис 3.3 Процедура среднеквадратичного приближения
program srpribl; {$R+}
uses graph;
label 1,2,3,4;
const m=2;
type mas= array [1..21] of real;
mas1= array [1..m] of real;
mas2= array [1..m,1..m+1] of real;
var i,j:byte;
y1,x1:mas;
xx1:mas1;
a1:mas2;
procedure vvod (x,y: mas);
begin
x[1]:=0;y[1]:=0.290234387293458; x[2]:=0.25;y[2]:=0.201247759722173;
x[3]:=0.5;y[3]:=0.0712686786428094;x[4]:=0.75; y[4]:=0.044294935464859;
x[5]:=1;y[5]:=-0.0745576142333448; x[6]:=1.25;y[6]:=-0.0807833694852889;
x[7]:=1.5;y[7]:=-0.233371530473232;x[8]:=1.75;y[8]:=-0.283957027737051;
x[9]:=2;y[9]:=-0.308697660081089;x[10]:=2.25;y[10]:=-0.42091366359964;
x[11]:=2.5;y[11]:=-0.516991161741316;x[12]:=2.75;y[12]:=-0.427710095947851;
x[13]:=3;y[13]:=-0.374748698528856;x[14]:=3.25;y[14]:=-0.229905794281513;
x[15]:=3.5;y[15]:=-0.205365492492496639;x[16]:=3.75;y[16]:=-0.129155068378896;
x[17]:=4;y[17]:=-0.0438349825330079;x[18]:=4.25;y[18]:=0.0294586319476366;
x[19]:=4.5;y[19]:=0.132592592108995;x[20]:=4.75;y[20]:=0.206369574274868;
x[21]:=5;y[21]:=0.26959548862651;
end;
procedure srpribl (xx:mas1;a:mas2);
var l:real;
s,z,k1:integer;
begin
for s:=1 to m-1 do
for z:=s+1 to m do
begin
a[z,s]:=-a[z,s]/a[s,s];
for k1:=s+1 to m+1 do a[z,k1]:=a[z,k1]+a[z,s]*a[s,k1]
end;
xx[m]:=a[m,m+1]/a[m,m]; writeln(' xx[',m,']=',xx[m]:2:3);
for i:=m-1 downto 1 do
begin
l:=a[i,m+1];
for j:=i+1 to m do l:=l-xx[j]*a[i,j];
xx[i]:=l/a[i,i]; writeln(' xx[',i,']=',xx[i]:2:3)
end
end;
procedure Grafik (var x,y:mas;xx:mas1)
var ec,gd,gm:integer;
begin
gd:=detect;
initgraph (gd,gm,' ');
ec:=graphresult;
if ec<>grok then begin
writeln ('Oshibka v inicializacii grafika');
halt (1);
end;
setcolor(white);
line (0,420,620,420);
line (0,0,0,420);
setcolor (white);
for i:=1 to 21 do begin
circle (round (x[i]*150),round (y[i]*100),1);
end;
setcolor (yellow);
for i:=1 to m do begin
circle (round (x[i]*150),round (xx[i]*100),1);
end;
setcolor (green);
for i:=2 to m do begin
line (round (x[i-1]*150),round(xx[i-1]*100),round (x[i]*150),
round (xx[i]*100));
end;
end;
begin
vvod(x1,y1);
for i:=1 to 2 do
for j:=1 to 3 do a[i,j]:=0;
a[1,1]:=21;
for i:=1 to 21 do
begin
a[1,2]:=a[1,2]+x[i];
a[2,1]:=a[2,1]+x[i];
a[2,2]:=a[2,2]+x[i]*x[i];
a[1,3]:=a[1,3]+y[i];
a[2,3]:=a[2,3]+y[i]*x[i]
end;
srpribl(xx1,a1);
for i:=1 to 21 do
writeln(y[i]:2:3,' ',xx[1]+xx[2]*x[i]:2:3);
Grafik(x1,y1,xx1);
end.
3.7 Тестовый пример
Найти тригонометрический многочлен наилучшего среднеквадратичного приближения наименьшей степени со среднеквадратичным отклонением меньшим
Введем функцию
Вычислим коэффициенты Фурье
Вычислим частичные суммы ряда Фурье
Вычислим среднеквадратичное отклонение
Найдем минимальное
Следовательно многочлен степени
Построим график среднеквадратичного отклонения
Найдем минимальное