python - scipy中样条插值的系数

标签 python matlab scipy

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

相关文章:

python - 不支持的操作数类型 - : 'list' and 'int'

python - 无法将 Django 应用程序部署到 Heroku : name 'install' is not defined

matlab - 我们可以更新或扩展 varargin 吗?

python - 如何将函数作为参数? (Python)

python - ODR错误: fcn does not output [n]-shaped array

python - 如何用sklearn获得所有三个SVD矩阵?

python - PyQt5 网格布局为大部件扩展,但不为小部件收缩

python - python中减去两个数组,类似于matlab中的bsxfun

Matlab打印垫

python - 构建开发者版本的 scipy