Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Interpolyatsiya_funktsiy_splaynami.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
157.51 Кб
Скачать

3. Реалізація інтерполяції функції сплайнами за допомогою мови програмування object pascal

3.1. Лінійна інтерполяція

Для вирішення системи лінійних алгебраїчних рівнянь використовувалась алгоритмічна мова Паскаль.

program Spline;

uses Crt, Graph;

{ Структура, що описує сплайн на кожному сегменті сітки}

type SplineTuple=record

a, b, c, d, x:real;

end;

const

n_max=100; {Максимальний розмір масиву}

var

Gd,Gm: integer; {Графічний драйвер і мод}

PathToDriver: string;

splines: array[0..n_max-1] of SplineTuple; {Сплайн}

x,y: array[0..n_max-1] of real;

cur_x: real;

n:integer;

{ Побудова сплайна }

{x – вузли сітки, впорядковані за зростанням }

{y – значення функції у вузлах сітки }

{n – кількість вузлів сітки }

Procedure BuildSpline;

var i:integer;

alpha:array[0..n_max-1] of real;

beta:array[0..n_max-1] of real;

h_i:real;

h_i1:real;

A:real;

C:real;

B:real;

F:real;

z :real;

begin

{ Ініціалізація масиву сплайнів}

for i:=0 to n-1 do

begin

splines[i].x := x[i];

splines[i].a := y[i];

end;

splines[0].c:=0;

splines[n – 1].c:=0;

{ Рішення системи лінійних рівнянь щодо коефіцієнтів сплайнів }

{ Обчислення прогоночних коефіцієнтів - прямий хід методу }

alpha[0]:=0;

beta[0] :=0;

for i:=1 to n-2 do

begin

h_i := x[i] – x[i – 1];

h_i1:= x[i + 1] – x[i];

A:= h_i;

C:= 2.0 * (h_i + h_i1);

B:= h_i1;

F:= 6.0 * ((y[i + 1] – y[i]) / h_i1 – (y[i] – y[i – 1]) / h_i);

z:= (A * alpha[i – 1] + C);

alpha[i]:= -B / z;

beta[i]:= (F – A * beta[i – 1]) / z;

end;

{ Знаходження рішення - зворотний хід методу прогонки }

for i:=n-2 downto 1 do

splines[i].c := alpha[i] * splines[i + 1].c + beta[i];

{По відомим коефіцієнтам c[i] знаходимо значення b[i] i d[i]}

for i:=n-1 downto 1 do

begin

h_i:= x[i] – x[i – 1];

splines[i].d:= (splines[i].c – splines[i – 1].c) / h_i;

splines[i].b:= h_i * (2.0 * splines[i].c + splines[i – 1].c) / 6.0 + (y[i] – y[i – 1]) / h_i;

end;

end;

{ Обчислення значення інтерполяційної функції у довільній точці}

function Func(x:real):real;

var

s:SplineTuple;

i,j,k:Integer;

dx:real;

begin

if (x <= splines[0].x) then

{Если x меньше точки сетки x[0]}

s := splines[1]

else if (x >= splines[n – 1].x) then

{ Якщо x більше точки сітки x [n - 1] - користуємося останнім елементом масиву}

s := splines[n – 1]

else { Інакше x лежить між граничними точками сітки, то виробляємо бінарний пошук потрібного елемента масиву}

begin

i:= 0;

j:= n – 1;

while (i + 1 < j) do

begin

k:= i + (j – i) div 2;

if (x <= splines[k].x) then

j:= k

else

i:= k;

end;

s := splines[j];

end;

dx:= (x – s.x);

{ Обчислення значення сплайна в заданій точці за схемою Горнера}

Func:=s.a + (s.b + (s.c / 2.0 + s.d * dx / 6.0) * dx) * dx;

end;

begin

ClrScr;

Gd:=Detect;

Gm:=0;

PathToDriver:='';

InitGraph(gd,gm,PathToDriver); {Ініціалізуємо графіку}

if GraphResult<>grok then halt;

n:=16;

x[0]:=0;y[0]:=260;

x[1]:=20;y[1]:=260;

x[2]:=40;y[2]:=300;

x[3]:=60;y[3]:=270;

x[4]:=80;y[4]:=330;

x[5]:=100;y[5]:=230;

x[6]:=120;y[6]:=250;

x[7]:=140;y[7]:=220;

x[8]:=160;y[8]:=210;

x[9]:=180;y[9]:=170;

x[10]:=200;y[10]:=150;

x[11]:=220;y[11]:=230;

x[12]:=240;y[12]:=180;

x[13]:=260;y[13]:=190;

x[14]:=280;y[14]:=220;

x[15]:=300;y[15]:=150;

BuildSpline;

cur_x:=100;

MoveTo(Round(cur_x),Round(Func(cur_x)));

while (cur_x<300) do

begin

cur_x:=cur_x+0.1;

LineTo(Round(cur_x),Round(Func(cur_x)));

MoveTo(Round(cur_x),Round(Func(cur_x)));

end;

ReadKey;

CloseGraph;

END.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]