1

scipy (scipy.optimize.curve_fit) を使用して Python プログラムを作成しています。データセットに複数の曲線を当てはめ、それらを合計する必要があります。最初のステップは、すべての最大値を見つけることです。少なくとも 1 つはありますが、通常はそれ以上です。以下のようなものを一般化したいと思います。

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

引数は、

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

これが正しければ、1 つのラムダで作業できるはずです。

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 に答える
0

任意の引数リストを使用して、任意の数の引数を取るラムダ関数を作成できます。その後、リスト内包表記を使用して一度に 3 つの引数を取得し、それらに対して操作を実行してから、結果を合計できます。

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 に答える