0

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

例如设置:

x = [3 4 7 9];
y = [2 1 2 0.5];

我可以使用 CSPE 函数来获得分段多项式

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)

有什么方法可以达到预期的效果吗?

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

4

1 回答 1

1

我认为没有必要使用csape,你可以使用spline。从文档中spline

如果 Y 是包含比 x 条目多两个值的向量,则 Y 中的第一个和最后一个值用作三次样条的端坡。

此外,样条曲线允许您直接获取插值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);

在此处输入图像描述

于 2016-03-04T11:59:11.903 回答