Кубический сплайн применяют для приближения функции, значения которой известны только в отдельных точках. Вместо одного полинома высокой степени весь промежуток разделяют на части, а между соседними узлами строят отдельные кубические полиномы, которые соединяются в одну непрерывную и гладкую кривую. После рассмотрения основных этапов построения сплайна применим полученные формулы на примерах и найдём приближённые значения таблично заданных функций.
Сплайн-Интерполяция: Переход от Одного Полинома к Кусочно-Полиномиальному Приближению
Пусть функция задана в точках
\[ (x_0,y_0),\ (x_1,y_1),\ \dots,\ (x_n,y_n), \]
где
\[ x_0<x_1<\dots<x_n. \]
Для приближения функции между узлами можно построить один интерполяционный полином, который проходит через все заданные точки. Такой подход используется, например, в интерполяционных формулах Лагранжа и Ньютона.
Однако с увеличением количества узлов возрастает и степень такого полинома. Из-за этого между узлами могут возникать заметные колебания, особенно вблизи краёв промежутка. Чтобы избежать этой проблемы, вместо одного полинома высокой степени используют несколько полиномов невысокой степени.

Весь промежуток
\[ [x_0,x_n] \]
разделяют на части
\[ [x_0,x_1],\ [x_1,x_2],\ \dots,\ [x_{n-1},x_n]. \]
На каждом промежутке
\[ [x_i,x_{i+1}] \]
строят отдельный кубический полином
\[ S_i(x)=a_i+b_i\cdot(x-x_i)+c_i\cdot(x-x_i)^2+d_i\cdot(x-x_i)^3,\qquad i=0,1,\dots,n-1. \]
Если задано \( n+1 \) узлов, между ними образуется \( n \) промежутков, поэтому необходимо построить \( n \) кубических полиномов.
Для дальнейших вычислений введём длину каждого промежутка:
\[ h_i=x_{i+1}-x_i,\qquad i=0,1,\dots,n-1. \]
Каждый из построенных полиномов описывает сплайн только на своём промежутке. Чтобы все части образовали одну кривую, их необходимо правильно соединить в узлах.
Кубический Сплайн: Условия Гладкого Соединения Полиномов
Прежде всего сплайн должен проходить через все заданные табличные точки. Для каждого промежутка выполняются условия
\[ S_i(x_i)=y_i,\qquad S_i(x_{i+1})=y_{i+1}. \]
В левом узле имеем
\[ S_i(x_i)=a_i, \]
поэтому
\[ a_i=y_i. \]
Таким образом, коэффициенты \( a_i \) сразу определяются по табличным значениям функции.
В правом узле
\[ x_{i+1}-x_i=h_i, \]
поэтому
\[ a_i+b_i\cdot h_i+c_i\cdot h_i^2+d_i\cdot h_i^3=y_{i+1}. \]
Прохождение через узлы обеспечивает отсутствие разрывов между соседними частями сплайна. Однако этого недостаточно, чтобы получить гладкую кривую.
Найдём первую производную кубического полинома:
\[ S_i'(x)=b_i+2\cdot c_i\cdot(x-x_i)+3\cdot d_i\cdot(x-x_i)^2. \]
В каждом внутреннем узле должно выполняться условие
\[ S_{i-1}'(x_i)=S_i'(x_i),\qquad i=1,2,\dots,n-1. \]
Равенство первых производных обеспечивает согласованное направление соседних частей кривой и не допускает появления изломов.
Вторая производная имеет вид
\[ S_i»(x)=2\cdot c_i+6\cdot d_i\cdot(x-x_i). \]
Для плавного изменения кривизны во внутренних узлах дополнительно требуется
\[ S_{i-1}»(x_i)=S_i»(x_i),\qquad i=1,2,\dots,n-1. \]
Таким образом, непрерывность значений устраняет разрывы, непрерывность первой производной — изломы, а непрерывность второй производной обеспечивает плавное изменение кривизны.
Чтобы однозначно определить все коэффициенты сплайна, остаётся задать условия на краях всего промежутка.
Кубический Сплайн: Граничные Условия и Роль Коэффициентов
В этой статье будем использовать граничные условия, при которых вторая производная сплайна в первом и последнем узлах равна нулю:
\[ S»(x_0)=0,\qquad S»(x_n)=0. \]
Рассмотрим связь этих условий с коэффициентами кубических полиномов.
На левом конце промежутка \( [x_i,x_{i+1}] \) имеем
\[ S_i»(x_i)=2\cdot c_i. \]
Отсюда
\[ c_i=\frac{S»(x_i)}{2}. \]
Таким образом, коэффициенты \( c_i \) непосредственно связаны со второй производной сплайна в узлах.
Для крайних узлов имеем
\[ c_0=0,\qquad c_n=0. \]
Коэффициент \( c_n \) характеризует вторую производную сплайна в последнем узле \( x_n \). Отдельного полинома \( S_n(x) \) нет, поскольку последний полином строится на промежутке \( [x_{n-1},x_n] \), однако коэффициент \( c_n \) необходим для его определения.
На правом конце произвольного промежутка имеем
\[ S_i»(x_{i+1})=2\cdot c_i+6\cdot d_i\cdot h_i. \]
С другой стороны, вторая производная в узле \( x_{i+1} \) определяется коэффициентом \( c_{i+1} \), поэтому
\[ 2\cdot c_i+6\cdot d_i\cdot h_i=2\cdot c_{i+1}. \]
Отсюда
\[ d_i=\frac{c_{i+1}-c_i}{3\cdot h_i},\qquad i=0,1,\dots,n-1. \]
Теперь воспользуемся условием прохождения сплайна через правый узел:
\[ a_i+b_i\cdot h_i+c_i\cdot h_i^2+d_i\cdot h_i^3=y_{i+1}. \]
Поскольку
\[ a_i=y_i, \]
то
\[ b_i=\frac{y_{i+1}-y_i}{h_i}-c_i\cdot h_i-d_i\cdot h_i^2. \]
После подстановки формулы для \( d_i \) получаем
\[ b_i=\frac{y_{i+1}-y_i}{h_i}-\frac{h_i}{3}\cdot(2\cdot c_i+c_{i+1}),\qquad i=0,1,\dots,n-1. \]
Таким образом, если известны коэффициенты \( c_i \), то по ним можно найти \( d_i \) и \( b_i \), а коэффициенты \( a_i \) уже определяются табличными значениями. Поэтому основная задача заключается в нахождении внутренних коэффициентов \( c_i \).
Трёхдиагональная Система: Определение Коэффициентов Кубического Сплайна
Для нахождения внутренних коэффициентов воспользуемся условием непрерывности первой производной.
На правом конце промежутка \( [x_{i-1},x_i] \)
\[ S_{i-1}'(x_i)=b_{i-1}+2\cdot c_{i-1}\cdot h_{i-1}+3\cdot d_{i-1}\cdot h_{i-1}^2. \]
На левом конце следующего промежутка
\[ S_i'(x_i)=b_i. \]
Поэтому
\[ b_{i-1}+2\cdot c_{i-1}\cdot h_{i-1}+3\cdot d_{i-1}\cdot h_{i-1}^2=b_i. \]
Подставим в это равенство полученные ранее формулы для \( b_{i-1} \), \( b_i \) и \( d_{i-1} \). После упрощения остаются только три соседних коэффициента:
\[ c_{i-1},\qquad c_i,\qquad c_{i+1}. \]
Для каждого внутреннего узла получаем уравнение
\[ h_{i-1}\cdot c_{i-1}+2\cdot(h_{i-1}+h_i)\cdot c_i+h_i\cdot c_{i+1}=3\cdot\left(\frac{y_{i+1}-y_i}{h_i}-\frac{y_i-y_{i-1}}{h_{i-1}}\right), \]
где
\[ i=1,2,\dots,n-1. \]
Вместе с граничными условиями
\[ c_0=0,\qquad c_n=0 \]
получаем систему для нахождения всех внутренних коэффициентов
\[ c_1,c_2,\dots,c_{n-1}. \]
В каждом уравнении присутствуют только три соседние неизвестные. Поэтому матрица системы имеет ненулевые элементы на главной диагонали и двух соседних с ней диагоналях. Такую систему называют трёхдиагональной, а для её решения удобно использовать метод прогонки.
После нахождения коэффициентов \( c_i \) вычисляют \( d_i \) и \( b_i \), а затем записывают все коэффициенты соответствующих кубических полиномов. Далее для каждого промежутка записывают соответствующий полином, и все эти полиномы вместе образуют кубический сплайн.
Кубический Сплайн: Пошаговые Примеры Построения и Вычисления
Перейдём к практическому применению кубического сплайна для таблично заданных функций. В каждом случае найдём необходимые коэффициенты, определим полином для нужного промежутка и вычислим приближённое значение функции.
Пример 1. По приведённым табличным значениям функции найти приближённое значение \( f(0.4) \)
| \( i \) | \( x_i \) | \( y_i \) |
|---|---|---|
| \( 0 \) | \( 0 \) | \( 1 \) |
| \( 1 \) | \( 1 \) | \( 2 \) |
| \( 2 \) | \( 2 \) | \( 5 \) |
Имеем три узла и два промежутка. Вычислим их длины:
\[ h_0=1-0=1,\qquad h_1=2-1=1. \]
Для крайних узлов имеем
\[ c_0=0,\qquad c_2=0. \]
Неизвестным остаётся только коэффициент \( c_1 \). Запишем для него уравнение:
\[ h_0\cdot c_0+2\cdot(h_0+h_1)\cdot c_1+h_1\cdot c_2=3\cdot\left(\frac{y_2-y_1}{h_1}-\frac{y_1-y_0}{h_0}\right). \]
Подставим значения:
\[ 1\cdot0+2\cdot(1+1)\cdot c_1+1\cdot0=3\cdot\left(\frac{5-2}{1}-\frac{2-1}{1}\right). \]
Получаем
\[ 4\cdot c_1=6, \]
откуда
\[ c_1=1.5. \]
Таким образом,
\[ c_0=0,\qquad c_1=1.5,\qquad c_2=0. \]
Найдём коэффициенты \( d_i \):
\[ \begin{gathered} d_0=\frac{1.5-0}{3\cdot1}=0.5,\\[4pt] d_1=\frac{0-1.5}{3\cdot1}=-0.5. \end{gathered} \]
Теперь вычислим коэффициенты \( b_i \):
\[ \begin{gathered} b_0=\frac{2-1}{1}-\frac{1}{3}\cdot(2\cdot0+1.5)=0.5,\\[4pt] b_1=\frac{5-2}{1}-\frac{1}{3}\cdot(2\cdot1.5+0)=2. \end{gathered} \]
Коэффициенты \( a_i \) равны
\[ a_0=1,\qquad a_1=2. \]
Для первого промежутка имеем
\[ S_0(x)=1+0.5\cdot x+0.5\cdot x^3. \]
Поскольку
\[ 0<0.4<1, \]
используем именно этот полином:
\[ S_0(0.4)=1+0.5\cdot0.4+0.5\cdot0.4^3. \]
Вычислим:
\[ S_0(0.4)=1+0.2+0.032=1.232. \]
Таким образом,
\[ f(0.4)\approx1.232. \]
Пример 2. По приведённым табличным значениям функции найти приближённое значение \( f(2.5) \)
| \( i \) | \( x_i \) | \( y_i \) |
|---|---|---|
| \( 0 \) | \( 0 \) | \( 0 \) |
| \( 1 \) | \( 2 \) | \( 2 \) |
| \( 2 \) | \( 3 \) | \( 4 \) |
| \( 3 \) | \( 5 \) | \( 6 \) |
Расстояния между соседними узлами различаются, поэтому значения \( h_i \) необходимо вычислить отдельно для каждого промежутка:
\[ h_0=2,\qquad h_1=1,\qquad h_2=2. \]
Для крайних узлов имеем
\[ c_0=0,\qquad c_3=0. \]
Неизвестными являются \( c_1 \) и \( c_2 \).
Для первого внутреннего узла имеем
\[ 2\cdot0+2\cdot(2+1)\cdot c_1+c_2=3\cdot\left(\frac{4-2}{1}-\frac{2-0}{2}\right), \]
откуда
\[ 6\cdot c_1+c_2=3. \]
Для второго внутреннего узла
\[ c_1+2\cdot(1+2)\cdot c_2+2\cdot0=3\cdot\left(\frac{6-4}{2}-\frac{4-2}{1}\right), \]
поэтому
\[ c_1+6\cdot c_2=-3. \]
Получаем систему
\[ \begin{cases} 6\cdot c_1+c_2=3,\\ c_1+6\cdot c_2=-3. \end{cases} \]
Решив её, находим
\[ c_1=0.6,\qquad c_2=-0.6. \]
Таким образом,
\[ c_0=0,\qquad c_1=0.6,\qquad c_2=-0.6,\qquad c_3=0. \]
Найдём коэффициенты \( d_i \):
\[ \begin{gathered} d_0=\frac{0.6-0}{3\cdot2}=0.1,\\[4pt] d_1=\frac{-0.6-0.6}{3\cdot1}=-0.4,\\[4pt] d_2=\frac{0-(-0.6)}{3\cdot2}=0.1. \end{gathered} \]
Найдём коэффициенты \( b_i \):
\[ \begin{gathered} b_0=\frac{2-0}{2}-\frac{2}{3}\cdot(2\cdot0+0.6)=0.6,\\[4pt] b_1=\frac{4-2}{1}-\frac{1}{3}\cdot(2\cdot0.6-0.6)=1.8,\\[4pt] b_2=\frac{6-4}{2}-\frac{2}{3}\cdot(2\cdot(-0.6)+0)=1.8. \end{gathered} \]
Коэффициенты \( a_i \) равны
\[ a_0=0,\qquad a_1=2,\qquad a_2=4. \]
Поскольку
\[ 2<2.5<3, \]
необходимо использовать полином на промежутке \( [2,3] \):
\[ S_1(x)=2+1.8\cdot(x-2)+0.6\cdot(x-2)^2-0.4\cdot(x-2)^3. \]
Для \( x=2.5 \) имеем
\[ S_1(2.5)=2+1.8\cdot0.5+0.6\cdot0.5^2-0.4\cdot0.5^3. \]
Получаем
\[ S_1(2.5)=2+0.9+0.15-0.05=3. \]
Таким образом,
\[ f(2.5)\approx3. \]
Пример 3. По приведённым табличным значениям функции найти приближённое значение \( f(3.5) \)
| \( i \) | \( x_i \) | \( y_i \) |
|---|---|---|
| \( 0 \) | \( 0 \) | \( 0 \) |
| \( 1 \) | \( 1 \) | \( 2 \) |
| \( 2 \) | \( 2 \) | \( 7 \) |
| \( 3 \) | \( 3 \) | \( 10 \) |
| \( 4 \) | \( 4 \) | \( 16 \) |
В этом случае все соседние узлы расположены на одинаковом расстоянии:
\[ h_0=h_1=h_2=h_3=1. \]
Для крайних узлов имеем
\[ c_0=0,\qquad c_4=0. \]
Имеем три внутренних узла, поэтому необходимо составить три уравнения для коэффициентов \( c_1 \), \( c_2 \) и \( c_3 \).
Для первого внутреннего узла
\[ 4\cdot c_1+c_2=3\cdot\left((7-2)-(2-0)\right), \]
то есть
\[ 4\cdot c_1+c_2=9. \]
Для второго внутреннего узла
\[ c_1+4\cdot c_2+c_3=3\cdot\left((10-7)-(7-2)\right), \]
откуда
\[ c_1+4\cdot c_2+c_3=-6. \]
Для третьего внутреннего узла
\[ c_2+4\cdot c_3=3\cdot\left((16-10)-(10-7)\right), \]
поэтому
\[ c_2+4\cdot c_3=9. \]
Получаем систему
\[ \begin{cases} 4\cdot c_1+c_2=9,\\ c_1+4\cdot c_2+c_3=-6,\\ c_2+4\cdot c_3=9. \end{cases} \]
Решив её, находим
\[ c_1=3,\qquad c_2=-3,\qquad c_3=3. \]
Таким образом,
\[ c_0=0,\qquad c_1=3,\qquad c_2=-3,\qquad c_3=3,\qquad c_4=0. \]
Найдём коэффициенты \( d_i \):
\[ d_0=1,\qquad d_1=-2,\qquad d_2=2,\qquad d_3=-1. \]
Найдём коэффициенты \( b_i \):
\[ b_0=1,\qquad b_1=4,\qquad b_2=4,\qquad b_3=4. \]
Коэффициенты \( a_i \) равны
\[ a_0=0,\qquad a_1=2,\qquad a_2=7,\qquad a_3=10. \]
Заданное значение аргумента принадлежит последнему промежутку:
\[ 3<3.5<4. \]
Поэтому используем полином
\[ S_3(x)=10+4\cdot(x-3)+3\cdot(x-3)^2-(x-3)^3. \]
Для \( x=3.5 \) имеем
\[ S_3(3.5)=10+4\cdot0.5+3\cdot0.5^2-0.5^3. \]
Выполним вычисления:
\[ S_3(3.5)=10+2+0.75-0.125=12.625. \]
Таким образом,
\[ f(3.5)\approx12.625. \]
Следующие Темы: Продолжаем Изучать Интерполяцию
Кубический сплайн показывает, как строить гладкое приближение по табличным данным, но существуют и другие интересные подходы к интерполяции. Далее стоит познакомиться с методами, которые работают с периодическими функциями и значениями аргумента вблизи середины таблицы.
- Тригонометрическая интерполяция: Приближение периодических функций — Рассмотрим, как по табличным значениям строить приближение периодических функций с помощью синусов и косинусов.
- Интерполяционные формулы Гаусса: Вычисление значений вблизи середины таблицы — Узнаем, как первая и вторая формулы Гаусса позволяют находить приближённые значения функции вблизи центральных узлов таблицы.
- Формула Бесселя: Интерполяция между центральными узлами таблицы — Разберём, как формула Бесселя помогает вычислять приближённые значения функции, когда аргумент расположен между центральными узлами.
Кубический Сплайн: Превратите Алгоритм в Собственную Программу
Если вам нравится программирование, попробуйте закрепить полученные знания на практике и самостоятельно реализовать алгоритм построения кубического сплайна. Используйте приведённую блок-схему как основу: организуйте ввод узлов и значений функции, вычислите коэффициенты сплайна, определите промежуток для заданной точки и найдите приближённое значение функции. Выбирайте тот язык программирования, с которым вам удобнее всего работать, — Pascal, Python, C++, JavaScript или любой другой.
