首页 > 解决方案 > scipy.optimize_curve_fit 表示无法估计参数的协方差

问题描述

我正在尝试执行曲线拟合,以便使用 scipy.optimize.curve_fit 估计一组数据的函数参数值。我的数据在 x 和 y 数据中都存在不确定性。当我查找 scipy.optimize.curve_fit 的文档时,它说 sigma=y 值的不确定性。但是当我把它放进去时,我得到一个 OptimizeWarning: OptimizeWarning: Covariance of the parameters could not beested 我该如何解决这个问题?

这是我的代码:

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

frequency = [111.11, 160, 540.54, 740.74, 909.09, 1250, 1538.46, 2000, 
2352.94, 2666.67, 2941.18, 3333.33, 3571.43, 3846.15, 4347.83, 4545.45, 5000]

ufrequency = [3.70, 3.84, 32.14, 17.49, 34.94, 46.80, 37.47, 61.12, 83.32, 106.10, 52.42, 72.22, 81.76, 93.64, 117.39, 127.69, 152.75]

yvalues = [88/90, 175/200, 76/99, 17/26, 30/53, 25/53, 11/27, 8/27, 4/15, 
7/30, 29/135, 5/27, 23/135, 22/135, 8/53, 37/265, 33/260]

uyvalues = [0.02, 0.02, 0.02, 0.02, 0.01, 0.01, 0.01, 0.01, 4.94e-3, 4.67e-3, 4.37e-3, 3.93e-3, 3.70e-3, 3.60e-3, 3.46e-3, 3.32e-3, 3.2e-3]

plt.errorbar(frequency, yvalues, xerr=ufrequency, yerr = uyvalues, fmt = 'b+', label = "Data")
plt.show()

定义模型函数

def f(freq, C, R, d, mu):
    return 1/(np.sqrt(1+((R*d)/(2/mu*C*2*np.pi*freq))**2))

定义参数的初始猜测

C0 = 70000000
R0 = 0.01012
d0 = 0.0004
mu0 = 1.256629e-6

p0 = [C0, R0, d0, mu0]

name = ["C", "R", "d", "mu"]

tmodel = np.linspace(100, 5000, 1000)

ystart = f(tmodel,*p0)

popt, pcov = curve_fit(f, frequency, yvalues, p0, sigma=uyvalues, absolute_sigma=True)

标签: pythonoptimizationscipycurve

解决方案


您的模型我们过度确定:请注意,它取决于产品d*R,因此无法单独找到这两个。同上mu*C


推荐阅读