Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3_теориЛеготкина / Копия Агентство по образованию РФ

.doc
Скачиваний:
23
Добавлен:
09.12.2013
Размер:
81.41 Кб
Скачать

Агентство по образованию РФ

Пермский Государственный Технический университет

Кафедра АТ

Лабораторная работа № 1

Построение полиномов с помощью метода Лагранжа и построения сплайна.

Выполнила студентка группы

КРЭС – о5 Ошева Дарья

Проверила преподаватель

Леготкина Т.С.

Пермь 2007

Задание: с помощью метода Лагранжа и построения сплайна построить полином с заданными координатами точек y[0]:=0; y[1]:=2; y[2]:=0; y[3]:=-1; y[4]:=0; y[5]:=1; y[6]:=0; y[7]:= -2; y[8]:=0;

Сравнить, какой из методов более точный.

Алгоритм:

1. напишем программу в среде TurboPascal, где опишем метод Лагранжа

2. напишем программу в среде TurboPascal, где опишем метод сплайна

3. совместим оба метода на одном графике и сравним на точность

4. сделаем вывод

Листинг программы

uses graph, crt;

const

N =8;

x:array [0..N] of real =(-4, -3, -2, -1, 0, 1, 2, 3, 4);

y:array [0..N] of real =(0, 2, 0, -1 ,0 ,1 , 0, -2, 0);

var

m, h, g, f:array[0..n] of real;

a, b, c, d:array[1..n] of real;

lk: array[0..N] of real;

w, i, j: word;

kx: real;

ky: real;

xx: real;

xh: real;

xC, yC: word;

procedure InitScreen;

var

gm, gd, errorcode: integer;

begin

gd := VGA; gm := VGAHi;

initgraph( gd, gm, 'c:\bp\bgi');

ClearViewPort;

xC:=Round(getmaxx/2); yC:=Round(getmaxy/2);

kx :=getmaxx/(x[n]-x[0]);

ky :=getmaxx/(x[n]-x[0]);

SetColor(White);

Line(xC, 0, xC, getmaxy);

Line(0, yC, getmaxx, yC);

SetLineStyle(DottedLn, 0, NormWidth);

SetColor(LightGray);

i:=xC;

j:=xC;

while i<=getmaxx do begin

i:=Round(i+kx);

j:=Round(j-kx);

Line(i, 0, i, getmaxy);

Line(j, 0, j, getmaxy);

end;

i:=yC;

j:=yC;

while i+ky<=getmaxy do begin

i:=Round(i+ky);

j:=Round(j-ky);

Line(0, i, getmaxx, i);

Line(0, j, getmaxx, j);

end;

end;

function L(xx: real):real;

var

i, j: word;

sum, Pn1: real;

begin

sum := 0;

for i := 0 to n do begin

Pn1 := 1;

for j := 0 to n do begin

if j <> i then Pn1 := Pn1 * (xx-x[j]);

end;

sum := sum + lk[i]*Pn1;

end;

L:= sum;

end;

function Spline(xx:real): real;

var

i: word;

begin

if (xx < x[0]) or (xx > x[n]) then begin

Spline:=0;

exit;

end;

i := 1;

while xx > x[i] do i:=i+1;

Spline:= a[i]*(x[i]-xx) * (x[i]-xx) * (x[i]-xx) +

b[i]*(xx-x[i-1])*(xx-x[i-1])*(xx-x[i-1]) +

c[i]*(x[i]-xx) + d[i]*(xx-x[i-1]);

end;

procedure PrintSpline;

var

i: word;

begin

WriteLn('Полученные сплайны:');

for i:=1 to n do begin

WriteLn(a[i]:2:2, '*(', x[i]:2:2, ' - x)^3 + ', b[i]:2:2, '*(x - ',

x[i-1]:2:2, ')^3 + ', c[i]:2:2, '*(', x[i]:2:2, ' - x) + ',

d[i]:2:2, '*(x - ', x[i-1]:2:2, ')');

end;

end;

begin

for i := 0 to n do begin

lk[i] := y[i];

for j := 0 to n do begin

if j <> i then lk[i] := lk[i]/(x[i]-x[j]);

end;

end;

for i:=1 to n do

h[i]:= x[i] - x[i-1];

g[1]:= 2*(h[1] + h[2]);

f[1]:= 6*((y[2] - y[1])/h[2] - (y[1] - y[0])/h[1]);

for i:= 2 to n-1 do begin

g[i]:= 2*(h[i] + h[i+1])-sqr(h[i])/g[i-1];

f[i]:= 6*((y[i+1]-y[i])/h[i+1]-(y[i]-y[i-1])/h[i])-f[i-1]*h[i-1]/g[i-1];

end;

m[n-1] := f[n-1]/g[n-1];

for i:=n-2 downto 1 do

m[i] := (f[i] - h[i+1]*m[i+1])/g[i];

for i:=1 to n do begin

a[i] := m[i-1]/(6*h[i]);

b[i] := m[i] / (6*h[i]);

c[i] := (y[i-1] - 1/6 * m[i-1]*sqr(h[i]) ) / h[i];

d[i] := (y[i] - 1/6 * m[i] * sqr(h[i]) ) / h[i];

end;

InitScreen;

xh:=(x[n]-x[0])/getmaxx;

SetLineStyle(SolidLn, 0, NormWidth);

SetColor(blue);

moveto(0, yC);

xx:=x[0];

while xx<=x[n] do begin

lineto(Round(xC+xx*kx), Round(yC-Spline(xx)*ky));

xx:=xx+xh

end;

SetColor(red);

moveto(0, yC);

xx:=x[0];

while xx<=x[n] do begin

lineto(Round(xC+xx*kx), Round(yC-L(xx)*ky));

xx:=xx+xh

end;

SetColor(White);

for i:=0 to n do

Circle(Round(xC+x[i]*kx), Round(yC-y[i]*ky), 3);

readkey;

closegraph;

clrscr;

PrintSpline;

readkey;

clrscr;

end.

Вывод: по графику видно, что полином, построенный методом сплайна, раскачивается больше, чем полином, построенный методом Лагранжа, поэтому делаем вывод, что метод Лагранжа точнее.

Соседние файлы в папке 3_теориЛеготкина