Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория по МП.doc
Скачиваний:
134
Добавлен:
05.11.2018
Размер:
1.47 Mб
Скачать

Нахождение коэффициентов интерполяционного параболического сплайна

Из определения интерполяционного параболического сплайна вытекает система линейных уравнений размерности относительно неизвестных , и , . Эта система линейных уравнений имеет единственное решение, если все узлы сетки различны. Система линейных уравнений легко решается, и мы можем записать следующие явные формулы для нахождения коэффициентов , и :

, , ;

, , ;

.

Отметим, что мы привели формулы для случая левого краевого условия . Для правого краевого условия формулы записываются аналогично.

Теорема (оценка погрешности). Пусть . Тогда для любой точки справедлива следующая оценка погрешности: ,

где , положительная константа не зависит от .

Из оценки погрешности вытекает, что при уменьшении равномерного шага в два раза погрешность интерполяции параболическим сплайном уменьшается в восемь раз.

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

Нахождение значений интерполяционного параболического сплайна и его производной

Как и в случае линейного сплайна, сначала находим номер отрезка, содержащего точку , по формуле . Зная все коэффициенты , , и номер отрезка, находим значение интерполяционного параболического сплайна в точке , принадлежащей отрезку ,

.

Как и для линейного сплайна, введем дополнительные коэффициенты: , , . Эти коэффициенты потребуются для вычисления и в точке . Значение производной интерполяционного параболического сплайна в точке , принадлежащей отрезку , вычисляется по формуле

.

Сложность вычислительного алгоритма построения интерполяционного параболического сплайна. Число арифметических действий, необходимых для построения интерполяционного параболического сплайна, пропорционально числу отрезков (), объем памяти также пропорционален числу отрезков ().

Пример. Приведем текст программы, которая по интерполяционной таблице и левому краевому условию строит интерполяционный параболический сплайн и его производную. Интерполяционная таблица строится на отрезке , с равномерным шагом , где . Узлы сетки вычисляются по формуле , где , , значениянаходятся по формуле Задано краевое условие . На печать выдаются значения интерполяционного параболического сплайна и функции производной интерполяционного параболического сплайна и производной функции в точке .

Программа

#include <stdio.h>

#include <conio.h>

#include <math.h>

float A,B; //границы отрезка

float Xi[21],Yi[21]; //интерполяционная таблица

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();

}