【发布时间】:2020-04-28 19:51:22
【问题描述】:
假设我有
import numpy as np
from scipy.interpolate import UnivariateSpline
# "true" data; I don't know this function
x = np.linspace(0, 100, 1000)
d = np.sin(x * 0.5) + 2 + np.cos(x * 0.1)
# sample data; that's what I actually measured
x_sample = x[::20]
d_sample = d[::20]
# fit spline
s = UnivariateSpline(x_sample, d_sample, k=3, s=0.005)
plt.plot(x, d)
plt.plot(x_sample, d_sample, 'o')
plt.plot(x, s(x))
plt.show()
我明白了
我现在想要的是所有橙色点之间的函数,比如
knots = s.get_knots()
f0 = <some expression> for knots[0] <= x < knots[1]
f1 = <some expression> for knots[1] <= x < knots[2]
...
因此,fi 的选择方式应能再现样条拟合的形状。
我找到了here 的帖子,但在上面的示例中生成的样条线似乎不正确,而且它也不完全是我需要的,因为它不返回表达式。
如何将样条曲线变成分段函数?是否有一种(直截了当的)方式来表达每个间隔,例如作为多项式?
【问题讨论】:
-
我也没有弄清楚,但我的理解是困难在于将B样条基础的系数转换为您想要的标准幂基础的系数,它不像@那么容易987654328@。一旦你有了系数,它就是一个简单的应用程序,例如
np.polyeval和np.piecewise。看看this discussion 了解转换的技巧。 -
@stevemo:您能否详细说明
PPoly.from_spline部分?我不必使用UnivariateSpline,但任何给我fi的样条都可以,然后我确实可以输入piecewise。 -
我最终弄清楚并给出了完整的答案......如果需要可以编辑一下。
-
@stevemo:太好了,谢谢!今天没有时间再看它了,但明天会这样做,然后再回复你;因此,如果我沉默了一会儿,请不要感到惊讶... :)
标签: python numpy scipy piecewise