scipy.interpolate.splrep,s = 0个重复的端点,不包括相邻的端点

时间:2015-12-28 23:39:28

标签: python numpy scipy interpolation spline

我正在尝试使用Python的SciPy包来通过一些数据制作样条曲线。在提到问题here时,我认为在使用interpolate.splrep的开始和结束时存在重复结的原因是因为它正在制作一个钳位样条。我希望结知道数据(s = 0)。 splrep的输出重复每个4x的第一个和最后一个结(如上面的问题所示),它包括内部数据点作为结除了第二个点和倒数第二个点。这是一个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样条的内容并将端点重复为结点,从而排除了将相邻数据点作为结点使用到终点?

1 个答案:

答案 0 :(得分:1)

这是b样条的所谓非结边界条件。样条仍然通过所有数据点(检查:try splev(x, tck) - y。这里有两件事情:1)立方b样条基元素需要5节;要在x[0]定义一个样条,你填充数据点---因此在开头重复一个值,同样在结尾处。 2)对于三次样条,由拟合确定的系数的数量和条件的数量(要插入的数据点的数量)相差2。您可以提出两个额外的条件(例如,指定末尾导数的值或要求在基本区间的边缘处二阶导数为零)或者在倒数第二个点处需要额外的平滑度 - 因此这个名字不是一个结。