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) краевым условиям .
Отметим, что, отбросив условие три, мы получаем определение естественного кубического сплайна.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.