SciPy曲线拟合不完美?

2024-09-30 22:13:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直试图用Scipy.optimize公司曲线拟合函数,以拟合一条线,我的数据,在一个共振室,但结果不是如预期。函数返回的值没有任何错误,但当我根据数据绘制结果时,拟合度非常差。这可能是因为缺少数据/糟糕的数据/洛伦兹数据重叠,还是我做错了什么?在

我要拟合的数据是频率上相邻的两个声学模式,数据应该符合洛伦兹,因此我定义了两个洛伦兹和的模型函数。在

代码如下:

from scipy.optimize import curve_fit
from scipy.stats import cauchy, norm

def LorentzianSum(freq, x1,mu1,gamma1,x2,mu2,gamma2):
    ret = x1*cauchy.pdf(freq, loc=mu1, scale=gamma1)
    ret += x2*cauchy.pdf(freq, loc=mu2, scale=gamma2)
    return ret

#EMPTY
freq = arange(715, 955, 5)
freq = append(freq,arange(1000,1140, 5))

amp = array([10.0,10.8,11.2,12.8,14.4,15.6,16.8,17.2,17.2,16.8,16.8,16.8,17.6,18.8,21.2,24.0,28.4,33.6,42.8,56.4,69.2,60.0,42.4,29.2,21.2,15.2,10.0,8.8,13.2,25.6,47.6,58.4,46.4,36.4,13.0,26.0,23.6,21.2,19.6,18.8,17.6,17.2,16.4,15.6,15.6,16.0,16.4,16.0,18.8,20.0,20.0,20.8,21.6,22.8,23.6,25.2,27.6,29.6,33.2,36.0,40.8,47.6,56.0,70.2,98,170,92.0,103,154,176,136,110,98,90,90,94])
freq = freq[7:47]
amp = amp[7:47]

figure(4)
plot(freq,amp,'kx')
guess = [100.,815.,25.,90.,870.,25] # initial guess
popt, pcov = curve_fit(LorentzianSum, freq, amp, p0=guess)  # do fit
plot(freq, LorentzianSum(freq, *popt))
title('Empty Chamber')
xlabel('Frequency(Hz)')
ylabel('Amplitude(mV)')
grid()

Tags: 数据函数fromimportscipyfitampoptimize