Кубический Сплайн: Построение Гладкого Приближения Таблично Заданной Функции

Кубический сплайн применяют для приближения функции, значения которой известны только в отдельных точках. Вместо одного полинома высокой степени весь промежуток разделяют на части, а между соседними узлами строят отдельные кубические полиномы, которые соединяются в одну непрерывную и гладкую кривую. После рассмотрения основных этапов построения сплайна применим полученные формулы на примерах и найдём приближённые значения таблично заданных функций.

Сплайн-Интерполяция: Переход от Одного Полинома к Кусочно-Полиномиальному Приближению

Пусть функция задана в точках

\[ (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. \]

Следующие Темы: Продолжаем Изучать Интерполяцию

Кубический сплайн показывает, как строить гладкое приближение по табличным данным, но существуют и другие интересные подходы к интерполяции. Далее стоит познакомиться с методами, которые работают с периодическими функциями и значениями аргумента вблизи середины таблицы.

  1. Тригонометрическая интерполяция: Приближение периодических функций — Рассмотрим, как по табличным значениям строить приближение периодических функций с помощью синусов и косинусов.
  2. Интерполяционные формулы Гаусса: Вычисление значений вблизи середины таблицы — Узнаем, как первая и вторая формулы Гаусса позволяют находить приближённые значения функции вблизи центральных узлов таблицы.
  3. Формула Бесселя: Интерполяция между центральными узлами таблицы — Разберём, как формула Бесселя помогает вычислять приближённые значения функции, когда аргумент расположен между центральными узлами.

Кубический Сплайн: Превратите Алгоритм в Собственную Программу

Если вам нравится программирование, попробуйте закрепить полученные знания на практике и самостоятельно реализовать алгоритм построения кубического сплайна. Используйте приведённую блок-схему как основу: организуйте ввод узлов и значений функции, вычислите коэффициенты сплайна, определите промежуток для заданной точки и найдите приближённое значение функции. Выбирайте тот язык программирования, с которым вам удобнее всего работать, — Pascal, Python, C++, JavaScript или любой другой.

Блок-схема алгоритма, показывающая, как кубический сплайн используется для вычисления приближённого значения таблично заданной функции