含共享与独立参数的双指数曲线联合拟合异常问题求助
双指数共享参数拟合异常解决方案
问题核心原因
双指数拟合属于典型的非线性拟合,scipy的curve_fit默认所有参数初始值为1,完全不匹配你的数据特征,导致拟合过程陷入局部最优,才会出现曲线强行贴合最后一个数据点的异常情况。
具体修正步骤
- 补充合理的初始参数估计:根据x=0位置的y值可以快速估算A类参数的大致范围,同时根据数据随x增大衰减的特征,可以确定T1、T2为负值,以此设置初始值大幅降低拟合陷入局部最优的概率。
- 可选添加参数约束:限定T1、T2为负值,避免拟合出无物理意义的正指数结果。
- 绘图时x轴起始值避开0:你使用的是对数x轴,0在对数轴上无定义,调整拟合曲线的x采样范围即可避免显示异常。
修正后可运行代码
import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit y1 = np.array([-12.852481,-30.782795,-27.368464,-41.604416,-37.335682,-67.12344,-113.15599,-102.833374]) y2 = np.array([26.30352,27.350178,30.479588,34.889896,14.752427,8.482291,-16.35122,-26.602728]) x = np.array([0.000, 0.003, 0.006, 0.015, 0.030, 0.066, 0.240, 0.700]) y = np.array([y1,y2]) def func(x, A, T1, B , T2): return A * np.exp(T1 * x ) + B * np.exp(T2 * x) def combofunc(x, A11, A12, A21, A22, T1, T2): return np.concatenate((func(x, A11, T1, A12, T2), func(x, A21, T1, A22, T2))) # 新增初始参数设置和边界约束 p0 = [-15, 5, 35, -10, -1, -15] bounds = ([-np.inf, -np.inf, -np.inf, -np.inf, -100, -100], [np.inf, np.inf, np.inf, np.inf, 0, 0]) fitted_params, pcov= curve_fit(combofunc,x,y.ravel(), p0=p0, bounds=bounds, maxfev=1000000) A11, A12, A21, A22, T1, T2 = fitted_params # 调整采样范围避开x=0适配对数轴 xx=np.linspace(x[1], x.max(), 1000) y_fit_1 = func(xx, A11, T1, A12, T2) y_fit_2 = func(xx, A21, T1, A22, T2) fig, ax = plt.subplots() ax.scatter(x,y1,marker='s',color='b', label='y1原始数据') ax.scatter(x,y2,marker='s',color='r', label='y2原始数据') ax.semilogx(xx, y_fit_1,ls='--',color='b', label='y1拟合曲线') ax.semilogx(xx, y_fit_2,ls='--',color='r', label='y2拟合曲线') ax.legend() plt.show()
效果说明
调整后拟合曲线会贴合所有数据点的整体变化趋势,不会再出现仅匹配最后一个点的异常。如果你的数据有明确的物理意义,还可以进一步调整初始值和边界约束,提升拟合精度。
内容的提问来源于stack exchange,提问作者Tek
相关产品推荐
相关产品推荐

