Кубічний сплайн застосовують для наближення функції, значення якої відомі лише в окремих точках. Замість одного полінома високого степеня весь проміжок поділяють на частини, а між сусідніми вузлами будують окремі кубічні поліноми, які з’єднуються в одну неперервну та гладку криву. Після розгляду основних етапів побудови сплайна застосуємо отримані формули на прикладах і знайдемо наближені значення таблично заданих функцій.
Сплайн-Інтерполяція: Перехід від Одного Полінома до Кусково-Поліноміального Наближення
Нехай функція задана в точках
\[ (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 або будь-яку іншу.

Було би добре, якщо можна було побачити, якою вийшла тридіагональна матриця для тестових даних, що тут є. Це зекономить величезну кількість часу на розуміння алгоритму.
Доброго дня paul. Не зовсім зрозумілою являється Ваша репліка “Було би добре, якщо можна було побачити, якою вийшла тридіагональна матриця для тестових даних, що тут є”. Якщо мова йде про приклад, що розглядається в параграфі, а якщо бути більш точним, то про процес знаходження коефіцієнтів ci, то у розміщеному вище рішенні, все це міститься.
У формулі (12) помилка. Якщо комірки нумеруються від 1 до n,то вираз y_{i-1}-y_{i-2},де y_{0} це неіснуючий елемент для i=2, хоча індексація починається з 1.Мабудь там повинно бути 3*((y_{i+1}-y_{i})/h_{i}-(y_{i}-y_{i-1})/h_{i-1})
Шановний noadmin, формула (12) є безпомилковою (індексація елементів таблично заданої функції починається з нуля).
Так, як і всіх решту масивів з блок схеми?
Ні Богдан. Індексація решти масивів з блок-схеми починається з одиниці.