2013-03-21 57 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)。