scipy.interpolate.splrep s=0 重复端点并排除相邻

scipy.interpolate.splrep with s=0 duplicate endpoints and excluding adjacent

我正在尝试使用 Python 的 SciPy 包通过一些数据制作样条曲线。参考问题here,我认为使用interpolate.splrep开头和结尾有重复结的原因是它正在制作一个夹紧的样条。我想让结穿过数据 (s=0)。 splrep 的输出重复第一个和最后一个结 4x(如上面的问题),它包括内部数据点作为结 except 第二个点和倒数第二个点。这是一个 MWE:

import math
import numpy as np
import scipy.interpolate
import matplotlib.pyplot as plt

x_dec = np.array([ 3.0289979374768700e-01, 3.0280333252410779e-01, 3.0270688524899364e-01,
    3.0261045192336944e-01, 3.0251403254826026e-01, 3.0241762712469000e-01,
    3.0232123565368257e-01, 3.0222485813626193e-01, 3.0212849457345037e-01])
# Make monotonically increase
x_inc = math.pi/2 - x_dec
print x_inc
y = np.array([0.914024505, 0.914049905, 0.914075289, 0.914100656, 0.914126008, 0.914151343,
    0.914176662, 0.914201964, 0.91422725])

spl_tck = scipy.interpolate.splrep(x_inc,y,k=3,s=0.0)
# Print the knots
print spl_tck[0]

这是输出:

[ 1.26789653  1.26799299  1.26808944  1.26818587  1.26828229  1.2683787 1.26847509  1.26857147  1.26866783]

[ 1.26789653  1.26789653  1.26789653  1.26789653  1.26808944  1.26818587 1.26828229  1.2683787   1.26847509  1.26866783  1.26866783  1.26866783 1.26866783]

第一行是数据,第二行是节点。如您所见,节点重复第一个和最后一个数据点(x_inc[0]x_inc[-1])。那么数据点x_inc[2]x_inc[-3]都是结点。但是,数据点 x_inc[1]x_inc[-2] 作为结点被跳过。

我认为指定 s=0 会强制样条曲线通过所有点。是否有关于 B 样条并将端点重复为结点的问题,从而排除了将端点的相邻数据点用作结点?

这是 so-called not-a-knot b-splines 的边界条件。样条曲线仍然通过所有数据点(检查它:尝试 splev(x, tck) - y。这里有两件事在起作用:1)立方体 b-spline 基元需要五个结;要在 x[0] 处定义一个样条曲线,您需要填充数据点 --- 因此在开头有一个重复值,在结尾处也是如此。 2)对于三次样条,由拟合确定的系数数和条件数(要插值的数据点数)相差两个。您可以提出两个额外的条件(例如,指定端导数的值或要求二阶导数在基区间的边缘为零)或要求在 second-to-last 点的第二个额外的平滑度 -因此得名 not-a-knot.