Листинг программы на Delphi
Приложение
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TeEngine, Series, StdCtrls, ExtCtrls, TeeProcs, Chart;
type
TForm1 = class(TForm)
Chart1: TChart;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Series1: TLineSeries;
Series2: TLineSeries;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// 1 способ
procedure TForm1.Button1Click(Sender: TObject);
var
n, i, z, l: integer;
k, g:real;
a, b, y: real;
p, v, u: real;
m, ml: array of real;
myFile:TextFile;
begin
assignfile(myFile,'1.txt');
rewrite(myFile);
Series1.Clear; // очищаем серию от занесенных ранее данных
Series2.Clear;
n:=strtoint(Edit1.text);
a:=strtofloat(Edit2.text);
b:=strtofloat(Edit3.text);
setlength(m,n+1);
setlength(ml,n+1);
k:=(b-a)/n;
m[0]:=a;
m[n]:=b;
ml[0]:=cos((1+16*a*a)/(1+16*a*a*a*a)) + sin((1+16*a*a*a*a)/(1+16*a*a*a*a*a*a));
ml[n]:=cos((1+16*b*b)/(1+16*b*b*b*b)) + sin((1+16*b*b*b*b)/(1+16*b*b*b*b*b*b));
for i:=1 to n-1 do
begin
m[i]:=m[i-1]+k; // Узлы интерполяции
ml[i]:=cos((1+16*m[i]*m[i])/(1+16*m[i]*m[i]*m[i]*m[i])) + sin((1+16*m[i]*m[i]*m[i]*m[i])/(1+16*m[i]*m[i]*m[i]*m[i]*m[i]*m[i])); // Заполняем массив значений функции в узлах
end;
k:=k/26; //Шаг Деления
g:=a;
for i:=0 to n*26 do
begin
y:=cos((1+16*g*g)/(1+16*g*g*g*g))+sin((1+16*g*g*g*g)/(1+16*g*g*g*g*g*g));
p:=0;
for z:=0 to n do
begin
u:=1;
|
|
v:=1;
for l:=0 to n do
if z<>l then
begin
u:=u*(g-m[l]);
v:=v*(m[z]-m[l]);
end;
p:=p+ml[z]*u/v; //Вычисление интерполяционного многочлена
end;
write(myFile,'y= ');
write (myFile,y);
write (myFile,' pn= ');
writeln (myFile,p);
Series1.AddXY(g,y,'',$00C08000);
Series2.AddXY(g,p,'',$004080FF);
g:=g+k;
end;
closefile(myFile);
end;
// 2 способ
procedure TForm1.Button2Click(Sender: TObject);
var
n, i, z, l: integer;
k, g:real;
a, b, y: extended;
t, p: extended;
m, ml: array of extended;
myFile:TextFile;
begin
assignfile(myFile,'1.txt');
rewrite(myFile);
Series1.Clear;
Series2.Clear;
n:=strtoint(Edit1.text);
a:=strtofloat(Edit2.text);
b:=strtofloat(Edit3.text);
setlength(m,n+1);
setlength(ml,n+1);
k:=(b-a)/n;
m[0]:=a;
m[n]:=b;
ml[0]:=cos((1+16*a*a)/(1+16*a*a*a*a)) + sin((1+16*a*a*a*a)/(1+16*a*a*a*a*a*a));
ml[n]:=cos((1+16*b*b)/(1+16*b*b*b*b)) + sin((1+16*b*b*b*b)/(1+16*b*b*b*b*b*b));
for i:=1 to n-1 do
begin
m[i]:=m[i-1]+k;
ml[i]:=cos((1+16*m[i]*m[i])/(1+16*m[i]*m[i]*m[i]*m[i])) + sin((1+16*m[i]*m[i]*m[i]*m[i])/(1+16*m[i]*m[i]*m[i]*m[i]*m[i]*m[i]));
end;
k:=k/26; g:=a;
for i:=0 to n*26 do
begin
y:=cos((1+16*g*g)/(1+16*g*g*g*g))+sin((1+16*g*g*g*g)/(1+16*g*g*g*g*g*g));
p:=0;
for z:=0 to n do
begin
t:= 1;
for l:=0 to n do
if z<>l then
begin
t:=t* ((g-m[l]) / (m[z]-m[l]));
end;
p:=p+t*ml[z];
end;
write(myFile,'y= ');
write (myFile,y);
write (myFile,' pn= ');
writeln (myFile,p);
Series1.AddXY(g,y,'',$00C08000);
Series2.AddXY(g,p,'',$004080FF);
g:=g+k;
end;
closefile(myFile);
end;
end.
Вывод:
При увеличении степени интерполяционного многочлена Лагранжа сходимость к исходной функции наблюдается только при относительно малых n (независимо от способа вычислений). Использование многочлена Лагранжа на всем отрезке [ a, b ] с большим числом узлов интерполяции приводит к неточному приближению из-за сильного накопления погрешностей. Так же использование 1 способа для построения многочлена Лагранжа дает нам неощутимо более точный результат, чем использование 2 способа.
Используемая литература:
Волков Е.А. Численные методы. М.:Наука. Главная редакция физ.-мат. Литературы, 1982.-256 с.
Гудович Н.Н. Интерполяция алгебраическими многочленам. Многочлен Лагранжа, 2002 1-3c.
|
|