1

我正在使用 scipy (scipy.optimize.curve_fit) 编写一个 Python 程序。我必须在数据集上拟合多条曲线,然后总结它们。第一步是找到所有最大值,这就完成了。至少会有一个,但通常会更多。我想概括如下。

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]

对不起,我错了。

编辑2:

我在想这样的事情:

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])
4

2 回答 2

0

您可以使用任意参数列表创建一个接受任意数量参数的 lambda 函数。然后,您可以使用列表推导一次获取三个参数,对它们执行操作,然后对结果求和。

f = lambda *args: sum(args[i] * exp((args[i+1]*x)+args[i+2]) for i in range(0, len(args)-3, 3))
于 2013-03-21T15:01:03.890 回答
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)]

(我猜)。

于 2013-03-21T15:01:16.453 回答