gpt4 book ai didi

python - scipy中样条插值的系数

转载 作者:太空狗 更新时间:2023-10-29 18:04:01 26 4
gpt4 key购买 nike

我想通过 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com