2013-03-21 55 views
1

我正在使用scipy(scipy.optimize.curve_fit)編寫Python程序。我必須在數據集上擬合多條曲線,然後總結它們。第一步是找到所有最大值,完成。至少有一個,但通常更多。我想概括一下如下內容。更改變量的lambda

if (len(Maxima) == 1): 
    f = lambda a, b, c : a * exp((b * x) + c) 
else if (len(Maxima) == 2): 
    f = lambda a, b, c, d, e, f : (a * exp((b * x) + c)) + (d * exp((e * x) + f) 

等等。我需要它,因此curve_fit將會識別出有(3 * Maxima)參數,然後它會爲我找到它們。最多可以有20條曲線左右,所以做上述說明是不現實的。

任何幫助,將不勝感激。

謝謝。

編輯: 對不起,我錯過了功能依賴最大值。它實際上是一個集中在每個最大值上的高斯分佈。

I.e.一個術語實際上是

f = (a * (Gamma ** 2)/(((E - Maxima[i])**2) + (b**2))) 

而E是參數必須以自變量開始。

例如,對於

len(Maxima) == 2 

ARGS必須是,

E, a0, b0, Maxima[0], a1, b1, Maxima[1] 

對不起,我錯了。

EDIT2:

我想是這樣的:

GaussianDistribution = lambda E, E0, I0, Sigma : (I0 * np.exp(-(((E - E0)/Sigma)**2))) 
args = tuple([long] * ((len(Maxima) * 3) + 1)) 
d1, d2 = sc.curve_fit(GaussianDistribution(*args), Data[:, 0], Data[:, 1]) 

回答

0

您可以創建一個lambda函數,它接受任何數量的參數,使用arbitrary argument lists。然後,您可以使用列表理解一次接受三個參數,對它們執行操作,然後對結果進行求和。

f = lambda *args: sum(args[i] * exp((args[i+1]*x)+args[i+2]) for i in range(0, len(args)-3, 3)) 
+0

對不起,我錯過了一些信息。我在介紹中加入了它,因爲在這裏發帖太久了。 – Jacob 2013-03-21 15:17:54

0

如果我得到這個正確的,你應該能夠有一個拉姆達的工作:

f = lambda a, b, c : a * exp((b * x) + c) 

然後

result = sum(f(a, b, c) for a, b, c in maxima) 

如果maxima的形式爲

maxima = [(1, 2, 3), (4, 5, 6), (7, 9, 8)] 

(其中我顧ESS)。