我正在使用scipy编写一个Python程序(scipy.optimize.curve_fit)。我必须在数据集上拟合多条曲线,然后将它们相加。第一步是找到所有最大值,这样就完成了。将至少有一个,但通常更多。我想概括如下的内容。
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条曲线,所以做上述说法是不切实际的。
任何帮助都将不胜感激。
感谢。
编辑: 对不起,我错过了该函数依赖于最大值。它实际上是一个集中在每个最大值上的高斯分布。
即。一个术语实际上是
f = (a * (Gamma ** 2) / (((E - Maxima[i])**2) + (b**2)))
E是args必须从的开始的独立变量。
例如,
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 :(得分:0)
您可以使用arbitrary argument lists创建一个使用任意数量参数的lambda函数。然后,您可以使用列表推导来一次获取三个参数,对它们执行操作,然后对结果求和。
f = lambda *args: sum(args[i] * exp((args[i+1]*x)+args[i+2]) for i in range(0, len(args)-3, 3))
答案 1 :(得分:0)
如果我认为这是正确的,你应该可以使用一个lambda:
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)]
(我猜)。