python - 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)
解决方案
您的模型我们过度确定:请注意,它取决于产品d*R
,因此无法单独找到这两个。同上mu*C
。
推荐阅读
- maven - 从 servlet 暴露的本地 m2 工件
- javascript - 将组件作为道具传递的更好方法是什么?
- javascript - 从谷歌地图边界获取纬度/经度值
- android - 如何在没有 SSL 认证的情况下保护 api 调用免受数据包捕获?
- reactjs - 无法使用 Bootstrap 验证 React 中的数字
- c# - 从 ChatBot 的项目文件夹中读取 JSON 文件
- dialogflow-es - 在 Dialogflow 中看不到位置权限
- javascript - 如何判断对象的所有值是否存在于另一个对象中
- typescript - 如何检查分配给变量的对象类型是否正确?
- python-2.7 - Pyglet - TypeError:预期的字符串或缓冲区