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).
Ссылка на скачивание - внизу страницы.