我想通过 scipy 计算样条插值的系数。 在 MATLAB 中:
x=[0:3];
y=[0,1,4,0];
spl=spline(x,y);
disp(spl.coefs);
它会返回:
ans =
-1.5000 5.5000 -3.0000 0
-1.5000 1.0000 3.5000 1.0000
-1.5000 -3.5000 1.0000 4.0000
但我不能通过 scipy 中的 interpolate.splrep 做到这一点。你能告诉我如何计算吗?
最佳答案
我不确定是否有任何方法可以从 scipy 中准确获取这些系数。 scipy.interpolate.splrep
给你的是 b 样条的节点系数。 Matlab 的样条给你的似乎是描述连接你传入的点的三次方程的部分多项式系数,这让我相信 Matlab 样条是基于控制点的样条,例如 Hermite 或 Catmull-Rom 而不是b 样条。
但是,scipy.interpolate.interpolate.spltopp
确实提供了一种获取 b 样条曲线的部分多项式系数的方法。不幸的是,它似乎不是很好用。
>>> import scipy.interpolate
>>> x = [0, 1, 2, 3]
>>> y = [0, 1, 4, 0]
>>> tck = scipy.interpolate.splrep(x, y)
>>> tck
Out:
(array([ 0., 0., 0., 0., 3., 3., 3., 3.]),
array([ 3.19142761e-16, -3.00000000e+00, 1.05000000e+01,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00]),
3)
>>> pp = scipy.interpolate.interpolate.spltopp(tck[0][1:-1], tck[1], tck[2])
>>> pp.coeffs.T
Out:
array([[ -4.54540394e-322, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000],
[ -4.54540394e-322, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000],
[ -4.54540394e-322, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000],
[ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000],
[ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000]])
请注意,每个节点都有一组系数,而不是每个传入的原始点都有一组系数。此外,将系数乘以 b 样条基矩阵似乎也没什么用。
>>> bsbm = array([[-1, 3, -3, 1], [ 3, -6, 3, 0], [-3, 0, 3, 0],
[ 1, 4, 1, 0]]) * 1.0/6
Out:
array([[-0.16666667, 0.5 , -0.5 , 0.16666667],
[ 0.5 , -1. , 0.5 , 0. ],
[-0.5 , 0. , 0.5 , 0. ],
[ 0.16666667, 0.66666667, 0.16666667, 0. ]])
>>> dot(pp.coeffs.T, bsbm)
Out:
array([[ 7.41098469e-323, -2.27270197e-322, 2.27270197e-322,
-7.41098469e-323],
[ 7.41098469e-323, -2.27270197e-322, 2.27270197e-322,
-7.41098469e-323],
[ 7.41098469e-323, -2.27270197e-322, 2.27270197e-322,
-7.41098469e-323],
[ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000],
[ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000]])
FORTRAN 分段多项式包,PPPack ,有一个命令 bsplpp
可以将 B 样条曲线转换为分段多项式形式,这可能会满足您的需要。不幸的是,目前没有用于 PPPack 的 Python 包装器。
关于python - scipy中样条插值的系数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13384859/