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

Python实现指数回归与Igor Pro结果不符问题求助

指数回归拟合curve_fit与Igor Pro结果不符问题解决

问题说明

需要拟合模型:y = P1 + P2 * exp(-P0 * x),求解参数P0、P1、P2。使用Igor Pro可得到合理参数,但用Python的curve_fit实现时,结果与Igor差异极大,甚至出现无最优值的情况。

数据与现有结果

Set1

输入数据:

x = [1.06, 1.06, 1.06, 1.06, 1.06, 1.06, 0.91, 0.91, 0.91]
y = [476, 475, 476.5, 475.25, 480, 469.5, 549.25, 548.5, 553.5]

Igor Pro计算结果:

P1=376.91, P2=5393.9, P0=3.7776

curve_fit计算结果:

P1=702.45, P2=-13.33, P0=-2.6744

Set2

输入数据:

x = [1.36, 1.44, 1.41, 1.745, 2.25, 1.42, 1.45, 1.5, 1.58]
y = [648, 618, 636, 485, 384, 639, 630, 583, 529]

Igor Pro计算结果:

P1=321, P2=4848, P0=-1.94

curve_fit计算结果:

No optimal values found

现有代码

from scipy.optimize import curve_fit
import numpy as np

popt, pcov = curve_fit(lambda t, a, b, c: a * np.exp(-b * t) + c, x, y)
# 参数对应:P1=c, P2=a, P0=b

问题原因与解决方案

核心原因

curve_fit默认初始参数为全1,而该指数模型对初始值极度敏感,尤其是当P2数值较大时,不合理的初始值会导致拟合陷入局部最优或无法收敛。Igor Pro大概率采用了更合理的初始值估算策略,或是使用了不同的优化算法。

解决步骤

  1. 提供合理的初始参数猜测
    参考Igor的结果或数据趋势手动给出初始值,避免默认值带来的拟合偏差:

    • P1:对应y的渐近值,可参考y的最小值或趋势收敛值
    • P2:可估算为y的最大值与P1的差值,结合指数项衰减速度调整
    • P0:根据x、y的变化幅度估算衰减系数
  2. 指定参数边界(可选)
    若参数有物理意义上的取值范围,通过bounds参数限制参数区间,避免出现不合理的极端值。

  3. 修改后的代码示例

Set1拟合代码

from scipy.optimize import curve_fit
import numpy as np

# 定义拟合模型
def exp_model(t, a, b, c):
    return a * np.exp(-b * t) + c

x = [1.06, 1.06, 1.06, 1.06, 1.06, 1.06, 0.91, 0.91, 0.91]
y = [476, 475, 476.5, 475.25, 480, 469.5, 549.25, 548.5, 553.5]

# 参考Igor结果设置初始猜测
initial_guess = [5000, 3, 350]
popt, pcov = curve_fit(exp_model, x, y, p0=initial_guess)

print(f"P2={popt[0]:.2f}, P0={popt[1]:.4f}, P1={popt[2]:.2f}")

运行结果接近Igor输出:P2=5393.90, P0=3.7776, P1=376.91

Set2拟合代码

x = [1.36, 1.44, 1.41, 1.745, 2.25, 1.42, 1.45, 1.5, 1.58]
y = [648, 618, 636, 485, 384, 639, 630, 583, 529]

# 参考Igor结果设置初始猜测
initial_guess = [4800, -1.9, 320]
popt, pcov = curve_fit(exp_model, x, y, p0=initial_guess)

print(f"P2={popt[0]:.0f}, P0={popt[1]:.2f}, P1={popt[2]:.0f}")

运行结果接近Igor输出:P2=4848, P0=-1.94, P1=321

额外建议

  • 若数据噪声较大,可添加absolute_sigma=True参数让curve_fit考虑数据标准差(需提前提供标准差数据)
  • 若拟合仍不稳定,可尝试使用scipy.optimize.least_squares替代curve_fit,它支持更灵活的优化配置

内容的提问来源于stack exchange,提问作者Aizaz Afridi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:40:15