我尝试拟合一些洛伦兹数据,但遇到了一些问题。我想可能是因为它的噪声太大,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数组。这是怎么回事?
1条答案
按热度按时间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)
解决了这个问题。