3_теориЛеготкина / выч методы / отчет по 1 лабе
.docПермский Государственный Технический Университет
Электротехнический факультет
Кафедра автоматики и телемеханики
Вычислительные методы.
Отчет по лабораторной работе №1.
Интерполирование функций.
Вариант №3.
Выполнил: студент гр. АТ-01-2
Лыткин П.В.
Проверил: Данилова С.А.
Пермь 2003 г.
Цель работы:
-
Научиться применять численные методы интерполяции функций, заданных таблично.
-
Изучить метод интерполирования функций с помощью кубических сплайн – функций.
Задано:
Задано множество вещественных абсцисс Х0, Х1, …, Хn и соответствующие координаты Y0, Y1, …, Yn. Здесь Х0< Х1< …< Хn, а каждое Yi – некоторое вещественное число, отвечающее Xi, определенное математически или являющееся результатом какого – либо наблюдения.
Задача одномерной интерполяции состоит в построении функции f(x), такой, что f(xi)=yi для всех i, т.е. нужно найти многочлен Pn(x) степени не выше n, значения которого в точках Xi (i=0,n) совпадают со значениями данной функции, т.е. Pn(xi)=yi. Многочлен Pn(x) является интерполяционным многочленом (полиномом), а точки xi являются узлами интерполяции.
Задана таблица:
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
xi |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
yi |
0 |
0 |
1 |
0 |
0 |
0 |
-1 |
0 |
0 |
Необходимо составить интерполяционный полином Лагранжа и Кубическую сплайн-функцию для нахождения аналитического выражения функции f(x), при этом на экран должны выводиться графики полинома Лагранжа и кубической сплайн - функции.
Интерполяционная формула Лагранжа.
Пусть xi (i=0,n) произвольные узлы, а yi=f(xi) – значение функции в узлах. Многочленом степени n, принимающем в точке xi значения yi, является интерполяционный многочлен Лагранжа
Сплайны:
Сплайном называется функция, которая вместе с несколькими производными непрерывна на заданном отрезке, а на каждом частичном отрезке является некоторым алгебраическим многочленом. Максимальная по всем частичным отрезкам степень многочленов называется степенью сплайна, а разность между степенью сплайна и порядком наивысшей непрерывной на заданном отрезке производной – дефектом сплайна.
На практике наиболее широкое применение получили сплайны третьей степени, имеющие на заданном отрезке непрерывную, по крайней мере, первую производную. Эти сплайны называются кубическими.
На участке [x0, xn] требуется найти функцию ф(х), удовлетворяющую следующим условиям:
1.Функция ф(х) на участке [x0, xn] должна быть непрерывна вместе со своими первой и второй производными.
2. На каждом участке [xi-1, xi] функция фi(х) должна описываться кубическим полиномом
aoi+a1i(x-xi-1)+a2i(x-xi-1)2+a3i(x-xi-1)3 x с[xi-1, xi];
фi(x)=
0, x ¢[ xi-1, xi] i=1,n
Общий сплайн
при х с[x1, xn].
-
Значения сплайна в узлах интерполяции равны значениям заданной функции, т.е. ф(хi)=yi , i=0,n.
Текст программы на языке Pascal:
Program Laba_1;
uses graph,crt;
const n=8;
var x,y:array[0..n]of real;
m:array[0..n]of real;
i,j,t,k,i1:integer;
u:real;
x0,y0:integer;
grDriver,grMode:integer;
key:boolean;
a,b,c,d,f,h,g:array [1..n] of real;
spl:array [0..1000] of real;
spline:array [0..n,1..2] of real;
function lagr(x1:real):real;
var i,j:integer;
ln,q,p:real;
begin
ln:=0;
for i:=0 to n do begin
q:=1;
p:=1;
for j:=0 to n do begin
if not (i=j) then p:=p*(x1-x[j]);
if not (i=j) then q:=q*(x[i]-x[j]);
end;
ln:=ln+y[i]*p/q;
end;
lagr:=ln;
end;
PROCEDURE Interval;
var l:integer;
begin
i:=1;
j:=n+1;
l:=1;
while l<=2 do
begin
k:=round(int((i+j)/2));
if u>=x[k] then i:=k else j:=k;
if j<=i+1 then else l:=l-1;
l:=l+1
end;
k:=j
end;
begin
for i:=0 to n do x[i]:=-4+i;
y[0]:=0;
y[1]:=0;
y[2]:=1;
y[3]:=0;
y[4]:=0;
y[5]:=0;
y[6]:=-1;
y[7]:=0;
y[8]:=0;
grDriver:=detect;
grMode:=detect;
initgraph(grDriver,grMode,'d:\bp\bgi');
setcolor(white);
line(320,0,320,480);
line(0,240,640,240);
line(120,237,120,243);
line(170,237,170,243);
line(220,237,220,243);
line(270,237,270,243);
line(370,237,370,243);
line(420,237,420,243);
line(470,237,470,243);
line(520,237,520,243);
line(317,190,323,190);
line(317,140,323,140);
line(317,90,323,90);
line(317,290,323,290);
line(317,340,323,340);
line(317,390,323,390);
m[0]:=0;
m[n]:=0;
i:=1;
while i<=n do
begin
h[i]:=x[i]-x[i-1];
i:=i+1
end;
g[1]:=2*(h[1]+h[2]);
f[1]:=6*((y[2]-y[1])/h[2]-(y[1]-y[0])/h[1]);
i:=2;
while i<=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[1])/h[i+1]-(y[i]-y[i-1])/h[i])-f[i-1]*h[i-1]/g[i-1];
i:=i+1
end;
m[n-1]:=f[n-1]/g[n-1];
j:=1;
while j<=n-2 do
begin
i:=n-1-j;
m[i]:=(f[i]-h[i+1]*m[i+1])/g[i];
j:=j+1
end;
i:=1;
while i<=n do
begin
a[i]:=m[i-1]/(6*h[i]);
b[i]:=m[i]/(6*h[1]);
c[i]:=(y[i-1]-1/6*m[i-1]*h[i])/h[i];
d[i]:=(y[i]-1/6*m[i]*sqr(h[i]))/h[i];
i:=i+1
end;
u:=x[0];
i1:=0;
repeat
interval;
f[k]:=a[k]*(x[k]-u)*sqr(x[k]-u)+b[k]*(u-x[k-1])*sqr(u-x[k-1])+c[k]*(x[k]-u)+d[k]*(u-x[k-1]);
spl[i1]:=f[k];
i1:=i1+1;
u:=u+0.1;
until u>=x[n];
j:=1;
for i:=0 to n do spline[i,j]:=x[i];
j:=2;
for i:=0 to n do spline[i,j]:=y[i];
k:=50;
x0:=320;
y0:=240;
moveto(x0+round(k*spline[0,1]),y0-round(k*spline[0,2]));
x0:=x0+round(k*spline[0,1]);
i:=0;
repeat
x0:=x0+round(0.1*k);
i:=i+1;
setcolor(red);
lineto(x0,y0-round(spl[i]*k));
until x0>=getmaxx div 2+round(k*spline[n,1]);
moveto(120,240);
for i:=120 to 520 do begin
t:=round(-200*(lagr(6.4*i/320-6.4))/4+240);
setcolor(green);
lineto(i,t);
key:=keypressed;
if key=true then begin closegraph;
halt;
end;
end;
readln;
closegraph;
end.
Графики полученных функций: