КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Ошибка интерполяции ⇐ ПредыдущаяСтр 2 из 2 Нас будет интересовать поведение максимального уклонения сплайна от интерполируемой функции в зависимости от максимального расстояния между соседними узлами интерполирования, т.е. зависимость величины от шага h, где . Известно, что если функция имеет четыре непрерывные производные, то для ошибки интерполяции определенным выше кубическим сплайном верна следующая оценка причем константа в этом неравенстве является наилучшей из возможных {Кубический интерполяционный сплайн}program Spline;uses crt; {модуль управления экраном}type vector=array [0..100] of real; {Нумеруем точки с нуля}var x,y,c:vector; x0,x9,h,x1,p,p1,p2,e:real; n,i:integer; function f(x:real):real; {функция варианта}begin f:=sqr(sqr(x))-5*sqr(x)-x+1;end; procedure Input (var n:integer; var x,y:vector); {Ввод исходных данных}var i:integer;begin writeln ('Введите границы по оси X для построения сплайна:'); read (x0,x9); writeln ('Введите шаг по X для построения значений сплайна:'); read (h); n:=round((x9-x0)/h+1); x[0]:=x0; y[0]:=f(x0); for i:=1 to n do begin {Вычислить значения функции} x[i]:=x[i-1]+h; y[i]:=f(x[i]); end;end; procedure Coeff(n:integer; var x,f,c:vector);{Вычисление коээфициентов сплайна}var i,j,m:integer; a,b,r:real; k:vector;begin {Прямой ход прогонки} k[1]:=0; c[1]:=0; for i:=2 to n do begin j:=i-1; m:=j-1; a:=x[i]-x[j]; b:=x[j]-x[m]; r:=2*(a+b)-b*c[j]; c[i]:=a/r; k[i]:=(3.0*((f[i]-f[j])/a-(f[j]-f[m])/b)-b*k[j])/r; end; {Обратный ход прогонки} c[n]:=k[n]; for i:=n-1 downto 2 do c[i]:=k[i]-c[i]*c[i+1];end; procedure Spl (n:integer; var x,f,c:vector; x1:real; var p,p1,p2:real);{Построение сплайна. x,f - исходные данные, c - вектор коэффициентов,наденный процедурой Coeff, x1 - значение x, для которого строим сплайн,p - значение сплайна в точке, p1,p2 - 1-я и 2-я производные}var i,j:integer; a,b,d,q,r:real;begin i:=1; while (x1>x[i]) and (i<>n) do i:=i+1; {Ищем номер соседнего узла} {Промежуточные переменные и коэффициенты} j:=i-1; a:=f[j]; b:=x[j]; q:=x[i]-b; r:=x1-b; p:=c[i]; d:=c[i+1]; b:=(f[i]-a)/q - (d+2*p)*q/3.0; d:=(d-p)/q*r; {Считаем значения сплайна и его производных:} p1:=b+r*(2*p+d); p2:=2*(p+d); p:=a+r*(b+r*(p+d/3.0))end; begin clrscr; {очистить экран} writeln ('Построение кубического интерполяционного сплайна'); writeln ('Функция Y(x)=x^4+5x^2-x+1'); Input (n,x,y); Coeff (n,x,y,c); {Нашли коэффициенты C с помощью прогонки} {Строим таблицу значений сплайна} writeln ('Значение X':19,'Функция':19,'Сплайн':19,'Отн.ошибка':19); for i:=0 to n do begin Spl (n,x,y,c,x[i],p,p1,p2); e:=abs(y[i]-p)/abs(y[i]); writeln (x[i]:19:8,y[i]:19:8,p:19:8,e:19:8); end;end.
|