2016-04-25 59 views
1

我的項目出現了一些問題,因爲我有一組數據,我繪製它以獲得2條曲線,我想用指數曲線擬合這些曲線。如何用指數曲線擬合數據

我看過這個帖子:fitting exponential decay with no initial guessing。 但我的例子有點不同。

這就是我與數據獲取:

enter image description here

我的腳本如下:

mask_G = np.bitwise_and(tbdata['G'] < 99.99, tbdata['GERR'] < 0.2) 
mask_R = np.bitwise_and(tbdata['R'] < 99.99, tbdata['RERR'] < 0.2) 

G_corrected = tbdata[mask_G] 
R_corrected = tbdata[mask_R] 


fig13 = plt.gcf() 
fig13.set_size_inches(16, 9) 


fig13, (ax1,ax2) = plt.subplots(1,2) 

fig_error_g = ax1.plot(G_corrected['G'], G_corrected['GERR'], '.') 
ax1.set_xlabel('G') 
ax1.set_ylabel('GERR') 
ax1.set_title('Evolution de GERR en fonction de G') 

fig_error_r = ax2.plot(R_corrected['R'], R_corrected['RERR'], '.') 
ax2.set_xlabel('R') 
ax2.set_ylabel('RERR') 
ax2.set_title('Evolution de RERR en fonction de R') 

fig13.tight_layout() 

plt.savefig('graphique.png') 

plt.show() 

我試着寫的是,它基於SciPy的文檔:

def exponential(x,a,b,c) : 
    return a * np.exp(-b * x) + c 

xdata = G_corrected['G'] 
y = G_corrected['GERR'] 
ydata = y + 0.2 * np.random.normal(size=len(xdata)) 

popt, pcov = curve_fit(exponential, xdata, ydata) 

但我得到:

/home/user/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/scipy/optimize/minpack.py:601:OptimizeWarning:參數的協方差無法估計
類別= OptimizeWarning)

您對我如何處理有什麼想法嗎?

非常感謝你;)

編輯:

我想適合我的情節那樣:

mask_G = np.bitwise_and(tbdata['G'] < 99.99, tbdata['GERR'] < 0.2) 
mask_R = np.bitwise_and(tbdata['R'] < 99.99, tbdata['RERR'] < 0.2) 

G_corrected = tbdata[mask_G] 
R_corrected = tbdata[mask_R] 


params = np.polyfit(G_corrected['G'], np.log(G_corrected['GERR']),1) 
a = params[0] 
A = np.exp(params[1]) 


fig13 = plt.gcf() 
fig13.set_size_inches(16, 9) 


fig13, (ax1,ax2) = plt.subplots(1,2) 

fig_error_g = ax1.plot(G_corrected['G'], (G_corrected['GERR']), '.') 
fig_error_g = ax1.plot(G_corrected['G'], (A*np.exp(a*G_corrected['G'])),'.') 

ax1.set_xlabel('G') 
ax1.set_ylabel('GERR') 
ax1.set_title('Evolution de GERR en fonction de G') 

fig_error_r = ax2.plot(R_corrected['R'], np.log(R_corrected['RERR']), '.') 
ax2.set_xlabel('R') 
ax2.set_ylabel('RERR') 
ax2.set_title('Evolution de RERR en fonction de R') 

fig13.tight_layout() 

plt.savefig('graphique.png') 

plt.show() 

,我也得到:

enter image description here

你是什麼想想結果?

回答

3

最簡單的方法是對圖進行對數縮放。正如你一定知道log(exp(x))= x,即如果你將log()應用到你的y值並且繪製你應該得到一個線性圖。一旦你有了,你可以將它與你的線性工具箱(Gaussian Least Square method)配合使用。由此產生的斜率是exp(ax)中的前因子,您嘗試獲取。

如果您對x軸有另外的依賴關係,那麼對您的數據進行log-log繪圖以找出所有依賴關係可能會有所幫助。

+0

謝謝你的回答。正如你所說的,我在我的陰謀中對我的y值應用了對數標度(即編輯過的問題)。現在,我需要從scipy使用'curve_fit'嗎? – Deadpool

+0

我會對日誌數據使用線性擬合:http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.linregress.html - 您可以在對數刻度上繪製您的數據看看它是否是線性的(你的編輯)?也許log-log縮放,即兩個軸都應該這樣做。 – Frank