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]
但是,我缺少 b、c 和 d[=32= 的数组] 系数。我如何提取这些?还是我缺少步骤?我阅读了关于 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 对象,它具有 spl.t
作为节点和 spl.c
系数 --- 在 b-spline基础。如果你真的需要幂基础中的系数,你可以评估使用PPoly.from_spline(spl)
的导数。
或者确实使用在功率基础上工作的СubicSpline
。 (请参阅@bogovicj 的回答)
我有以下程序:
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[=32= 的数组] 系数。我如何提取这些?还是我缺少步骤?我阅读了关于 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 对象,它具有 spl.t
作为节点和 spl.c
系数 --- 在 b-spline基础。如果你真的需要幂基础中的系数,你可以评估使用PPoly.from_spline(spl)
的导数。
或者确实使用在功率基础上工作的СubicSpline
。 (请参阅@bogovicj 的回答)