29.1一维插值

Octave支持几种一维插值方法,大多数方法将在本节中介绍。Polynomial InterpolationInterpolation on Scattered Data描述其他方法。

 
: yi = interp1 (x, y, xi)
: yi = interp1 (y, xi)
: yi = interp1 (…, method)
: yi = interp1 (…, extrap)
: yi = interp1 (…, "left")
: yi = interp1 (…, "right")
: pp = interp1 (…, "pp")

一维插值。

插入输入数据以确定的值yi在点上xi如果没有指定,x被视为的指数y(1:长度(y)). 如果y是矩阵或N维射线,对的每列执行插值y.

插值method是其中之一:

"nearest"

返回最近的邻居。

"previous"

返回上一个邻居。

广告
"next"

返回下一个邻居。

广告
"linear"默认

最近邻居的线性插值。

广告
"pchip"

分段三次Hermite插值多项式——一阶导数光滑的保形插值。

广告
"cubic"

三次插值(与"pchip").

广告
"spline"

三次样条插值——平滑贯穿曲线的一阶导数和二阶导数。

广告

将“*”添加到上述任何方法的开头interp1假设x均匀间隔,且仅x1.x2.被引用。这通常更快,而且永远不会更慢。默认方法为"linear".

如果extrap是字符串"extrap",然后使用当前method如果extrap为anumber,则用该数字替换端点之外的值。当未指定时,extrap默认为NA.

如果字符串参数"pp"xi不应提供,并且interp1返回一个分段多项式对象。此对象以后可以与一起使用ppval以评估插值。有一个等价物,这样ppval(interp1(x,y, method, "pp"), xi)==interp1(x,y, xi, method, "extrap").

中的重复点x指定不连续的插入剂。最多可以有2个具有相同值的连续点。如果x正在增加,默认的不连续插入点是右连续的。如果x正在减少,默认的间断插入保持连续。插入装置的连续性条件可以通过使用参数来指定"left""right"以分别选择左连续插入物或右连续插入物。不连续插值只允许用于"nearest""linear"方法;在所有其他情况下x-值必须是唯一的。

的使用示例interp1

xf = [0:0.05:10];
yf = sin (2*pi*xf/5);
xp = [0:10];
yp = sin (2*pi*xp/5);
lin = interp1 (xp, yp, xf);
near = interp1 (xp, yp, xf, "nearest");
pch = interp1 (xp, yp, xf, "pchip");
spl = interp1 (xp, yp, xf, "spline");
plot (xf,yf,"r", xf,near,"g", xf,lin,"b", xf,pch,"c", xf,spl,"m",
      xp,yp,"r*");
legend ("original", "nearest", "linear", "pchip", "spline");

详见: pchip, spline, interpft, interp2, interp3, interpn.

广告

各种插值方法之间有一些重要的区别。这个"spline"方法强制插值的一阶导数和二阶导数都具有连续导数,而其他方法则没有。这意味着的结果"spline"方法通常更平滑。如果要插值的函数实际上是光滑的,那么"spline"会取得优异成绩。然而,如果要评估的函数在某种程度上是不连续的,那么"pchip"插值可能会给出更好的结果。

这可以通过代码来证明

t = -2:2;
dt = 1;
ti =-2:0.025:2;
dti = 0.025;
y = sign (t);
ys = interp1 (t,y,ti,"spline");
yp = interp1 (t,y,ti,"pchip");
ddys = diff (diff (ys)./dti) ./ dti;
ddyp = diff (diff (yp)./dti) ./ dti;
figure (1);
plot (ti,ys,"r-", ti,yp,"g-");
legend ("spline", "pchip", 4);
figure (2);
plot (ti,ddys,"r+", ti,ddyp,"g*");
legend ("spline", "pchip");

其结果可以在中看到图29.1图29.2.

interpderiv1

图29.1:的比较"pchip""spline"astep函数的插值方法

interpderiv2

图29.2:的二阶导数的比较"pchip""spline"阶跃函数的插值方法

傅立叶插值是一种重采样技术,将信号转换到频域,用零填充,然后再转换到时域。

 
: y = interpft (x, n)
: y = interpft (x, n, dim)

傅立叶插值。

如果x是向量,那么x使用重新采样n点。中的数据x假定是等距的。如果x是矩阵或N维数组,对的每列执行插值x.

如果dim指定,然后按尺寸插入dim.

interpft假设插值函数是周期性的,并对插值的端点进行假设。

详见: interp1.

广告

傅立叶插值有两个显著的局限性。首先,假设函数信号是周期性的,因此非周期性信号在边缘处表现不佳。其次,信号及其插值都需要在等空间点进行采样。的使用示例interpft

t = 0 : 0.3 : pi; dt = t(2)-t(1);
n = length (t); k = 100;
ti = t(1) + [0 : k-1]*dt*n/k;
y = sin (4*t + 0.3) .* cos (3*t - 0.1);
yp = sin (4*ti + 0.3) .* cos (3*ti - 0.1);
plot (ti, yp, "g", ti, interp1 (t, y, ti, "spline"), "b", ...
      ti, interpft (y, k), "c", t, y, "r+");
legend ("sin(4t+0.3)cos(3t-0.1)", "spline", "interpft", "data");

这证明了傅立叶插值对非周期函数的不良行为,如中所示图29.3.

interpft

图29.3:的比较interp1interpft对于非周期性数据

此外,支持函数splinelookup的基础interp1函数可以直接调用。

 
: pp = spline (x, y)
: yi = spline (x, y, xi)

返回点的三次样条插值xy.

当使用两个参数调用时,返回分段多项式pp可以与一起使用ppval以在特定点处多项式求值。

当用第三输入自变量调用时,spline计算点处的样条曲线xi.第三种呼叫形式样条曲线(x, y, xi)相当于ppval(样条曲线(x, y), xi).

变量x必须是长度的向量n.

y可以是向量或数组。如果y是一个向量,它的长度必须为nn2.。如果的长度yn,然后"not-a-knot"使用结束条件。如果的长度yn2.,然后是向量的第一个值和最后一个值y是三次样条曲线在端点处的一阶导数的值。

如果y是一个数组,那么的大小y必须具有表单[s1, s2, …, sk, n][s1, s2, …, sk, n2.。数组内部被重塑为矩阵,其中前导尺寸从s1 * s2* … * sk然后将该矩阵的每一行分别处理。请注意,这恰好与相反interp1但已经结束了MATLAB兼容性。

详见: pchip, ppval, mkpp, unmkpp.

广告

版权所有 © 2024-2025 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2