2015-09-23 22 views
1

我有數據in.csv文件,它包含2列x和y軸。該軸從.csv文件讀取,然後用伸展的指數函數擬合數據,但顯示錯誤。Reg:拉伸指數函數擬閤中的錯誤

這裏我給示例數據以便於理解。

我的功能是f(x) = a. exp (-b.t)^c + d。 (拉伸指數擬合)。我想根據這個函數擬合這個數據,我想要a,b,c和d的最終值。

我的編碼是:

# Reading data 
x=data[1,2,3,4,5,6,7,8,9,10] 
y=data[7.2489, 7.0123, 7.0006, 7.0003, 7, 7, 7, 7, 7, 7] 
# Fitting Streched Exponential Decay Curve 
smoothx = np.linspace(x[0], x[-1], (5*x[-1])) 
guess_a, guess_b, guess_c, guess_d = 4000, -0.005, 4, 4000 
guess = [guess_a, guess_b, guess_c, guess_d] 
f_theory1 = lambda t, a, b, c, d: a * np.exp((b*t)^(c)) + d 
p, cov = curve_fit(f_theory1, x, y, p0=np.array(guess)) 
f_fit1 = lambda t: p[0] * np.exp((p[1] * t)^((p[2]))) + p[3] 
plt.show() 

我在這裏只顯示猜測和我的程序的裝配部分。

請在我的代碼中更正錯誤以更好地擬合。

+0

我不知道你正在使用的數據類型,但是''^通常是「按位異或」在Python,而不是冪。如果用**替換它們會發生什麼?另外,當你說「其顯示錯誤」時,錯誤信息到底是什麼? – Kevin

+0

謝謝凱文。我用**代替^。之後,我得到這個錯誤 RuntimeWarning:在權力遇到無效值。 – Vicknesh

+0

錯誤可能是由於您根據負數計算根源所致。我糾正了這一點並在下面添加了一個答案請讓我知道這是否能解決您的問題或是否需要修改答案。 – Cleb

回答

1

您可以使用lmfit來調整您的參數。隨後的情節是這樣的:

enter image description here

和相應的參數如下:

a: 56.8404075 
b: -5.43686170 
c: 49.9888343 
d: 7.00146666 

lmfit的好處是,你還可以使用min容易限制你的參數範圍和max參數(請參閱下面的代碼)。

這是產生圖的代碼;請不是我稍微修改模型,以避免負數計算根:

from lmfit import minimize, Parameters, Parameter, report_fit 
import numpy as np 

x=np.array([1,2,3,4,5,6,7,8,9,10] ) 
y=np.array([7.2489, 7.0123, 7.0006, 7.0003, 7, 7, 7, 7, 7, 7]) 


def f_theory1(params, x, data): 
    a = params['a'].value 
    b = params['b'].value 
    c = params['c'].value 
    d = params['d'].value 

    model = a * np.exp(b*(x**c)) + d # now b can become negative; in your definition it could not 

    return model - data #that's what you want to minimize 

# create a set of Parameters 
#'value' is the initial condition 
#'min' and 'max' define your boundaries 
params = Parameters() 
params.add('a', value= 40, min=-10, max=10000) 
params.add('b', value= -0.005, min=-10, max=200) 
params.add('c', value= .03, min=-10, max=400) 
params.add('d', value= 40.0, min=-10, max=400) 

# do fit, here with leastsq model 
result = minimize(f_theory1, params, args=(x, y)) 

# calculate final result 
final = y + result.residual 

# write error report 
report_fit(params) 

#plot results 
try: 
    import matplotlib.pyplot as plt 
    plt.plot(x, y, 'k+') 
    plt.plot(x, final, 'r') 
    plt.ylim([6.95, 7.3]) 
    plt.show() 
except: 
    pass 
+0

再次感謝cleb。 – Vicknesh

+0

@Vicknesh:歡迎。如果它解決了您的問題,我還希望您通過點擊我的答案旁邊的小檢查接受此答案,然後該答案變綠。謝謝! – Cleb

+0

完成。再次感謝。 – Vicknesh