我试图在边界处实现一个零斜率(平面外推)的夹紧三次样条,但我无法获得所需的结果。
例如设置:
x = [3 4 7 9];
y = [2 1 2 0.5];
我可以使用CSAPE函数来获得分段多项式
pp = csape(x,y,'variational');
接下来,评估[0-10]范围内的pp,
xx = 0:0.1:10;
yy =ppval(pp,xx);
plot(xx,yy)
然而,该方法不能在[3-9]范围之外实现平坦外推(即,对于x <3,y的所有值应该是2,并且对于x> 9,y的所有值应该是0.5)
有没有办法达到预期的效果?
编辑:应保留边界结的连续性
答案 0 :(得分:1)
我认为不需要使用csape
,您可以使用spline
。来自spline
的文档:
如果Y是包含两个值的向量,而x包含条目,则 Y中的第一个和最后一个值用作立方体的endlopes 花键。
此外,样条曲线允许您直接获取插值的yy
值,因此:
x = [3 4 7 9];
y = [2 1 2 0.5];
xx = 0:0.1:10;
yy = spline(x,[0 y 0], xx);
plot(xx,yy)
这给了我下面的情节。
观察这一点,边界处的斜率为零(x = 3且x = 9),这就是我们所要求的“边界处零梯度”的“夹紧”样条。如果您希望超出边界的零梯度,我建议您执行以下操作:
yy(xx<x(1)) = y(1);
yy(xx>x(length(x))) = y(length(y));
,并提供:
修改强>
这在结尾处给出了连续y
函数,但y'
在结尾处不平滑。如果您希望y
'平滑,则可以填充输入数组并将其用作spline
函数的输入。这会给你一些振荡,如下所示,这可能是也可能不是你想要的。
% Spline on padded input arrays
x = [0 1 2 3 4 7 9 10 11 12];
y = [2 2 2 2 1 2 0.5 0.5 0.5 0.5];
yy = spline(x,y, xx);