我正在尝试使用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样条的内容并将端点重复为结点,从而排除了将相邻数据点作为结点使用到终点?
答案 0 :(得分:1)
这是b样条的所谓非结边界条件。样条仍然通过所有数据点(检查:try splev(x, tck) - y
。这里有两件事情:1)立方b样条基元素需要5节;要在x[0]
定义一个样条,你填充数据点---因此在开头重复一个值,同样在结尾处。 2)对于三次样条,由拟合确定的系数的数量和条件的数量(要插入的数据点的数量)相差2。您可以提出两个额外的条件(例如,指定末尾导数的值或要求在基本区间的边缘处二阶导数为零)或者在倒数第二个点处需要额外的平滑度 - 因此这个名字不是一个结。