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

3.2. Алгоритм побудови інтерполяційного кубічного сплайна

Нехай кожному значенню аргументу xi, i=0,...,n відповідають значення функції f(xi)=yi і потрібно знайти функціональну залежність у вигляді сплайна S3(x)=аi0 +аi1(x – xi)+аi2(x – xi)2 +аi3(x – xi)3, x[xi, xi+1] (1.1), задовольняє перерахованим нижче вимогам:

  1. функція S3(xi) неперервна разом зі своїми похідними до другого порядку включно;

  2. S3(xi)=yi, i=0,1,...,n;

  3. S"3(x0)=S"3(xn)=0.

Сформульована вище задача має єдине рішення.

Друга похідна S"3(x) неперервна і, як видно з виразу (1.1), лінійна на кожному відрізку [xi-1, xi], (i=1,...,n), тому подамо її у вигляді

, (1.2)

де hi = xi- xi-1 , mi= S"3(xi).

Інтегруючи обидві частини рівності (1.2), отримаємо

, (1.3)

де Ai и Bi – постійні інтегрування.

Нехай в (1.3) x=xi и x=xi-1, тоді використовуючи умови 2, отримаємо

, i=1,...,n.

З цих рівнянь знаходимо Ai і Bi, і остаточно формула (1.3) приймає вигляд

. (1.4)

З формули (1.4) знаходимо односторонні межі похідної в точках x1,x2 ,...,xn-1:

, (1.5)

. (1.6)

Прирівнюючи вирази (1.5) і (1.6) для i=1,...,n-1, отримаємо n-1 рівняння

(1.7)

з n-1 невідомими mi (i=1,...,n-1). згідно з умовою (1.2) m0=mn=0.

Система лінійних алгебраїчних рівнянь (1.7) має трьохдіагональну матрицю з діагональним переважанням. Такі матриці є неособливими. Тому невідомі m1 , m2 , ... , mn-1 знаходяться із системи (1.7) однозначно. Після визначення mi функція S3(x) відновлюється за формулою (1.4).

    1. . Метод прогонки

Нехай є система рівнянь, записана в матричному вигляді:

. (1.8)

У нашому випадку згідно (1.7)

Рішення системи шукається у вигляді

mi = i mi+1 + i , i=1,...,N-1, (1.9)

де Ai , Bi – прогоночні коефіцієнти. Використовуючи вираз для m i-1 із (1.9), виключимо це невідоме з i-го рівняння системи. отримуємо

(ai +ci i-1)mi + bi mi+1 = di -cii-1.

Порівнюючи це співвідношення з (1.9), виводимо рекурентні формули для прогоночних коефіцієнтів i, i (пряма прогонка):

0=0=0, . (1.10)

Очевидно, що mn-1=n-1 (при сn-1=0). Всі інші невідомі знаходимо за формулами (1.9), використовуючи вирази для прогоночние коефіцієнтів (1.10). Величини i і ai +cii-1 не залежать від правої частини системи. Тому якщо обчислити їх і запам'ятати, то для вирішення систем, що відрізняються тільки правими частинами, потрібно 5 (n-1) арифметичних операцій.

3.4. Код програми на Pascal

#include <iostream.h>

#include <math.h>

#include <conio.h>

#include<iomanip.h>

using namespace std;

const int N=5121;

int main()

{

cout.setf(ios::left);

int i, n;

double max,max2,dK,oc,x1,A,B,h,x[N],a[N],b[N],c[N],d[N],y[N],mu[N],m[N],S3[N];

A=0;

B=3.141592653589;

max=0;

max2=0;

cout<<" ================="<<endl;

cout<<" | n | max | d ocenka | dk |"<<endl;

cout<<" -----------------------------"<<endl;

for(n=5;n<=5120;n=2*n)

{

h=(B-A)/n;

for(i=0; i<=n; i++)

x[i]=A+i*h;

a[0]=a[n]=1;

b[0]=c[n]=0;

d[0]=-sin(A);

d[n]=-sin(B);

for(i=1; i<n; i++)

{

a[i]=2*h/3;

b[i]=h/6;

c[i]=h/6;

d[i]=(sin(x[i+1])-2*sin(x[i])+sin(x[i-1]))/h;

}

y[0]=-b[0]/a[0]; //прогоночні коефіціенти

mu[0]=d[0]/a[0]; // прогоночні коефіціенти

for(i=1; i<n; i++) //пряма прогонка

{

y[i]=-b[i]/(a[i]+c[i]*y[i-1]);

mu[i]=(d[i]-c[i]*mu[i-1])/(a[i]+c[i]*y[i-1]);

}

m[n]=mu[n];

for(i=n-1; i>0; i--)

m[i]=y[i]*m[i+1]+mu[i]; //Розв’язок системи

for(i=1; i<=n; i++) // Визначення кінцевої формули

{

x1=x[i-1]+h/2;

S3[i]=((x[i]-x1)*sin(x[i-1])+(x1-x[i-1])*sin(x[i]))/h+(pow((x[i]-x1),3)-

h*h*(x[i]-x1))*m[i-1]/(6*h)+(pow((x1-x[i-1]),3)-h*h*(x1-x[i-1]))*m[i]/(6*h);

}

max=fabs(S3[1]-sin(x[0]+h/2)); // максимальна похибка

for(i=1; i<=n; i++)

{

x1=x[i-1]+h/2;

if(fabs(S3[i]-sin(x1))>max) max=fabs(S3[i]-sin(x1));

}

if(n>5)

{

dK=max2/max;

oc=max2/16;

}

if(n==5)

cout<<" |"<<setw(8)<<n<<"|"<<setw(15)<<max<<"|"<<setw(15)<<"-

"<<"|"<<setw(15)<<"-"<<"|"<<endl;

if(n>5)

cout<<" |"<<setw(8)<<n<<"|"<<setw(15)<<max<<"|"<<setw(15)<<oc

<<"|"<<setw(15)<<dK<<"|"<<endl;

max2=max;

}

getch();

}

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