针对不同长度不同起始x值的四阶拟合数据集求取逐点极值的方法咨询
实现思路
- 先统一x轴采样区间:取所有测试集x值的全局上下限生成等步长序列,也可以根据需求选择仅保留所有数据集都覆盖的重叠区间,避免多项式外推带来的误差
- 复用已拟合的四阶多项式参数,直接计算所有拟合曲线在统一x序列每个点上的y值,无需关心原数据集的长度和起始点差异
- 对同一x点对应的4个y值做逐点聚合,直接计算最大值和最小值即可得到目标序列
代码修改说明
首先需要调整原有拟合部分的变量存储逻辑,避免拟合参数被覆盖:
# 原四阶拟合段修改为分别存储每组的拟合参数 def objective_4(x,a,b,c,d,e): return a * x**4 +b*x**3 +c*x**2+d*x+e pars1, _ = curve_fit(objective_4, XTest1,YTest1) x_line1 = arange(min(XTest1), max(XTest1), 1) y_line1 = objective_4(x_line1, *pars1) pars2, _ = curve_fit(objective_4, XTest2,YTest2) x_line2 = arange(min(XTest2), max(XTest2), 1) y_line2 = objective_4(x_line2, *pars2) pars3, _ = curve_fit(objective_4, XTest3,YTest3) x_line3 = arange(min(XTest3), max(XTest3), 1) y_line3 = objective_4(x_line3, *pars3) pars4, _ = curve_fit(objective_4, XTest4,YTest4) x_line4 = arange(min(XTest4), max(XTest4), 1) y_line4 = objective_4(x_line4, *pars4)
新增逐点极值计算逻辑:
# 生成统一x轴序列,此处取所有数据集x的并集,步长1 all_x_min = min([min(XTest1), min(XTest2), min(XTest3), min(XTest4)]) all_x_max = max([max(XTest1), max(XTest2), max(XTest3), max(XTest4)]) x_unified = np.arange(all_x_min, all_x_max, 1) # 若仅需要所有数据集重叠的区间,替换为以下代码 # overlap_x_min = max([min(XTest1), min(XTest2), min(XTest3), min(XTest4)]) # overlap_x_max = min([max(XTest1), max(XTest2), max(XTest3), max(XTest4)]) # x_unified = np.arange(overlap_x_min, overlap_x_max, 1) # 计算所有曲线在统一x轴上的y值 y_arr = np.array([ objective_4(x_unified, *pars1), objective_4(x_unified, *pars2), objective_4(x_unified, *pars3), objective_4(x_unified, *pars4) ]) # 逐点计算极值 y_point_min = np.min(y_arr, axis=0) y_point_max = np.max(y_arr, axis=0) # 绘制验证 plt.plot(x_line1,y_line1, label='Test1', alpha=0.5) plt.plot(x_line2,y_line2, label='Test2', alpha=0.5) plt.plot(x_line3,y_line3, label='Test3', alpha=0.5) plt.plot(x_line4,y_line4, label='Test4', alpha=0.5) plt.plot(x_unified, y_point_min, c='blue', linewidth=2, label='最小值序列') plt.plot(x_unified, y_point_max, c='red', linewidth=2, label='最大值序列') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Lodewijk Pleij
相关产品推荐
相关产品推荐

