添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在曲线拟合过程中,参数的协方差无法估计。

内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持

腾讯云小微IT领域专用引擎提供翻译支持

原文
Stack Overflow用户 提问于2022-07-11

我试图使用scipy.optimize.curve_fit函数根据函数表达式求解两个未知的参数。我使用的公式如下: 在这里输入图像描述

我的代码如下:

p_freqs =np.array(0.,8.19672131,16.39344262,24.59016393,32.78688525,
                  40.98360656,49.18032787,57.37704918,65.57377049,73.7704918,
                  81.96721311,90.16393443,98.36065574,106.55737705,114.75409836,
                  122.95081967,131.14754098,139.3442623, 147.54098361,155.73770492,
                  163.93442623,172.13114754,180.32786885,188.52459016,196.72131148,
                  204.91803279,213.1147541, 221.31147541,229.50819672,237.70491803,
                  245.90163934)
p_fft_amp1 = np.array(3.34278536e-08,5.73549829e-08,1.94897033e-08,1.59088184e-08,
                      9.23948302e-09,3.71198908e-09,1.85535722e-09,1.86064653e-09,
                      1.52149363e-09,1.33626573e-09,1.19468040e-09,1.08304535e-09,
                      9.96594475e-10,9.25671797e-10,8.66775330e-10,8.17287132e-10,
                      7.75342888e-10,7.39541296e-10,7.08843676e-10,6.82440637e-10,
                      6.59712650e-10,6.40169517e-10,6.23422124e-10,6.09159901e-10,
                      5.97134297e-10,5.87146816e-10,5.79040074e-10,5.72691200e-10,
                      5.68006964e-10,5.64920239e-10,5.63387557e-10)
def  cal_omiga_tstar(omiga,tstar,f):
    return omiga*np.exp(-np.pi*f*tstar)/(1+(f/18.15)**2)
omiga,tstar = optimize.curve_fit(cal_omiga_tstar,p_freqs,p_fft_amp1)[0]

当我运行代码时,我得到以下提示: OptimizeWarning: Covariance of the parameters could not be estimated warnings.warn('Covariance of the parameters could not be estimated'

浏览 52 关注 0 得票数 1
  • 得票数为Stack Overflow原文数据
原文
回答于2022-07-11
得票数 0

我无法准确确定错误消息的原因,因为您的代码在此之前有一些错误。首先,两个数组的构造具有无效的语法,然后 cal_omiga_tstar 的定义有错误的参数顺序。在修复这些问题时,我确实收到过一次您的错误消息,但我没有能够复制它,非常奇怪。不过,我确实满足了你的要求。您应该提供对参数的初始猜测,特别是考虑到您的 y 有这么多低值。这里没有魔法,只需绘制模型和数据,直到它相对接近。然后,让算法拿起轮子。

这是我的密码:

import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import numpy as np
# Changed here, was "np.array(0.,..."
p_freqs =np.array([0.,8.19672131,16.39344262,24.59016393,32.78688525,
                  40.98360656,49.18032787,57.37704918,65.57377049,73.7704918,
                  81.96721311,90.16393443,98.36065574,106.55737705,114.75409836,
                  122.95081967,131.14754098,139.3442623, 147.54098361,155.73770492,
                  163.93442623,172.13114754,180.32786885,188.52459016,196.72131148,
                  204.91803279,213.1147541, 221.31147541,229.50819672,237.70491803,
                  245.90163934])
p_fft_amp1 = np.array([3.34278536e-08,5.73549829e-08,1.94897033e-08,1.59088184e-08,
                      9.23948302e-09,3.71198908e-09,1.85535722e-09,1.86064653e-09,
                      1.52149363e-09,1.33626573e-09,1.19468040e-09,1.08304535e-09,
                      9.96594475e-10,9.25671797e-10,8.66775330e-10,8.17287132e-10,
                      7.75342888e-10,7.39541296e-10,7.08843676e-10,6.82440637e-10,
                      6.59712650e-10,6.40169517e-10,6.23422124e-10,6.09159901e-10,
                      5.97134297e-10,5.87146816e-10,5.79040074e-10,5.72691200e-10,
                      5.68006964e-10,5.64920239e-10,5.63387557e-10])