跳到主要内容

分段线性插值

一、直观理解:把折线当成最简单的连续化​

分段线性插值(piecewise linear interpolation)在相邻数据点之间用直线连接,整条曲线是一条折线:在节点处连续,但一般在节点处不可导。

它像用直尺把描点连起来。虽然不够光滑,但计算极快、实现极稳,不会像高次多项式那样在端点附近剧烈摆动。查表、粗略重采样、画数据趋势的第一版曲线时,它往往是默认起点。

二、适用场景与优缺点​

类型说明
适用场景节点有序且间隔合理;只需 C0C^0 连续;需要快速、稳健的内插;作为更复杂方法的对照基线。
核心优点公式简单、无需求解全局方程组;局部性好(改一个点只影响相邻两段);数值稳定;易处理。
局限与缺点导数不连续,曲线“有棱角”;对曲率大的区域逼近误差偏大;不适合需要光滑梯度的后续优化;外推通常用端点斜率延长,风险高。

使用前应确认:

  1. 自变量是否可排序且无重复(或重复点如何合并);
  2. 是否需要光滑性(若需要,改用样条);
  3. 数据噪声是否很大(噪声大时插值会穿噪,应考虑平滑/拟合)。

三、核心原理:区间内的一次多项式​

设节点 x0<x1<⋯<xnx_0<x_1<\cdots<x_n,对应值 yi=f(xi)y_i=f(x_i)。对 x∈[xi,xi+1]x\in[x_i,x_{i+1}],

P(x)=yi+yi+1−yixi+1−xi(x−xi)P(x)=y_i+\frac{y_{i+1}-y_i}{x_{i+1}-x_i}(x-x_i)

1. 误差直觉​

若 f∈C2f\in C^2,在区间上存在 ξ\xi 使

f(x)−P(x)=f′′(ξ)2(x−xi)(x−xi+1)f(x)-P(x)=\frac{f''(\xi)}{2}(x-x_i)(x-x_{i+1})

因此局部误差与步长平方及二阶导有关:网格越密、函数越接近直线,误差越小。

2. 算法要点​

  • 先用二分查找定位 xx 所在区间;
  • 再套用一次公式;
  • 对向量 xx 可批量插值。

四、实现中的关键决策​

  • 越界处理:报错、端点常量外推,还是线性外推;
  • 重复节点:取平均、保留首末,还是视为阶跃;
  • 是否保单调:分段线性本身保单调(若数据单调);
  • 与数值积分结合:对折线积分就是梯形公式。

五、MATLAB 示例​

%% 分段线性插值:sin 函数节点
x = linspace(0, 2*pi, 8); % 粗节点
y = sin(x);

xq = linspace(0, 2*pi, 200); % 查询点
yq = interp1(x, y, xq, "linear");

% 真值与误差
yTrue = sin(xq);
rmse = sqrt(mean((yq - yTrue).^2));

figure;
plot(xq, yTrue, "k-", "LineWidth", 1); hold on;
plot(xq, yq, "b-", "LineWidth", 1.2);
plot(x, y, "ro", "MarkerFaceColor", "r");
grid on;
xlabel("x"); ylabel("y");
title(sprintf("分段线性插值(RMSE = %.4f)", rmse));
legend("真值 sin(x)", "线性插值", "节点", "Location", "best");

%% 演示外推选项
xq2 = linspace(-0.5, 2*pi+0.5, 50);
y_extrap = interp1(x, y, xq2, "linear", "extrap");
y_clip = interp1(x, y, xq2, "linear", NaN); % 越界为 NaN
fprintf("外推首点 = %.3f,截断首点为 NaN? %d\n", ...
y_extrap(1), isnan(y_clip(1)));

手工实现单点插值(便于理解):

function yi = piecewiseLinear(x, y, xq)
% 假定 x 严格递增
if xq <= x(1)
yi = y(1); return;
end
if xq >= x(end)
yi = y(end); return;
end
i = find(x <= xq, 1, "last");
t = (xq - x(i)) / (x(i+1) - x(i));
yi = (1-t)*y(i) + t*y(i+1);
end

x = [0 1 2 4];
y = [1 2 0 3];
fprintf("x=1.5 处插值 = %.3f\n", piecewiseLinear(x,y,1.5));

六、如何解释结果​

报告时说明:

  1. 节点来源与是否排序、去重;
  2. 插值方法为分段线性及越界策略;
  3. 若有真值或交叉验证,给出误差;
  4. 曲线不光滑是否影响后续分析;
  5. 是否仅在凸包/数据范围内使用。

若折线已足够支撑结论(例如粗略数量级比较),不必强行上高阶方法。

七、常见误区​

1. 对噪声数据强行插值​

测量误差会被当成真实结构,折线会抖动。应先平滑或改拟合。

2. 未排序直接插值​

interp1 要求 xx 单调。乱序会报错或得到错误结果。

3. 盲目外推​

超出端点后线性延长没有信息保证,需谨慎标注。

4. 与“线性回归”混淆​

分段线性插值穿过所有点;线性回归是全局拟合,一般不穿过所有点。

附:建模流程中的落地清单(分段线性插值)​

要把方法真正写进论文,建议补齐以下模块,而不是只贴一个最终数字。

1. 问题对齐与假设​

说明题目中的输入/输出如何映射到本方法,并显式列出关键假设。假设越清楚,后面的敏感性分析越有对象。

2. 关键关系​

区间 [xi,xi+1][x_i,x_{i+1}] 上 P(x)=yi+yi+1−yixi+1−xi(x−xi)P(x)=y_i+\frac{y_{i+1}-y_i}{x_{i+1}-x_i}(x-x_i);局部误差与 h2f′′h^2 f'' 同阶。

3. 补充实现片段​

x=0:0.5:3; y=sin(x); xq=linspace(0,3,50); yq=interp1(x,y,xq,'linear'); plot(x,y,'o',xq,yq,'-'); grid on;

4. 报告要素​

节点、越界策略、误差(若有真值)、是否仅在数据范围内使用。

5. 不适用情形​

噪声很大仍强行过点;未排序节点;把外推当内插。

6. 与验证章节的衔接​

至少做一项:参数扰动、与基线方法对照、极限情形检查。把“方法正文”和“全局方法论(第15门类)”连起来,结论才站得住。

八、小结​

分段线性插值用折线连接有序节点,是最稳定、最易解释的插值基线。它牺牲光滑性,换来局部性与稳健性。当问题需要尖角可接受的连续曲线时,它应是首选;当需要连续导数或更高精度时,再升级到三次样条或 B 样条。