gpt4 book ai didi

python - 从结和系数创建 BSpline

转载 作者:行者123 更新时间:2023-12-01 01:35:55 24 4
gpt4 key购买 nike

如果只知道点和系数,如何创建样条曲线?我在这里使用 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

最佳答案

The fine print under get_knots说:

Internally, the knot vector contains 2*k additional boundary knots.

这意味着,要从 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 样条需要一些空间来构建,因为它们 inductive definition这要求在我们定义第 k 度样条线的每个区间周围都存在 (k-1) 度样条线。

关于python - 从结和系数创建 BSpline,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52393145/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com