Scipy.optimize curve_fit 関数を使用して、共鳴チャンバー内の音響モードのデータに線を当てはめようとしましたが、結果は期待どおりではありません。関数はエラーなしで値を返しますが、結果をデータに対してプロットすると、適合が非常に悪くなります。これは、データの不足/不十分なデータ/ローレンツがデータ内で重複していることが原因である可能性がありますか、それとも何か間違っていますか?
私が当てはめようとしているデータは、周波数が隣り合う音響モードの 2 つであり、データはローレンツに適合する必要があるため、2 つのローレンツの和のモデル関数を定義しました。
コードは次のとおりです。
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()