scipy.interpolate.make_interp_spline如何检索所有的系数?

scipy.interpolate.make_interp_spline how to retrieve all the coefficients?

我有以下程序:

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]

但是,我缺少 bcd[=32= 的数组] 系数。我如何提取这些?还是我缺少步骤?我阅读了关于 make_interp_spline 的 scipy 文档,但我不明白如何获取 bcd 系数.

我建议您查看 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 对象,它具有 spl.t 作为节点和 spl.c 系数 --- 在 b-spline基础。如果你真的需要幂基础中的系数,你可以评估使用PPoly.from_spline(spl)的导数。

或者确实使用在功率基础上工作的СubicSpline。 (请参阅@bogovicj 的回答)