Logistic函数曲线拟合效果不佳,寻求技术帮助
问题分析与修正方案
你的代码拟合失败主要有几个关键问题,逐一修正后就能得到合适的拟合曲线:
1. 函数表达式的运算符优先级错误
你定义的cauchy函数里,return l / 1+np.exp(-k*(x-x1))会被Python解析为(l/1) + np.exp(...),完全偏离了预期的逻辑(应该是l / (1 + np.exp(-k*(x-x1))))。括号缺失导致函数形态错误,这是拟合失败的核心原因。
2. 迭代次数设置过低
maxfev=100限制了拟合的最大迭代次数,这类非线性拟合通常需要更多迭代才能收敛,需要调大这个值。
3. 初始参数p0不合理
你的数据中,amplitude在距离20左右开始快速上升并趋近于2200左右,因此参数x1(拐点位置)的初始值应该接近20而非0;同时l(渐近最大值)的初始值设为2200更贴合数据饱和值,能帮拟合算法更快收敛。
修正后的完整代码
import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit def cauchy(x, l, k, x1): # 修正括号,确保除法作用于整个分母 return l / (1 + np.exp(-k*(x-x1))) distance= [1000*0.001, 2000*0.001, 3000*0.001, 4000*0.001,5000*0.001,6000*0.001,7000*0.001,8000*0.001, 9000*0.001, 11000*0.001, 12000*0.001, 13000*0.001, 14000*0.001, 15000*0.001, 16000*0.001, 17000*0.001, 18000*0.001, 19000*0.001, 21000*0.001, 22000*0.001, 23000*0.001, 24000*0.001, 25000*0.001, 26000*0.001, 27000*0.001, 28000*0.001, 29000*0.001, 30000*0.001, 31000*0.001, 32000*0.001, 33000*0.001, 34000*0.001, 35000*0.001] amplitude= [26, 31, 29, 26, 27, 24, 24, 28, 24, 24, 28, 31, 24, 26, 55, 30, 73, 101, 168, 219, 448, 833, 1280, 1397, 1181, 1311, 1715, 1975, 2003, 2034, 2178, 2180, 2182] plt.plot(distance,amplitude, 'o') # 调大maxfev,修正初始参数p0与参数边界 popt, pcov = curve_fit(cauchy, distance, amplitude, maxfev=10000, bounds=((-10, 0, 0), (3000, 10, 35)), p0=[2200, 0.5, 20]) print("拟合参数:", popt) plt.plot(distance, cauchy(np.array(distance), *popt), 'r', label='cauchy fit') plt.legend() plt.show()
额外说明
- 将
distance转成numpy数组传入函数,避免列表运算可能出现的问题; - 调整
k的边界为(0,10),结合数据趋势缩小参数范围,提升拟合效率; - 添加图例,方便区分原始数据与拟合曲线。
内容的提问来源于stack exchange,提问作者Ben Jack
相关产品推荐
相关产品推荐

