Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Итерационный способ вычисления интерполяционного полинома




End.

Begin

Begin

Begin

Begin

Begin

Begin

Begin

Case l of

Begin

Begin

Begin

Begin

Begin

Begin

Begin

Begin

Begin

Implementation

Interface

Пример.

Unit Splin;

{$N+ $E+}

Uses Rtype;

Const Nmax = 50;

Type RealType = Extended;

Vect = Array [1..Nmax] of RealType;

Type SplineInterpolate = object

N1: Integer;

X, Y, M: Vect;

Constructor Init;

procedure Input; Virtual;

procedure NDotSpline(NNN:Integer);

procedure CalculateSpline;

function Interpolate(XX:RealType): RealType;

procedure Output; Virtual;

function GetX(I:Integer): RealType;

function GetY(I:Integer): RealType;

Destructor Done;

end; (* Object SplineInterpolate *)

constructor SplineInterpolate.Init;

Var i: Integer;

for i:=1 to Nmax do X[i]:=0;

for i:=1 to Nmax do Y[i]:=0;

for i:=1 to Nmax do M[i]:=0;

end;

Procedure SplineInterpolate.Input;

Var i: Integer;

WriteLn(' Кубическая сплайн интерполяция-экстраполяция...');

WriteLn(' ===============================================');

WriteLn;

WriteLn('Введите число точек интерполяции N: ');Read(N1);

for i:= 1 to N1 do

WriteLn(' X[',I:2, '], Y[', I:2, '] = '); Read(X[i], Y[i]);

end;

end; (* SplineInterpolate.Input *)

Procedure SplineInterpolate.NDotSpline(NNN:Integer);

N1:=NNN;

end; (* SplineInterpolate.NDotSpline *)

procedure SplineInterpolate.CalculateSpline;

Var R, S, L: Vect;

H, D, F, E, P: RealType;

k: Integer;

D:=X[2]-X[1]; E:=(Y[2]-Y[1])/D;

L[1]:=0; L[N1]:=0; R[1]:=0; R[N1]:=0; S[1]:=0; S[N1]:=0;

for k:=2 to N1-1 do

H:=D; D:=X[k+1]-X[k];

F:=E; E:=(Y[k+1]-Y[k])/D; L[k]:=D/(D+H);

R[k]:=1-L[k]; S[k]:=6*(E-F)/(H+D);

end; (* for *)

for k:=2 to N1-1 do

P:=1/(R[k]*L[k-1]+2); L[k]:=-L[k]*P;

S[k]:=(S[k]-R[k]*S[k-1])*P;

end; (* for *)

M[N1]:=0; L[N1-1]:=S[N1-1];

M[N1-1]:=L[N1-1];

for k:=N1-2 downto 1 do

L[k]:=L[k]*L[k+1]+S[k]; M[k]:=L[k];

end; (* for *)

end; (* Spline.CalculateSpline *)

function SplineInterpolate.Interpolate(XX:RealType): RealType;

Var l, i, j: Integer;

YY, D, H, P, R: RealType;

if XX <= X[1] then l:=-1 else if XX > X[N1] then l:=1 else l:=0;

D:=X[N1]-X[N1-1];

YY:=D*M[N1-1]/6+(Y[N1]-Y[N1-1])/D;

YY:=YY*(XX-X[N1-1])+Y[N1-1];

end;

{i:=1; while XX > X[i] do i:=i+1;}

j:=1; i:=N1;

While j < i-1 do if XX >= X[Trunc((i+j)/2)] then j:=Trunc((i+j)/2)

else i:=Trunc((i+j)/2);

j:=i-1; D:=X[i]-X[j]; H:=XX-X[j]; R:=X[i]-XX;

P:=D*D/6; YY:=(M[j]*R*R*R+M[i]*H*H*H)/6/D;

YY:=YY+((Y[j]-M[j]*P)*R+(Y[i]-M[i]*P)*H)/D;

end;

-1: begin

D:=X[2]-X[1]; YY:=-D*M[2]/6+(Y[2]-Y[1])/D;

YY:=YY*(XX-X[1])+Y[1];

end;

end; (* case *)

Interpolate:=YY;

end; (* Spline.Interpolate *)

procedure SplineInterpolate.Output;

Var XX:RealType;

Write(' XX: '); Read(XX); WriteLn(Interpolate(XX):5:5);

end;

function SplineInterpolate.GetX(I:Integer): RealType;

GetX:=X[I];

end;

function SplineInterpolate.GetY(I:Integer): RealType;

GetY:=Y[I];

end;

Destructor SplineInterpolate.Done;

end;

3.2.13. Кривые Безье. сплайны

Важной задачей в машинном проектировании является функциональное описание кривой (или поверхности), заданной графически. Введем множества функций, называемых базисными функциями Бернштейна. Предположим, что все точки данных находятся в интервале . Тогда я базисная функция Бернштейна является полиномом степени вида

.

Например, для четыре кубические функции базиса Бернштейна имеют вид

На самом деле для вычисления значения берншейновской базисной функции в точке определение не применяют. Вместо этого используют рекуррентные формулы

,

которые менее чувствительны к ошибкам округления.

Поскольку каждая функция представляет собой полином степени , то и их линейная комбинация

является таким же полиномом.

Основная идея – определение графически. С этой целью ставят в соответствие каждому на плоскости точку , которая называется управляющей точкой, при этом . По этим точкам строят ломаную Безье.

Одна трудность, связанная с этим подходом, состоит в том, что невозможно сдвигать управляющие точки вправо или влево. Как только выбрано , точки фиксируются. Чтобы обеспечить такую возможность, сделаем обобщение. Пусть - точка на плоскости; определить векторную кривую Безье

.

Когда изменяется от до , кривая описывает траекторию на плоскости, начинающуюся в и кончающуюся в . В этом варианте могут быть произвольными точками, т. е. - это просто параметр, изменяющийся вдоль кривой.

Для многих приложений полезно уметь записывать интерполянт в виде линейной комбинации функций, которые сами являются сплайнами - это сплайны (кусочно-полиномиальная функция с двумя непрерывными производными).

Коэффициенты при сплайнах имеют физическое значение, аналогичное коэффициентам кривой Безье.

(способ Эйткена)

Для линейного интерполирования имеем

(*)

В случае, когда точность линейной интерполяции недостаточна, необходимо повышать степень интерполяционного многочлена, привлекая большее число значений .

В частности, интерполяционный многочлен второй степени, проходящий через точки , может быть вычислен по формуле

, (**)

где и определены по (*).

Многочлен третьей степени, проходящий через точки , определяется аналогичной формулой

. (***)

Интерполяционный многочлен й степени, принимающий в точках соответственно табличные значения , определяется формулой

. (****)

Это и есть итерационный способ Эйткена.




Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 399; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.017 сек.