You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:45:50