Логинов А.С

Листинг программы на 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.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



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