Численные методы
Сплайны
Каждый анимационный кадр в Pixar - это не ключевой кадр. Аниматор ставит позу в кадре 0 и в кадре 24. Всё между ними вычисляет кубический сплайн. Сплайн знает, что движение должно ускоряться и замедляться плавно (C² условие) - поэтому анимация выглядит живой, а не механической. TrueType-шрифт на экране - набор квадратичных B-сплайнов. Корпус iPhone спроектирован NURBS-поверхностями в Rhino. Траектория промышленного манипулятора - кубический сплайн с оптимизацией по jerk.
- **Анимация (Pixar, DreamWorks):** кубические сплайны между ключевыми кадрами с C² гладкостью - аниматор задаёт «ease in/ease out» через касательные в узлах
- **Spline regression / GAM:** B-spline basis в sklearn SplineTransformer, в Prophet для тренда, в R mgcv - nonlinear feature map из одной числовой фичи
- **Robotics (MoveIt, CasADi):** cubic spline waypoints для motion planning, C² автоматически минимизирует jerk без явных ограничений в NLP
Предварительные знания
Кубические сплайны
Каждый анимационный кадр в Pixar - это не ключевой кадр. Аниматор ставит позу в кадре 0 и в кадре 24. Всё между ними вычисляет кубический сплайн. Сплайн знает: движение должно ускоряться и замедляться плавно - C² условие. Поэтому анимация выглядит живой, а не механической.
**Кубический сплайн** S(x) на узлах x_0 < x_1 < ... < x_n: 1. На каждом интервале [x_i, x_{i+1}] - полином S_i(x) степени <= 3 2. **Интерполяция:** S_i(x_i) = y_i, S_i(x_{i+1}) = y_{i+1} 3. **C¹:** S'_i(x_{i+1}) = S'_{i+1}(x_{i+1}) - касательная непрерывна 4. **C²:** S''_i(x_{i+1}) = S''_{i+1}(x_{i+1}) - кривизна непрерывна Граничные условия: natural (S'' = 0 на краях) или clamped (S' задана на краях).
Сплайн строится через **трёхдиагональную систему** для вторых производных в узлах. Алгоритм прогонки Томаса решает её за O(n) - линейная сложность даже для тысяч узлов. Та же трёхдиагональная структура встречается в implicit time-stepping методах для диффузионных уравнений.
В Prophet (Facebook/Meta) сплайны - буквально building block тренда. Каждый changepoint задаёт узел кусочной линейной или логистической функции. Spline regression - это nonlinear feature map: из одной числовой фичи делается несколько базисных функций, которые GAM складывает линейно. Интерпретируемость сохраняется, нелинейность появляется.
Кубический сплайн обеспечивает гладкость класса:
B-сплайны
Кубический сплайн интерполирует - проходит через все точки. B-сплайн аппроксимирует - проходит **рядом** с контрольными точками, притягивается к ним. Это не баг, а фича: перетащить одну точку = изменить только локальный участок кривой. Именно поэтому каждый UI для редактирования кривых (Blender, After Effects, Figma) использует B-сплайн или Безье.
**B-сплайн кривая степени p:** C(t) = sum(i=0..n) P_i * N_{i,p}(t) где P_i - контрольные точки, N_{i,p}(t) - базисные функции Cox-de Boor. **Рекурсия (Cox-de Boor):** - N_{i,0}(t) = 1 если t_i <= t < t_{i+1}, иначе 0 - N_{i,p}(t) = (t - t_i)/(t_{i+p} - t_i) * N_{i,p-1}(t) + (t_{i+p+1} - t)/(t_{i+p+1} - t_{i+1}) * N_{i+1,p-1}(t) **Свойства базиса:** - Локальный носитель: N_{i,p}(t) != 0 только на [t_i, t_{i+p+1}] - Неотрицательность: N_{i,p}(t) >= 0 - Разбиение единицы: sum N_{i,p}(t) = 1
Локальный носитель - ключевое отличие от полинома Лагранжа. Там изменение одной точки пересчитывает **всю** кривую глобально. У B-сплайна степени p изменение контрольной точки P_i затрагивает только p+1 сегментов. В robotics это критично: пересчёт траектории не должен менять поведение руки-манипулятора на участках, которые уже выполнены.
| Свойство | Интерполяционный сплайн | B-сплайн |
|---|---|---|
| Проходит через точки? | Да (интерполяция) | Нет (аппроксимация) |
| Локальный контроль? | Нет (пересчёт всей кривой) | Да (только p+1 сегментов) |
| Устойчивость | Зависит от расположения узлов | Хорошая (базис неотрицателен) |
| Применение | Восстановление данных | Дизайн кривых, анимация, CAD |
| Вычисление | Решение трёхдиагональной системы | Алгоритм де Бура, O(p²) |
В motion planning (MoveIt, CasADi) кубические B-сплайны задают waypoints траектории робота. Оптимизатор выбирает контрольные точки так, чтобы минимизировать jerk (производную ускорения). C² условие автоматически выполняется - не нужно добавлять его как ограничение в задачу оптимизации. Это экономит тысячи переменных в NLP-задаче.
Главное преимущество B-сплайнов перед интерполяционными сплайнами:
NURBS и применения в CAD
Полиномиальный B-сплайн не может нарисовать окружность точно - никогда, ни при каком числе точек. Потому что x(t)² + y(t)² = 1 - это не полиномиальное уравнение. Это алгебраический факт. NURBS обходит его элегантно: добавляет **веса** к контрольным точкам и использует рациональные функции (отношение полиномов).
1960-е: автопром рождает математику
Пьер Безье (Renault) и Поль де Кастельжо (Citroen) независимо изобрели кривые для проектирования кузовов автомобилей - без компьютеров, на бумаге. De Casteljau опубликовал позже, Bezier дал имя кривым. B-сплайны обобщили Безье, NURBS добавили веса для точных конических сечений. Сегодня NURBS - основа форматов STEP и IGES, на которых держится всё машиностроение.
**NURBS кривая:** C(t) = sum(i) w_i * P_i * N_{i,p}(t) / sum(j) w_j * N_{j,p}(t) где w_i > 0 - веса контрольных точек. **Non-Uniform** - узлы могут быть неравномерными **Rational** - отношение двух полиномиальных выражений При w_i = 1 для всех i -> обычный B-сплайн.
| Геометрия | Полиномиальный B-сплайн | NURBS |
|---|---|---|
| Прямая линия | Точно | Точно |
| Парабола | Точно | Точно |
| Окружность | Приближение | Точно |
| Эллипс | Приближение | Точно |
| Свободная форма | Точно | Точно |
NURBS в CAD - это не только красота. В аэрокосмическом ML-пайплайне: Rhino/Solidworks экспортирует NURBS-геометрию -> mesh generation (triangle mesh) -> FEM/CFD симуляция -> эти симуляции становятся training data для aerodynamic surrogate models (нейросеть, которая предсказывает drag за миллисекунды вместо часов CFD). Если геометрия задана точно через NURBS, mesh качественный, surrogate учится лучше.
Сплайн и кривая Безье - одно и то же
Кривая Безье - один полиномиальный сегмент. Сплайн - последовательность сегментов, соединённых условиями гладкости (C⁰/C¹/C²). B-сплайн - запись сплайна через базисные функции с автоматической гладкостью
Одна кривая Безье степени n определяется n+1 точками и не имеет стыков. Сплайн - много сегментов, «сшитых» с заданной гладкостью. Кубические кривые Безье - частный случай B-сплайна степени 3 с конкретным узловым вектором.
Почему NURBS может точно представить окружность, а полиномиальный B-сплайн - нет?
Ключевые идеи
- **Кубический сплайн:** кусочный полином степени 3 с C² гладкостью; решает феномен Рунге; трёхдиагональная система O(n)
- **B-сплайн:** базисные функции Cox-de Boor; локальный носитель; аппроксимация, не интерполяция; building block GAM и spline regression
- **NURBS:** рациональные B-сплайны с весами; единственный способ точно представить окружность/эллипс; стандарт CAD/CAM (STEP, IGES)
- **Гладкость Cᵏ:** «ease in/ease out» в Pixar - это C² условие в математической записи; выбор между PCHIP (C¹) и natural cubic (C²) - инженерное решение
Связанные темы
Сплайны опираются на интерполяцию и применяются в оптимизации и CAD:
- Интерполяция: Лагранж и Ньютон — Сплайны - ответ на феномен Рунге: низкая степень полинома + много сегментов
- Погрешности и floating point — Трёхдиагональные системы для сплайнов устойчивее полиномов высокой степени к cancellation
- Численное интегрирование — Сплайны - эффективная основа для квадратурных формул высокого порядка
Вопросы для размышления
- C² условие сплайна - это ровно то, что аниматор называет 'ease in / ease out'. Математически: вторая производная непрерывна в каждом узле. Что произойдёт с анимацией, если использовать C¹ (PCHIP) вместо C²?
- B-spline regression в Prophet задаёт тренд через changepoints. Как выбор числа узлов (knots) влияет на bias-variance tradeoff модели?
- NURBS-геометрия -> mesh -> FEM симуляция -> surrogate ML-модель. На каком этапе точность NURBS критична, а на каком достаточно приближения?
Связанные уроки
- nm-02 — Феномен Рунге - мотивация для кусочной интерполяции
- nm-01 — Трёхдиагональные системы решаются в float64 - важна устойчивость
- nm-04 — Квадратуры - интегрирование сплайнов точно и дёшево
- calc-16-taylor — Тейлор - локальное полиномиальное приближение, сплайн - кусочное
- la-15-svd — SVD лежит в основе сплайн-регрессии и GAM-моделей
- la-01-vectors-intro