问题描述
我有以下程序:
nknots = 4
x_i = [0,1,2,3]
y_i = [1,np.exp(1),np.exp(2),np.exp(3)]
coeff = interpolate.make_interp_spline(x_i,y_i,bc_type="natural")
我想使用其坐标由x_i和y_i数组给定的结构造三次样条。但是,我很难获得所有系数。三次样条函数具有以下形式:
y_i(x) = a + b*(x - x_i) + c*(x - x_i)^2 + d*(x - x_i)^3
当我这样做
print(coeff(x_i))
我只得到 a 值的数组:
[ 1. 2.71828183 7.3890561 20.08553692]
但是,我缺少 b , c 和 d 系数的数组。我该如何提取?还是我缺少步骤?我阅读了关于make_interp_spline的scipy文档,但不了解如何获取 b , c 和 d 系数。
解决方法
我建议您检出interpolate.CubicSpline
。如果您追求的是多项式系数,则更加方便。使用变量:
spl = interpolate.CubicSpline( x_i,y_i )
spl.c
array([[-1.57973952e-01,2.93118310e-01,-1.35144359e-01],[ 1.11022302e-16,-4.73921855e-01,4.05433076e-01],[-3.01723742e-01,-7.75645598e-01,-8.44134377e-01],[ 1.00000000e+00,5.40302306e-01,-4.16146837e-01]])
有关分段多项式系数的存储方式,请参见PPoly
文档。
附录:
从make_interp_spline
的输出中提取系数是可能的,但是这并不简单,它需要@ ev-br描述的额外步骤,因为“系数”用于 B 样条曲线(B上的强调点)与多项式系数不同。
给定spl = make_interp_spline(...)
,spl
是一个BSpline对象,以b样条为基础,具有spl.t
作为结,spl.c
的系数。如果您确实需要基于幂的系数,则可以评估使用PPoly.from_spline(spl)
的导数。
或者确实使用СubicSpline
,它在功率基础上起作用。 (请参阅@bogovicj的答案)