Метод прогонки для трехдиагональных матриц, страница 5

float Ai[21],Bi[21],Ci[21];   //коэффициенты ai, bi, ci

float h;                      //шаг сетки

float n;                      //число отрезков

float d1;

//Функция sin(x)

float fn (float x) { return (sin(x)); }

//Производная функции sin(x)

float fsh (float x) { return (cos(x)); }

//Вычисление значений сплайна S(x)

float Sx (float x)

{

int i=int((x-A)/h);

return Ai[i]+Bi[i]*(x-Xi[i])+Ci[i]*(x-Xi[i])*(x-Xi[i]);

}

//Вычисление значений производной сплайна

float Sshx (float x)

{

int i=int((x-A)/h);

return Bi[i]+2*Ci[i]*(x-Xi[i]);

}

void main()

{

clrscr();

float Ti=0;                   //вспомогательная  переменная ti

//Инициализация начальных значений

A=0; B=2;                     //отрезок [0,2]

n=20;                         //число отрезков n

h=float(B-A)/n;               //шаг

d1=1;

//Создание интерполяционной таблицы

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

{

Xi[i] = A+i*h;

Yi[i] = fn(Xi[i]);

}

//Находим коэффициенты сплайна ai, bi, ci

//Расчет коэффициентов ai

for(i=0;i<=n;i++) Ai[i]=Yi[i];

//Расчет коэффициентов Bi и ci

Bi[0]=d1;

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

{

Bi[i+1]=2*(Yi[i+1]-Yi[i])/h-Bi[i];

Ci[i]=(Bi[i+1]-Bi[i])/(2*h);

}

Ci[n-1]=((Yi[n]-Yi[n-1])/(h*h))-Bi[n-1]/h;

Ci[n]=Ci[n-1];

Bi[n]=Bi[n-1]+2*Ci[n-1]*h;

//Вывод результатов на печать

printf("Значение функции f в точке x=%.2f равно %.5f\n",0.15,fn(0.15));

printf("Значение сплайна P в точке x=%.2f равно %.5f\n",0.15,Sx(0.15));

printf("Значение производной функции f' в точке x=%.2f равно

%.4f\n",0.15,fsh(0.15));

printf("Значение производной сплайна P' в точке x=%.2f равно

%.4f\n",0.15,Sshx(0.15));

getch();

}

Результат работы программы

Значение функции f в точке x=0.15  равно 0.14943

Значение сплайна P в точке x=0.15  равно 0.14945

Значение производной функции f'в точке x=0.15 равно 0.9887

Значение производной функции P'в точке x=0.15  равно 0.9883

2.3. ИНТЕРПОЛЯЦИОННЫЙ КУБИЧЕСКИЙ СПЛАЙН

Наиболее часто на практике используется интерполяционный кубический сплайн. Кубический сплайн - это дважды непрерывно дифференцируемая функция, состоящая из «кусочков» полиномов третьей степени. Обозначим  кубический сплайн. Для каждого  из отрезка

, где , ,  и  - числовые коэффициенты. Таким образом, на каждом отрезке ,  четыре неизвестных коэффициента: , ,  и , а на всем отрезке  число неизвестных коэффициентов равно . Следовательно, нам требуется  уравнений.

Так как  является интерполяционной функцией, то  уравнения получаем из условий , . Во всех внутренних узлах сетки (число внутренних узлов равно ) функция  должна быть непрерывной, непрерывно дифференцируемой и дважды непрерывно дифференцируемой функцией. Таким образом, три условия в каждой внутренней точке, в итоге  условий. В сумме получаем  линейных уравнений. Два недостающих условия – это краевые (граничные) условия. Для кубических сплайнов рассматриваются четыре типа краевых условий, в дальнейшем мы будем рассматривать краевое условие вида

.

Определение.   Кубический сплайн, удовлетворяющий краевым условиям , называется естественным кубическим сплайном.

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

Определение естественного интерполяционного кубического сплайна. Пусть на отрезке  задана сетка , в узлах которой заданы значения ,. Естественным интерполяционным кубическим сплайном называется функция , удовлетворяющая следующим условиям:

1)  функция  – дважды непрерывно дифференцируемая функция на ;

2)  на каждом из отрезков  функция  является полиномом третьей степени вида

, ;

3)  функция  – интерполяционная функция, то есть:, ;

4)  краевым условиям .

Отметим, что, отбросив условие три, мы получаем определение естественного кубического сплайна.