带有平面外推的凹陷三次样条

时间:2016-03-04 10:11:17

标签: matlab curve-fitting extrapolation cubic-spline

我试图在边界处实现一个零斜率(平面外推)的夹紧三次样条,但我无法获得所需的结果。

例如设置:

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) 

enter image description here

然而,该方法不能在[3-9]范围之外实现平坦外推(即,对于x <3,y的所有值应该是2,并且对于x> 9,y的所有值应该是0.5)

有没有办法达到预期的效果?

编辑:应保留边界结的连续性

1 个答案:

答案 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)

这给了我下面的情节。

Spline Plot

观察这一点,边界处的斜率为零(x = 3且x = 9),这就是我们所要求的“边界处零梯度”的“夹紧”样条。如果您希望超出边界的零梯度,我建议您执行以下操作:

yy(xx<x(1)) = y(1);
yy(xx>x(length(x))) = y(length(y));

,并提供:

enter image description here

修改

这在结尾处给出了连续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);

enter image description here