Построим алгоритм для интерполяции функции на отрезке интерполяционным линейным сплайном с равномерным шагом. Будем опираться на материал, изложенный в п.п. 2.1.
Так как размерность интерполяционной таблицы равна 21, то число отрезков , которое на единицу меньше, чем размерность интерполяционной таблицы, равно 20 . Обозначим через шаг, который вычисляется по формуле , где , . Введем сетку на отрезке : .
Узлы сетки находятся по формуле , . Значения находятся по формуле , . Таким образом, по формуле функции на отрезке построена интерполяционная таблица размерности 21 с равномерным шагом. Так как все узлы сетки различны, то существует единственный интерполяционный линейный сплайн , удовлетворяющий этой таблице. Для построения сплайна сначала найдем его коэффициенты по формулам
, , , , .
Зная коэффициенты сплайна , мы можем найти его значение в любой точке из отрезка . Находим номер отрезка, которому принадлежит точка , по формуле . Значение сплайна при находим по формуле
.
#include <stdio.h>
#include <conio.h>
#include <math.h>
float A, B; // границы отрезка [а, b]
float Xi[21], Yi[21]; // интерполяционная таблица
float Ai[21], Bi[21]; // коэффициенты сплайна ai, bi
float h; // шаг сетки
int n; // число отрезков
// Функция sin(x)
float fn (float x) { return (sin (x));}
// Вычисление значений сплайна L(x)
float L (float x)
{
int i=int ((x-A)/h); // номер интервала
return Ai[i]+Bi[i]*(x-Xi[i]);
}
void main ()
{
// Инициализация начальных значений
A=-2, B=2; // отрезок [-2,2]
n=20; // число отрезков n
h=float (B-A)/n; // шаг h=(b-a)/n
// Создание интерполяционной таблицы
for (int i=0; i<=n; i++)
{
Xi[i]=A+i*h;
Yi[i]=fn (A+i*h);
};
// Расчет коэффициентов сплайна L(x)
for (i=0; i<=n-1; i++)
{
Ai[i]=Yi[i];
Bi[i]=(Yi[i+1]-Yi[i])/h;
};
Ai[n]=Yi[n],
Bi[n]=Bi[n-1];
printf ("Значение функции f в точке x=%.2g равно %.2g\n", 0.1, fn (0.1));
printf ("Значение сплайна L в точке x=%.2g равно %.2g\n", 0.1, L (0.1));
getch ();
}
Значение функции f в точке x=0.1 равно 0.1
Значение сплайна L в точке x=0.1 равно 0.099
Построим алгоритм для интерполяции функции на отрезке естественным интерполяционным кубическим сплайном с равномерным шагом. Будем опираться на материал, изложенный в п.п.2.3.
Как и в задании 1, число отрезков , шаг, где , . Введем сетку на отрезке : .
Узлы сетки находятся по формуле , . Значения находятся по формуле , . Таким образом, по формуле функции на отрезке построена интерполяционная таблица размерности 21 с равномерным шагом. Так как все узлы сетки различны, то существует единственный интерполяционный кубический сплайн , удовлетворяющий этой таблице.
Для построения сплайна сначала найдем его коэффициенты. Коэффициенты находятся по явным формулам , . Для нахождения коэффициентов , , решается система линейных уравнений с трехдиагональной матрицей:
,
Эта система линейных уравнений имеет единственное решение, которое находится методом прогонки. Запишем формулы метода прогонки для данного примера. Сначала в порядке возрастания находятся прогоночные коэффициенты и :
, , , , , где .
Затем в порядке убывания находятся неизвестные :
, ,
После нахождения коэффициентов и , находим по явным формулам коэффициенты и :
, , ,
,
Зная коэффициенты сплайна , мы можем найти его значение и значение его производной в любой точке из отрезка . Находим номер отрезка, которому принадлежит точка, по формуле . Значение сплайна при находим по формуле
Значение производной сплайна при находим по формуле
.
Программа
#include <stdio.h>
#include <conio.h>
#include <math.h>
float A,B; // границы отрезка
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.