Интерполяция кубическими сплайнами
Материал из MachineLearning.
| | Статья существенно переработана с использованием LLM GPT-5.6 Thinking и проверена участником Kseniia Karpeeva. Промпт приводится полностью в обсуждении статьи. |
Интерполяция кубическими сплайнами — метод интерполяции, при котором гладкая функция строится по значениям, заданным в отдельных точках. Между каждой парой соседних узлов используется свой кубический многочлен, а в узлах эти многочлены согласуются так, чтобы функция и её первые две производные оставались непрерывными.
В статье сначала рассматривается общая идея сплайн-интерполяции, а затем подробно выводится натуральный кубический сплайн, для которого вторая производная равна нулю на концах отрезка.
В отличие от одного интерполяционного многочлена высокой степени, сплайн строится из локальных полиномиальных участков. Благодаря этому он обычно меньше подвержен сильным колебаниям между узлами и удобен для обработки экспериментальных данных, построения гладких траекторий и численного представления функций.
Зачем нужны сплайны
Пусть значения некоторой функции известны только в конечном наборе точек. Задача интерполяции состоит в том, чтобы построить функцию, которая проходит через эти точки и позволяет оценивать значения между ними.
Самый прямой подход — провести через все точки один интерполяционный многочлен. Однако с ростом числа узлов увеличивается и его степень. Такой многочлен зависит сразу от всех исходных данных и может сильно колебаться между узлами. На некоторых сетках это приводит к феномену Рунге.
Кубический сплайн использует другой принцип:
- отрезок разбивается на небольшие промежутки;
- на каждом промежутке строится отдельный кубический многочлен;
- соседние многочлены согласуются в общих узлах;
- после построения значение сплайна в заданной точке вычисляется по многочлену только одного промежутка.
При правильном согласовании участков функция, её первая и вторая производные непрерывны. Поэтому график не имеет углов в узлах, а его кривизна изменяется непрерывно.
При этом слово «локальный» следует понимать аккуратно. Значение уже построенного сплайна вычисляется локально, но его коэффициенты находятся из общей системы уравнений. Изменение одного узлового значения, вообще говоря, влияет на коэффициенты всех участков.
Почему используются кубические многочлены
Линейная интерполяция проста, но её график имеет изломы в узлах: первая производная меняется скачком.
Квадратичные сплайны позволяют получить более гладкую функцию, однако оставляют меньше свободы при согласовании соседних участков и требуют дополнительного выбора условий.
Кубический многочлен имеет четыре коэффициента. Поэтому на одном промежутке он может одновременно учитывать:
- значение функции на левом конце;
- значение функции на правом конце;
- наклон на левом конце;
- наклон на правом конце.
Кубическая степень является стандартным компромиссом между гладкостью, вычислительной сложностью и устойчивостью. Она позволяет построить функцию класса , не переходя к многочленам высокой степени.
Постановка задачи
Пусть функция задана значениями в узлах
где
Расстояния между соседними узлами обозначим через
Требуется построить функцию , которая проходит через все заданные точки,
и на каждом промежутке является многочленом степени не выше трёх.
Ограничение сплайна на отдельный промежуток будем обозначать через
Определение кубического сплайна
Функция называется кубическим интерполяционным сплайном для данных
, если выполняются следующие условия:
- на каждом промежутке
функция
является многочленом степени не выше трёх;
- сплайн проходит через все узлы:
- в каждом внутреннем узле согласованы первые производные:
- в каждом внутреннем узле согласованы вторые производные:
Из условий интерполяции следует непрерывность самой функции:
Таким образом,
Третья производная на каждом промежутке постоянна, но в узлах она, вообще говоря, имеет скачки.
Для промежутков необходимо определить
коэффициентов. Условия интерполяции дают
уравнений, а согласование первых и вторых производных — ещё
. Всего получается
условий.
Два недостающих условия задаются на концах отрезка. От их выбора зависит тип кубического сплайна.
Граничные условия
Граничные условия определяют поведение сплайна у концов отрезка. Наиболее распространённые варианты приведены в таблице.
| Тип сплайна | Граничные условия | Когда применяется |
|---|---|---|
| Натуральный | | Производные на концах неизвестны, а нулевая кривизна считается приемлемой |
| Закреплённый | | Известны наклоны исходной функции на концах |
| Периодический | | Данные описывают периодический процесс; должно выполняться |
| Not-a-knot | Первые два участка и последние два участка попарно являются продолжениями одного кубического многочлена | Нет содержательных граничных условий; распространённый программный вариант |
Условие not-a-knot можно также записать как непрерывность третьей производной в узлах и
.
В классе scipy.interpolate.CubicSpline по умолчанию используется условие not-a-knot. Натуральные условия необходимо задавать явно через параметр bc_type="natural".[1]
Название «натуральный» не означает, что этот вариант всегда является лучшим. Граничные условия представляют собой часть математической модели и должны выбираться с учётом свойств исходной задачи.
Построение натурального кубического сплайна
Для натурального сплайна выполняются условия
Введём узловые значения второй производной:
Тогда граничные условия принимают вид
Вторая производная на одном промежутке
На промежутке функция
является кубическим многочленом. Поэтому её вторая производная линейна.
Значения этой линейной функции на концах известны:
Следовательно,
Это выражение является обычной линейной интерполяцией второй производной между значениями и
.
Восстановление функции
Дважды проинтегрируем выражение для . Постоянные интегрирования определяются из условий
В результате получаем
Из этой формулы непосредственно следуют равенства
а также
Таким образом, интерполяция и непрерывность второй производной уже заложены в конструкцию. Остаётся выбрать так, чтобы в узлах совпадали первые производные.
Уравнения для узловых вторых производных
Первые производные на концах промежутка равны
Во внутреннем узле должно выполняться условие
Подставляя выражения для производных, получаем
После преобразования:
Обозначим правую часть через
Тогда система имеет вид
С учётом условий неизвестными остаются
.
В матричной форме:
Полученная матрица является трёхдиагональной и симметричной. Для каждой строки диагональный элемент строго превосходит сумму модулей внедиагональных элементов:
Следовательно, матрица обладает строгим диагональным преобладанием. Поскольку , система невырождена и имеет единственное решение.
Решение методом прогонки
Трёхдиагональная структура позволяет использовать метод прогонки, также известный как алгоритм Томаса.
Запишем уравнения в форме
где
Искомые значения представляются как
Для первой строки, в которой ,
На прямом ходе для вычисляются
Последнее неизвестное определяется по формуле
Затем выполняется обратный ход:
Построение системы, прямой ход и обратный ход требуют операций и
памяти. Таким образом, вычислительная сложность построения сплайна линейна по числу узлов.
Строгое диагональное преобладание гарантирует, что знаменатели в формулах прогонки не обращаются в нуль.
Коэффициенты локальных многочленов
После нахождения удобно использовать локальную переменную
На промежутке сплайн записывается как
Коэффициенты имеют вид
Эта форма удобна для программной реализации. После построения сплайна значение вычисляется по коэффициентам только одного промежутка.
Численный пример
Рассмотрим данные
| | | | | | | |
|---|---|---|---|---|---|---|
| | | | | | | |
Шаги сетки одинаковы:
Поэтому внутренние уравнения упрощаются:
С учётом получаем систему
Метод прогонки даёт
Коэффициенты локальных многочленов:
| Промежуток | | | | |
|---|---|---|---|---|
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
Например, на первом промежутке
На втором промежутке
Остальные участки строятся аналогично по таблице коэффициентов.
Для проверки рассмотрим узел . В нём выполняются условия
На концах отрезка
Следовательно, построенная функция интерполирует исходные данные, принадлежит классу и удовлетворяет натуральным граничным условиям.
Вариационное свойство
Натуральный кубический сплайн можно определить не только через кусочные многочлены и граничные условия. Он обладает важным вариационным свойством.
Среди достаточно гладких функций , проходящих через те же узлы,
натуральный сплайн минимизирует функционал
В механической интерпретации эта величина соответствует энергии изгиба тонкого упругого стержня. Поэтому натуральный сплайн иногда называют интерполянтом с наименьшей энергией изгиба.[1]
Это свойство не означает, что график сплайна имеет минимальную длину или не способен образовывать выбросы. Минимизируется именно интеграл квадрата второй производной.
Идея доказательства
Пусть — натуральный кубический сплайн, а
— другой достаточно гладкий интерполянт. Представим
Тогда
После раскрытия квадрата получаем
На каждом промежутке третья производная постоянна. После интегрирования по частям с учётом условий
, непрерывности
и натуральных граничных условий
получаем
Следовательно,
Равенство возможно только при . Поэтому минимум единственен.
Точность интерполяции
Пусть
Погрешность зависит не только от гладкости исходной функции и размера шага, но и от выбранных граничных условий.
Если и натуральные граничные условия согласованы с исходной функцией,
то для достаточно регулярной сетки выполняется равномерная оценка
Для производных при аналогичных условиях характерны оценки
Здесь обозначает равномерную норму.
Если или
не равны нулю, натуральные условия искусственно изменяют кривизну у концов. В общем случае глобальный порядок сходимости в равномерной норме может снижаться до
. При этом во внутренней части отрезка, вдали от границ, сохраняется более высокая точность порядка
.[1][1]
Например, для функции вторая производная постоянна:
. Натуральные условия требуют нулевой второй производной на концах и поэтому не согласованы с исходной функцией. Сплайн точно проходит через узлы, но наибольшая ошибка возникает около границ.
Таким образом, граничные условия следует рассматривать как часть модели, а не только как техническое дополнение к системе уравнений.
Ограничения метода
Выбросы между узлами
Непрерывность двух производных не гарантирует сохранения формы данных.
Даже если значения монотонно возрастают или убывают, обычный кубический сплайн может образовать локальный максимум или минимум между узлами. Он также не обязан:
- сохранять выпуклость;
- оставаться между соседними значениями;
- сохранять неотрицательность;
- избегать колебаний около резких изменений данных.
Если сохранение монотонности важнее непрерывности второй производной, применяют формосохраняющую интерполяцию, например метод Фритча — Карлсона или PCHIP.[1]
Такие интерполянты обычно принадлежат классу , а не
. Более слабая гладкость является платой за сохранение формы данных.
Шумные данные
Интерполяционный сплайн проходит точно через каждую точку. Если наблюдения содержат шум, точное прохождение через них может быть нежелательным.
В этом случае используют сглаживающие сплайны. Они находят компромисс между близостью к данным и гладкостью функции, например минимизируя выражение вида
где — параметр регуляризации, управляющий степенью сглаживания.
При малых значениях основной приоритет отдаётся близости к наблюдениям. При увеличении
функция становится более гладкой, но может сильнее отклоняться от данных.
Экстраполяция
Интерполяционная задача определяет функцию только на отрезке . Значения за пределами этого отрезка зависят от отдельного правила экстраполяции. Продолжение крайнего кубического участка не следует путать с утверждением о поведении исходной функции вне области наблюдений.
Даже натуральные условия не означают, что продолжение сплайна за границы будет линейным.
Неравномерные сетки
Теоретически система имеет единственное решение для любых положительных . Однако при очень большом различии между минимальным и максимальным шагами масштабы коэффициентов системы могут существенно различаться.
В численной реализации полезно:
- хранить вычисления в формате с плавающей точкой двойной точности;
- избегать почти совпадающих узлов;
- при очень больших или малых значениях
предварительно масштабировать аргумент;
- проверять строгое возрастание массива узлов;
- учитывать обусловленность и численную устойчивость вычислений.
Как выбрать метод интерполяции
| Свойства задачи | Подходящий метод | Причина |
|---|---|---|
| Требуется простая и быстрая интерполяция | Линейная интерполяция | Минимальная вычислительная сложность, но есть изломы |
| Нужна функция класса | Натуральный кубический сплайн | Простые граничные условия и вариационная интерпретация |
| Известны производные на концах | Закреплённый кубический сплайн | Используется дополнительная информация об исходной функции |
| Данные периодические | Периодический сплайн | Значения и производные согласуются на концах периода |
| Нет содержательных граничных условий | Сплайн not-a-knot | Распространённый универсальный вариант |
| Важна монотонность и отсутствие выбросов | PCHIP, метод Фритча — Карлсона | Форма данных сохраняется ценой перехода от |
| Данные содержат шум | Сглаживающий сплайн | Не требуется точное прохождение через каждое наблюдение |
| Нужна интерполяция многомерных данных | Радиальные базисные функции, тензорные сплайны или другие методы многомерной интерполяции | Обычный одномерный кубический сплайн непосредственно не применим |
Универсально лучшего метода не существует. Выбор зависит от того, какие свойства важнее: гладкость, локальность, сохранение формы, точность на границах или устойчивость к шуму.
Программная реализация
В библиотеке SciPy для языка Python натуральный кубический сплайн можно построить следующим образом:
import numpy as np from scipy.interpolate import CubicSpline x = np.array([1, 2, 3, 4, 5, 6], dtype=float) y = np.array([1.0002, 1.0341, 0.6, 0.40105, 0.1, 0.23975]) spline = CubicSpline(x, y, bc_type="natural") x_query = np.linspace(x[0], x[-1], 200) y_query = spline(x_query) first_derivative = spline(x_query, 1) second_derivative = spline(x_query, 2)
По умолчанию CubicSpline использует условие not-a-knot, поэтому параметр bc_type="natural" нельзя опускать, если требуется именно натуральный сплайн.
Для данных, форму которых важно сохранить, результат можно сравнить с PCHIP:
from scipy.interpolate import PchipInterpolator shape_preserving = PchipInterpolator(x, y)
Различие между результатами особенно заметно около резких изменений и на наборах данных, где обычный кубический сплайн образует выбросы.
После построения сплайна:
- хранение коэффициентов требует
памяти;
- построение требует
операций;
- поиск нужного промежутка методом двоичного поиска требует
;
- если точки запроса отсортированы, все промежутки можно обработать одним последовательным проходом.
Связь с современными методами машинного обучения
Сплайны остаются не только классическим инструментом численного анализа. Их локальность, гладкость и возможность аналитически вычислять производные используются в современных моделях машинного обучения.
Нерегулярные временные ряды
В работе о нейронных управляемых дифференциальных уравнениях дискретные наблюдения нерегулярного временного ряда преобразуются в непрерывную траекторию с помощью натурального кубического сплайна.[1]
Пусть наблюдения имеют вид
Сплайн задаёт дифференцируемую траекторию , проходящую через эти наблюдения. Затем эта траектория управляет скрытым состоянием модели:
В этой конструкции сплайн не является обучаемой моделью. Он служит способом преобразования дискретных данных в гладкий непрерывный сигнал, который используется внутри дифференциального уравнения.
Выбор интерполяции задаёт предположение о поведении данных между наблюдениями. Натуральный кубический сплайн предполагает достаточно гладкую траекторию, что подходит не для каждого процесса. Для онлайн-прогнозирования, скачкообразных сигналов и причинных моделей могут потребоваться другие схемы интерполяции.
Kolmogorov — Arnold Networks
В предложенной в 2024 году архитектуре Kolmogorov — Arnold Networks, или KAN, обучаемые одномерные функции на рёбрах сети параметризуются с помощью B-сплайнов.[1]
Обычный слой нейронной сети использует числовые веса и фиксированную нелинейную функцию. В исходной архитектуре KAN вместо отдельного числового веса на ребре используется обучаемая одномерная функция.
Связь с интерполяционными сплайнами здесь концептуальная:
- функция собирается из локальных полиномиальных участков;
- гладкость контролируется порядком сплайна;
- положение узлов влияет на выразительность представления;
- значения базисных функций вычисляются локально.
При этом KAN не строит натуральный интерполяционный сплайн по фиксированной таблице. Коэффициенты базисных функций обучаются по данным вместе с остальными параметрами сети, а сама функция обычно представляется в базисе B-сплайнов.
В работе Free-Knots KAN рассматривается влияние количества и расположения узлов B-сплайнов на устойчивость обучения. Авторы предлагают обучаемые положения узлов и стратегию, сохраняющую непрерывность класса .[1]
Эти исследования показывают, что классические вопросы теории сплайнов — выбор узлов, гладкость, локальность и число степеней свободы — остаются важными при разработке современных архитектур глубокого обучения.
Алгоритм построения
Построение натурального кубического сплайна можно представить следующей последовательностью действий:
- проверить, что узлы строго возрастают:
;
- вычислить шаги
;
- вычислить правые части
;
- составить трёхдиагональную систему для
;
- решить систему методом прогонки;
- добавить граничные значения
;
- вычислить коэффициенты
;
- для заданного
найти промежуток
;
- вычислить значение соответствующего локального многочлена.
Перед применением метода следует отдельно решить, соответствуют ли натуральные граничные условия смыслу задачи. Этот выбор нельзя определить только по алгоритмическим соображениям.
См. также
- Интерполяция
- Сплайн
- B-сплайн
- Интерполяционный многочлен
- Линейная интерполяция
- Эрмитова интерполяция
- PCHIP
- Сглаживание сплайнами
- Интерполяция полиномами Лагранжа и Ньютона
- Интерполяция каноническим полиномом
- Феномен Рунге
- Система линейных алгебраических уравнений
- Метод прогонки
- Применение сплайнов для численного интегрирования
- Применение интерполирования при дифференцировании
- Применение интерполяции для решения уравнений
Примечания
Литература
- de Boor C. A Practical Guide to Splines. — Revised Edition. — New York: Springer, 2001. — 348 с. — ISBN 978-0-387-95366-3
- Birkhoff G., de Boor C. Journal of Mathematics and Mechanics. — 1964. — Т. 13, № 5. — С. 827–835.
- Atkinson K. E. SIAM Journal on Numerical Analysis. — 1968. — Т. 5, № 1. — С. 89–101.
- Fritsch F. N., Carlson R. E. SIAM Journal on Numerical Analysis. — 1980. — Т. 17, № 2. — С. 238–246.
- Kidger P., Morrill J., Foster J., Lyons T. Advances in Neural Information Processing Systems. — 2020. — Т. 33.
- Liu Z., Wang Y., Vaidya S. et al. arXiv. — 2024.
- Zheng L. N., Zhang W. E., Yue L. et al. arXiv. — 2025.
Ссылки
- CubicSpline в SciPy — построение кусочно-кубического интерполянта класса
.
- make_interp_spline в SciPy — построение интерполирующего B-сплайна.
- PchipInterpolator в SciPy — формосохраняющая кусочно-кубическая интерполяция.

