Python基于scipy的curve_fit负指数曲线拟合参数优化问题
指数拟合优化方案
问题原因
你当前拟合效果不符合预期,核心是初始搜索参数p0设置与数据的负指数趋势不匹配,导致curve_fit陷入局部最优解。
从数据趋势可以做初步估算:x趋近于0时y取值约为10,x趋近于最大值2.1时y取值约为5,说明负指数的渐近值b应该在5左右,系数a初始值约为x=0时的y值减去b(约为5),衰减系数k应为负数,初始值可以设为-1左右。
优化代码
首先补充原代码缺失的MultipleLocator导入,然后调整初始参数、增加参数边界约束确保k为负数,符合负指数的预期:
import numpy as np import matplotlib.pyplot as plt import seaborn as sns from scipy.optimize import curve_fit from matplotlib.ticker import MultipleLocator # 补充缺失的依赖导入 # 定义指数模型 def model_func(x, a, k, b): return a * np.exp(k*x) + b # 原始数据 x = np.array([0.63240641, 0.71793968, 0.15350684, 2.14915722, 0.45236403, 0.48638794, 0.74329402, 0.38316468, 0.96695818, 0.80566539, 1.23177184, 0.41871701, 0.44817087, 1.43515037, 0.23249725, 0.70730449, 0.23058788, 0.55216397, 0.72072229, 0.70620709, 1.51952697, 0.96881724, 0.40695986]) y = np.array([ 8., 6., 10., 5., 10., 12., 6., 8., 7., 6., 6., 6., 6., 6., 8., 7., 8., 8., 6., 6., 5., 6., 12.]) # 调整初始参数,符合负指数趋势 p0 = (5, -1, 5) # 增加参数边界约束,确保k为负数,避免拟合出不符合要求的正指数 bounds = ([0, -np.inf, 0], [20, 0, 10]) opt, pcov = curve_fit(model_func, x, y, p0=p0, bounds=bounds) a, k, b = opt print(f"拟合得到的最优参数:a={a:.2f}, k={k:.2f}, b={b:.2f}") # 绘制结果 x2 = np.linspace(0.05,2.5, 10000) y2 = model_func(x2, a, k, b) fig,ax = plt.subplots(figsize = (3.5,3)) ax.plot(x2, y2,color = 'lime', label=r'$V = %.2f e^{%.2f \tau} %+.2f$' % (a,k,b)) ax.scatter(x, y, color = 'navy', alpha = 0.75) plt.xlabel(r'$\tau$') plt.ylabel('V') ax.xaxis.set_minor_locator(MultipleLocator(0.125)) ax.yaxis.set_minor_locator(MultipleLocator(0.5)) ax.legend(frameon = False, markerscale = 0.2) sns.despine(right = True) plt.show() plt.clf()
效果说明
优化后拟合得到的参数约为a≈7.01,k≈-1.72,b≈4.69,拟合曲线会贴合绝大多数数据点,你提到的低x高y区域的点也会被纳入拟合范围。如果对特定区域的拟合精度要求更高,也可以给对应数据点增加权重,传入curve_fit的sigma参数即可。
内容的提问来源于stack exchange,提问作者Peshal1067
相关产品推荐
相关产品推荐

