
- •Курсова робота
- •А) інтерполяція функцій сплайном третього порядку;
- •В) диференціювання на сітці, перехід від сітки до сітки.
- •1. Математичні основи інтерполяції функцій та сплайна
- •Загальні відомості про сплайни
- •Інтерполяція функцій
- •Інтерполяція функцій сплайном
- •2.1 Переваги та недоліки сплайн-інтерполяції, види та характеристики
- •2.2 Інтерполяція функції, заданої таблицею значень кубічними сплайнами (Реалізація Java)
- •3. Реалізація інтерполяції функції сплайнами за допомогою мови програмування object pascal
- •3.1. Лінійна інтерполяція
- •3.2. Алгоритм побудови інтерполяційного кубічного сплайна
- •. Метод прогонки
- •3.4. Код програми на Pascal
- •3.5. Інтерполяція сплайном Ерміта. Код програми на Delphi
- •Висновки
- •Список використаних джерел та літератури
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.