
- •Введение
- •1. Метод прогонки
- •1.1. Метод прогонки для трехдиагональных матриц
- •1.2. Метод прогонки для пятидиагональных матриц
- •2. Сплайн – интерполяция
- •2.1. Интерполяционный линейный сплайн
- •Пример программы, которая по интерполяционной таблице строит интерполяционный линейный сплайн, приводится в примере выполнения задания 1 расчетно-графического задания 1.
- •Нахождение коэффициентов интерполяционного линейного сплайна
- •Нахождение значений интерполяционного линейного сплайна
- •2.2. Интерполяционный параболический сплайн
- •Нахождение коэффициентов интерполяционного параболического сплайна
- •Нахождение значений интерполяционного параболического сплайна и его производной
- •Результат работы программы
- •2.3. Интерполяционный кубический сплайн
- •Нахождение коэффициентов естественного интерполяционного кубического сплайна
- •Нахождение значений естественного интерполяционного кубического сплайна и его производных
- •2.5. Построение интерполяционных сплайновых кривых при помощи сплайн - функций
- •2.6. Примеры решения задач
- •3. Сглаживание кубическими сплайнами
- •3.1. Постановка задачи сглаживания
- •Определение естественного сглаживающего кубического сплайна
- •3.2. Построение естественного сглаживающего кубического сплайна
- •Нахождение значений естественного сглаживающего кубического сплайна и его производных
- •4. Аппроксимация
Нахождение коэффициентов интерполяционного параболического сплайна
Из определения
интерполяционного параболического
сплайна вытекает система линейных
уравнений размерности
относительно неизвестных
,
и
,
.
Эта система линейных уравнений имеет
единственное решение, если все узлы
сетки различны. Система линейных
уравнений легко решается, и мы можем
записать следующие явные формулы для
нахождения коэффициентов
,
и
:
,
,
;
,
,
;
.
Отметим,
что мы привели формулы для случая левого
краевого условия
.
Для правого краевого условия
формулы записываются аналогично.
Теорема
(оценка погрешности). Пусть
.
Тогда для любой точки
справедлива следующая оценка погрешности:
,
где
,
положительная константа
не зависит от
.
Из
оценки погрешности вытекает, что при
уменьшении равномерного шага
в два раза
погрешность интерполяции параболическим
сплайном уменьшается в восемь раз.
Производная
интерполяционного параболического
сплайна – это непрерывная
кусочно-линейная функция, то есть
линейный сплайн:
,
,
.
Отметим, что производная интерполяционного
сплайна – это сплайн, который не является
интерполяционным.
Нахождение значений интерполяционного параболического сплайна и его производной
Как и в случае линейного
сплайна, сначала находим номер
отрезка, содержащего точку
,
по формуле
.
Зная все коэффициенты
,
,
и номер отрезка, находим значение
интерполяционного параболического
сплайна
в точке
,
принадлежащей отрезку
,
.
Как
и для линейного сплайна, введем
дополнительные коэффициенты:
,
,
.
Эти коэффициенты потребуются для
вычисления
и
в точке
.
Значение производной интерполяционного
параболического сплайна в точке
,
принадлежащей отрезку
,
вычисляется по формуле
.
Сложность
вычислительного алгоритма построения
интерполяционного параболического
сплайна. Число арифметических действий,
необходимых для построения интерполяционного
параболического сплайна, пропорционально
числу отрезков (),
объем памяти также пропорционален числу
отрезков (
).
Пример. Приведем
текст программы, которая по интерполяционной
таблице и левому краевому условию строит
интерполяционный параболический сплайн
и
его производную. Интерполяционная
таблица строится на отрезке
,
с равномерным шагом
,
где
.
Узлы сетки вычисляются по формуле
,
где
,
,
значения
находятся
по формуле
Задано краевое условие
.
На печать выдаются значения интерполяционного
параболического сплайна
и
функции
производной интерполяционного
параболического сплайна
и
производной функции
в
точке
.
Программа
#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();
}