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