繁体   English   中英

从 scipy.interpolate.splrep 获取三次样条的系数

[英]Getting coefficients of a cubic spline from scipy.interpolate.splrep

我正在使用 scipy.interpolate.splrep 进行三次样条插值,如下所示:

import numpy as np
import scipy.interpolate

x = np.linspace(0, 10, 10)
y = np.sin(x)

tck = scipy.interpolate.splrep(x, y, task=0, s=0)
F   = scipy.interpolate.PPoly.from_spline(tck)

我打印 t 和 c:

print F.x

array([  0.        ,   0.        ,   0.        ,   0.        ,
     2.22222222,   3.33333333,   4.44444444,   5.55555556,
     6.66666667,   7.77777778,  10.        ,  10.        ,
    10.        ,  10.        ])

print F.c

array([[ -1.82100357e-02,  -1.82100357e-02,  -1.82100357e-02,
     -1.82100357e-02,   1.72952212e-01,   1.26008293e-01,
     -4.93704109e-02,  -1.71230879e-01,  -1.08680287e-01,
      1.00658224e-01,   1.00658224e-01,   1.00658224e-01,
      1.00658224e-01],
   [ -3.43151441e-01,  -3.43151441e-01,  -3.43151441e-01,
     -3.43151441e-01,  -4.64551679e-01,   1.11955696e-01,
      5.31983340e-01,   3.67415303e-01,  -2.03354294e-01,
     -5.65621916e-01,   1.05432909e-01,   1.05432909e-01,
      1.05432909e-01],
   [  1.21033389e+00,   1.21033389e+00,   1.21033389e+00,
      1.21033389e+00,  -5.84561936e-01,  -9.76335250e-01,
     -2.60847433e-01,   7.38484392e-01,   9.20774403e-01,
      6.63563923e-02,  -9.56285846e-01,  -9.56285846e-01,
     -9.56285846e-01],
   [ -4.94881722e-18,  -4.94881722e-18,  -4.94881722e-18,
     -4.94881722e-18,   7.95220057e-01,  -1.90567963e-01,
     -9.64317117e-01,  -6.65101515e-01,   3.74151231e-01,
      9.97097891e-01,  -5.44021111e-01,  -5.44021111e-01,
     -5.44021111e-01]])

所以我提供了 x 数组:

array([  0.        ,   1.11111111,   2.22222222,   3.33333333,
     4.44444444,   5.55555556,   6.66666667,   7.77777778,
     8.88888889,  10.        ])

Q.1:Fx(结)与原始 x 数组不同并且具有重复值(可能强制一阶导数为零?)。 Fx 中还缺少 x (1.11111111, 8.88888889) 中的一些值有什么想法吗?

Q.2 Fc 的形状是 (4, 13)。 我知道 4 来自它是三次样条拟合的事实。 但我不知道如何为我想要的 9 个部分中的每一个选择系数(从 x = 0 到 x=1.11111,x = 1.111111 到 x = 2.222222 等等)。 在提取不同段的系数方面的任何帮助将不胜感激。

如果您想在曲线的特定位置创建结,您需要使用splrep的参数task=-1并给出一个内部结数组作为t参数。

t的节点必须满足以下条件:

如果提供,节点 t 必须满足 Schoenberg-Whitney 条件,即必须有一个数据点 x[j] 的子集,使得 t[j] < x[j] < t[j+k+1],对于 j =0, 1,...,nk-2。

请参阅此处的文档。

然后你应该得到以下大小的Fc (4, <length of t> + 2*(k+1)-1)对应于沿曲线的连续间隔( k+1节点添加在曲线的任一端splrep )。

请尝试以下操作:

import numpy as np
import scipy.interpolate

x = np.linspace(0, 10, 20)
y = np.sin(x)

t = np.linspace(0, 10, 10)

tck = scipy.interpolate.splrep(x, y, t=t[1:-1])

F   = scipy.interpolate.PPoly.from_spline(tck)

print(F.x)
print(F.c)

# Accessing coeffs of nth segment: index = k + n - 1
# Eg. for second segment:
print(F.c[:,4])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM