带平面外推的夹紧三次样条

Clampled cubic splines with flat extrapolation

我正在尝试在边界节点处实现零斜率(平坦外推)的钳位三次样条,但我无法获得所需的结果。

例如设置:

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)

有什么方法可以达到想要的效果吗?

编辑: 应保留边界节点处的连续性

我觉得没必要用csape,用spline就可以了。来自 spline 的文档:

If Y is a vector that contains two more values than x has entries, the first and last value in Y are used as the endslopes for the cubic spline.

此外,样条允许您直接获得内插的 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),这就是我们要求的边界处梯度为零的 'clamped' 样条。如果您希望边界之外的梯度为零,我建议您只执行以下操作:

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

给予:

编辑

这在 end-knots 处给出了一个连续的 y 函数,但是 y' 在 end-knots 处并不平滑。如果您希望 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);