如何在Python中计算不同点数曲线间的最大相对误差?
Python计算不同点数曲线的最大相对误差
核心逻辑
要对比两条数据点数量不同的曲线,首先得把它们对齐到相同的x坐标集合上。完全可以基于数据点较少的曲线A来处理:对曲线B做插值,得到B在A的每个x点上的对应值,之后就能逐点计算相对误差,再找出最大值。
实现步骤
1. 准备数据
假设你的数据是类似这样的结构(替换成你自己的真实数据即可):
import numpy as np # 曲线A:20个数据点 x_a = np.linspace(0, 10, 20) # A的x轴数据 y_a = np.sin(x_a) + np.random.normal(0, 0.1, 20) # A的y轴数据 # 曲线B:30个数据点 x_b = np.linspace(0, 10, 30) # B的x轴数据 y_b = np.sin(x_b) + np.random.normal(0, 0.05, 30) # B的y轴数据
2. 对曲线B插值,匹配A的x点
用scipy的插值工具,把B的曲线映射到A的所有x坐标上:
from scipy.interpolate import interp1d # 创建B的插值函数,默认用线性插值(可根据曲线平滑度选立方插值等) b_interpolator = interp1d(x_b, y_b, kind='linear', fill_value="extrapolate") # 得到B在A的每个x点上的对应值 y_b_matched = b_interpolator(x_a)
3. 计算相对误差并找最大值
注意避开B值为0的情况,防止除以0报错:
# 计算每个点的相对误差:|A_y - B_y| / |B_y| relative_errors = np.abs(y_a - y_b_matched) / np.abs(y_b_matched) # 过滤掉B值接近0的点(阈值可根据需求调整) valid_errors = relative_errors[np.abs(y_b_matched) > 1e-10] # 提取最大相对误差 max_rel_error = np.max(valid_errors) print(f"最大相对误差:{max_rel_error:.4f}")
额外说明
- 如果你的x数据不是单调递增/递减的,先对x和对应的y做排序,插值函数要求输入的x序列是单调的。
- 插值方式可以调整:
kind='linear'适合一般情况,kind='cubic'适合平滑曲线,但端点处可能有偏差。 - 要是想基于B的x点处理,反过来对A做插值就行,计算逻辑完全一致。
内容的提问来源于stack exchange,提问作者Marcos Stevenson
相关产品推荐
相关产品推荐

