SciPy curve_fit不会尝试移动洛伦兹峰

cgyqldqp  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(207)

我尝试拟合一些洛伦兹数据,但遇到了一些问题。我想可能是因为它的噪声太大,scipy无法找到很好的拟合,所以我生成了一个理想化的洛伦兹数据来拟合,令我惊讶的是,scipy也无法拟合,因为它的初始猜测几乎是完美的。在这种情况下,scipy所需要做的就是将洛伦兹数据的峰值移动不到1%。尽管它对于任意精确的初始猜测失败。

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

def lorentzian(freq, gamma, center_freq, amplitude):
    return amplitude * gamma**2 / ( gamma**2 + ( freq - center_freq )**2) + 1

frequencies = np.arange(4.95e9, 5.05e9, 0.1e9/1000)

guess = [15000000, 4.997e9, 28]
fake = [15000000, 5.02e9, 28]
test_data = lorentzian(frequencies, *fake)
popt, pcov = curve_fit(lorentzian, test_data, frequencies, maxfev = 100000, p0 = guess)
fit_lorentzian = lorentzian(frequencies, *popt)
guess_lorentzian = lorentzian(frequencies, *guess)
plt.plot(frequencies, test_data)
plt.plot(frequencies, fit_lorentzian)

scipy警告我OptimizeWarning: Covariance of the parameters could not be estimated warnings.warn('Covariance of the parameters could not be estimated',,并返回初始猜测值popt。pcov是一个3x3的inf数组。这是怎么回事?

tquggr8v

tquggr8v1#

如注解中所指出的,curve_fit具有参数(f, xdata, ydata, p0=None, sigma=None, absolute_sigma=False, check_finite=True, bounds=(- inf, inf), method=None, jac=None,**kwargs);也就是说,我交换了x数据和y数据的顺序。popt, pcov = curve_fit(lorentzian, frequencies, test_data, maxfev = 100000, p0 = guess)解决了这个问题。

相关问题