Создать BSpline из узлов и коэффициентов - PullRequest
0 голосов
/ 18 сентября 2018

Как создать сплайн, если известны только точки и коэффициенты?Я использую scipy.interpolate.BSpline здесь, но я открыт и для других стандартных пакетов.Поэтому я хочу дать кому-то только эти короткие массивы коэффициентов, чтобы они могли воссоздать данные.См. Неисправную красную пунктирную кривую ниже.

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import BSpline, LSQUnivariateSpline

x = np.linspace(0, 10, 50) # x-data
y = np.exp(-(x-5)**2/4)    # y-data

# define the knot positions

t = [1, 2, 4, 5, 6, 8, 9]

# get spline fit

s1 = LSQUnivariateSpline(x, y, t)

x2 = np.linspace(0, 10, 200) # new x-grid
y2 = s1(x2) # evaluate spline on that new grid

# FAILED: try to construct BSpline using the knots and coefficients

k = s1.get_knots()
c = s1.get_coeffs()
s2 = BSpline(t,c,2)

# plotting

plt.plot(x, y, label='original')
plt.plot(t, s1(t),'o', label='knots')
plt.plot(x2, y2, '--', label='spline 1')
plt.plot(x2, s2(x2), 'r:', label='spline 2') 
plt.legend()

enter image description here

1 Ответ

0 голосов
/ 19 сентября 2018

Мелкий шрифт под get_knots гласит:

Внутри вектор узлов содержит 2 * k дополнительных граничных узлов.

Тоозначает, что для получения пригодного массива узлов из get_knots необходимо добавить k копий левого граничного узла в начале массива и k копий правого граничного узла в конце.Здесь k - это степень сплайна, которая обычно равна 3 (вы запросили LSQUnivariateSpline степени по умолчанию, так что это 3).Итак:

kn = s1.get_knots()
kn = 3*[kn[0]] + list(kn) + 3*[kn[-1]]
c = s1.get_coeffs()
s2 = BSpline(kn, c, 3)    # not "2" as in your sample; we are working with a cubic spline 

Теперь сплайн s2 такой же, как и s1:

splines

Эквивалентно, kn = 4*[x[0]] + t + 4*[x[-1]] будет работать: ваш список t содержит только внутренние узлы, поэтому добавляются x[0] и x[-1], а затем каждый повторяется k раз больше.

Математическая причина повторения заключается в том, что B-сплайны нуждаются внекоторое пространство для постройки, благодаря их индуктивному определению , которое требует сплайнов (k-1) градусов вокруг каждого интервала, в котором мы определяем сплайн k степени.

...