Octave支持几种一维插值方法,大多数方法将在本节中介绍。Polynomial Interpolation和Interpolation 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:的比较"pchip"和"spline"astep函数的插值方法
图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.
图29.3:的比较interp1和interpft对于非周期性数据
此外,支持函数spline和lookup的基础interp1函数可以直接调用。
pp = spline (x, y) ¶yi = spline (x, y, xi) ¶返回点的三次样条插值x和y.
当使用两个参数调用时,返回分段多项式pp可以与一起使用ppval以在特定点处多项式求值。
当用第三输入自变量调用时,spline计算点处的样条曲线xi.第三种呼叫形式样条曲线(x, y, xi)相当于ppval(样条曲线(x, y), xi).
变量x必须是长度的向量n.
y可以是向量或数组。如果y是一个向量,它的长度必须为n或n2.。如果的长度y是n,然后"not-a-knot"使用结束条件。如果的长度y是n2.,然后是向量的第一个值和最后一个值y是三次样条曲线在端点处的一阶导数的值。
如果y是一个数组,那么的大小y必须具有表单[s1, s2, …, sk, n]或[s1, s2, …, sk, n2.。数组内部被重塑为矩阵,其中前导尺寸从s1 * s2* … * sk然后将该矩阵的每一行分别处理。请注意,这恰好与相反interp1但已经结束了MATLAB兼容性。
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2