
本文介绍如何通过插值对齐两条长度不同的曲线,并准确计算其在公共横坐标下的最大相对误差,适用于仿真结果对比等场景。
本文介绍如何通过插值对齐两条长度不同的曲线,并准确计算其在公共横坐标下的最大相对误差,适用于仿真结果对比等场景。
在科学计算与仿真分析中,常需比较两条由不同网格或步长生成的曲线(如有限元仿真中20节点与30节点解),但二者x坐标不一致、数据点数量不同,无法直接逐点作差。此时,**核心思路是统一横坐标基准——通过插值将两条曲线映射到同一组高密度、覆盖共域的x轴上,再逐点计算相对误差**。具体实现推荐使用 scipy.interpolate.interp1d 进行一维插值。假设曲线A和B分别由 (x_a, y_a) 和 (x_b, y_b) 表示(长度分别为20和30),步骤如下:
- 确定公共定义域:取 x_min = max(x_a.min(), x_b.min()) 与 x_max = min(x_a.max(), x_b.max()),确保只在两者均有定义的重叠区间内比较(避免外推引入偏差);
- 构建统一插值网格:例如生成 N=1000 个等距x点 x_common = np.linspace(x_min, x_max, 1000);
-
插值得到对齐纵坐标:
from scipy.interpolate import interp1d import numpy as np
假设已加载数据
f_a = interp1d(x_a, y_a, kind='linear', bounds_error=False, fill_value=np.nan) f_b = interp1d(x_b, y_b, kind='linear', bounds_error=False, fill_value=np.nan)
y_a_interp = f_a(x_common) y_b_interp = f_b(x_common)
过滤掉插值无效区域(如边界外)
valid_mask = ~np.isnan(y_a_interp) & ~np.isnan(y_b_interp) & (y_b_interp != 0) y_a_valid = y_a_interp[valid_mask] y_b_valid = y_b_interp[valid_mask]
计算相对误差:|A - B| / |B|
rel_error = np.abs(y_a_valid - y_b_valid) / np.abs(y_b_valid) max_rel_error = np.max(rel_error)
⚠️ 注意事项: - 插值类型建议优先选 `'linear'`(稳健)或 `'cubic'`(若原始数据光滑且需更高精度); - 必须限制在x轴重叠区间内计算,否则外推结果不可靠; - 当 `y_b` 存在接近零值时,相对误差易失真,可添加小量 `eps = 1e-12` 避免除零:`/ (np.abs(y_b_valid) + eps)`; - 若原始数据带噪声,可考虑先平滑(如Savitzky-Golay)再插值,提升误差评估鲁棒性。 该方法本质是将“不同分辨率的离散曲线”升维至同一连续表征空间,从而实现严格意义上的逐点误差量化,是工程验证与收敛性分析的标准实践。


















