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

scipy curve_fit参数协方差无法估计问题求助

问题解决:scipy curve_fit 协方差无法估计的警告处理

问题根源分析

出现OptimizeWarning: Covariance of the parameters could not be estimated警告的核心原因包括:

  • 未提供合理的初始参数猜测,优化器从默认值(全1)出发无法收敛到有效解
  • 输入数据包含负磁场值,导致函数内的幂运算产生复数,干扰拟合逻辑
  • 模型参数无约束,优化器可能进入无意义的参数空间
  • 复杂函数的参数间存在相关性,导致无法唯一确定参数值

针对性解决方案

1. 启用并优化初始参数

你的代码中已有合理的初始参数p0,需取消注释并根据数据特征微调:

p0 = [50000, 15000, 0.3, 1.5, 1.2]  # 更贴合数据的初始猜测

2. 添加参数边界约束

为参数设置物理上合理的范围(所有参数均为正数),避免优化器进入无效区域:

bounds = (0, [1e6, 1e6, 10, 10, 10])  # 下限全为0,上限根据物理意义设置

3. 处理异常数据点

第一个数据点的负磁场会导致幂运算产生复数,可选择移除该点或修改函数兼容负磁场:

# 移除负磁场数据点(推荐)
var = var[var['H(T)'] >= 0]

4. 优化函数数值稳定性

对函数内的幂运算添加保护,避免复数或数值溢出:

def func2(b, Jc1, Jc2, Bl, Bm, y):
    b_pos = np.maximum(b, 0)  # 确保磁场非负
    ratio = b_pos / Bm
    term1 = Jc1 * np.exp(-b_pos / Bl)
    term2 = Jc2 * ratio * np.exp((1/y) * (1 - np.power(ratio, y)))
    return term1 + term2

修正后的完整代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# 读取数据
var = pd.read_excel("Data.xlsx")
print(var)

# 移除负磁场数据点
var = var[var['H(T)'] >= 0]
x1 = var['H(T)'].values
y1 = var['J (A/cm^2)'].values

# 稳定版拟合函数
def func2(b, Jc1, Jc2, Bl, Bm, y):
    b_pos = np.maximum(b, 0)
    ratio = b_pos / Bm
    term1 = Jc1 * np.exp(-b_pos / Bl)
    term2 = Jc2 * ratio * np.exp((1/y) * (1 - np.power(ratio, y)))
    return term1 + term2

# 初始参数与边界约束
p0 = [50000, 15000, 0.3, 1.5, 1.2]
bounds = (0, [1e6, 1e6, 10, 10, 10])

# 执行拟合
popt1, pcov1 = curve_fit(func2, x1, y1, p0=p0, bounds=bounds)
print("拟合参数:", popt1)

# 绘制结果(使用平滑x轴提升曲线美观度)
plt.plot(x1, y1, 'b*', label='实验数据')
x_smooth = np.linspace(min(x1), max(x1), 100)
plt.plot(x_smooth, func2(x_smooth, *popt1), 'k--', label='拟合曲线')

plt.xlabel('磁场(T)')
plt.ylabel('临界电流密度Jc (A/cm^2)')
plt.title('77K下Jc随磁场变化曲线')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.savefig('fitJc77K.png')
plt.show()

额外优化建议

  • 若需保留负磁场数据,可修改函数在b<0时直接返回Jc1(符合b=0时的函数值)
  • 尝试固定部分参数(如y=1)简化模型,观察拟合效果后再逐步放开参数
  • 可使用scipy.optimize.least_squares替代curve_fit,提升复杂模型的拟合稳定性

内容的提问来源于stack exchange,提问作者Santiago G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:05:33