带平面外推的夹紧三次样条
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);
我正在尝试在边界节点处实现零斜率(平坦外推)的钳位三次样条,但我无法获得所需的结果。
例如设置:
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);