分段线性插值通过两个平行数组存储有序离散点,对查询点x₀遍历定位其所在区间[i,i+1],再用两点式直线公式计算y₀,逻辑清晰、无需外部库,适用于嵌入式、前端及教学场景。

用数组实现分段线性插值,核心是把已知的离散点(x, y)存成两个平行数组,再对任意查询 x₀ 找到它落在哪两个相邻 x 值之间,最后用两点式直线公式算出对应的 y₀。不需要额外库,纯逻辑清晰、代码轻量,适合嵌入式、前端计算或教学演示。
准备数据:用两个数组存支撑点
假设有 n 个已知采样点,按 x 升序排列(必须!否则插值会错):
- xPoints = [0, 2, 5, 8, 10] —— 横坐标(自变量),如温度、时间、电压等
- yPoints = [1, 3, 7, 6, 9] —— 对应纵坐标(因变量),如响应值、测量结果等
这两个数组长度一致,且 xPoints 必须严格递增。若原始数据无序,先同步排序(比如用索引绑定后快排)。
查找区间:定位 x₀ 落在哪一段上
对要预测的 x₀(比如 x₀ = 4.3),遍历 xPoints,找最大的 i,使得 xPoints[i] ≤ x₀
- 线性扫描:适合点少(
- 二分查找:点较多时更高效(O(log n)),注意边界处理(x₀ 小于首值或大于末值时需外推或报错)
例如 x₀ = 4.3 → 查得 i = 1(因 xPoints[1]=2 ≤ 4.3
执行插值:套用直线斜率公式
在区间 [xᵢ, xᵢ₊₁] 上,y 随 x 线性变化,公式为:
y₀ = yᵢ + (yᵢ₊₁ − yᵢ) × (x₀ − xᵢ) / (xᵢ₊₁ − xᵢ)
代入上例:i=1 → xᵢ=2, yᵢ=3;xᵢ₊₁=5, yᵢ₊₁=7;x₀=4.3
y₀ = 3 + (7−3) × (4.3−2) / (5−2) = 3 + 4 × 2.3 / 3 ≈ 3 + 3.0667 ≈ 6.067
这就是 x=4.3 处的预测值。整个过程只依赖四则运算,无浮点陷阱,稳定可靠。
边界与鲁棒性处理(实战必加)
真实场景中不能假设 x₀ 总在范围内,建议补充:
- 若 x₀ ≤ xPoints[0]:返回 yPoints[0](左端点值)或按斜率外推(需额外逻辑)
- 若 x₀ ≥ xPoints[n−1]:返回 yPoints[n−1] 或外推
- 若 xPoints 中有重复值(xᵢ == xᵢ₊₁):跳过该段,避免除零;或提前去重合并 y 值
- 可封装为函数,输入 xPoints、yPoints、x₀,输出 y₀,支持单值/数组批量预测
这样一段不到 20 行的 JavaScript 或 Python 函数,就能替代大部分轻量级查表+插值需求。

















