10

scipy nsolve 関数で解かれる一連の方程式に後で組み込まれる関数を生成したいとします。次のような関数を作成したい:

xi + xi+1 + xi+3 = 1

変数の数はコンポーネントの数に依存します。たとえば、2 つのコンポーネントがある場合:

 f = lambda x: x[0] + x[1] - 1

3 の場合:

 f = lambda x: x[0] + x[1] + x[2] - 1

呼び出される関数の引数内でコンポーネントを配列として指定します。

 def my_func(components):
        for component in components:
        .....
        .....
        return f

私はこれを行う方法を見つけることができません。この関数と他の関数を nsolve と一緒に解決する必要があるため、このようにする必要があります。

 x0 = scipy.optimize.fsolve(f, [0, 0, 0, 0 ....])

どんな助けでもいただければ幸いです

ありがとう!


これを行う最善の方法がわからないので、私がやろうとしていることを完全に説明します。

-後で解決するために、この2つの関数を生成しようとしています:

ここに画像の説明を入力

ここに画像の説明を入力

したがって、この 2 つの方程式を返す関数 teste([コンポーネントのリスト]) を作成したいと思います (Psat(T) はコンポーネントに応じて呼び出すことができる関数であり、P は定数です (値 = 760))。

例:

  teste(['Benzene','Toluene'])

戻ります:

xベンゼン + xトルエン = 1

xBenzene Psat('Benzene') + xToluene Psat('Toluene') = 760

呼び出す場合:

   teste(['Benzene','Toluene','Cumene'])

次のように返されます。

xベンゼン + xトルエン + xクメン = 1

xBenzene Psat('Benzene') + xToluene Psat('Toluene') + xCumene*Psat('Cumene') = 760

これらの x 値はすべて、私が計算して合計できるリストに変換できるものではありません。それらは、システム内にあるコンポーネントの数の関数として作成される変数です...

これがこれを行うための最良の方法を見つけるのに役立つことを願っています

4

5 に答える 5

6

直訳すると次のようになります。

f = lambda *x: sum(x) - 1

しかし、それが本当にあなたが望むものかどうかはわかりません。

于 2013-07-12T01:21:48.353 に答える
5

文字列でラムダを動的に構築し、次のように eval 関数で解析できます。

a = [1, 2, 3]

s = "lambda x: "
s += " + ".join(["x[" + str(i) + "]" for i in xrange(0, 3)]) # Specify any range
s += " - 1"

print s

f = eval(s)
print f(a)
于 2013-07-12T01:38:59.117 に答える
2

numpy を利用して、次のようなことを行います。

def teste(molecules):
    P = np.array([Psat(molecule) for molecule in molecules])
    f1 = lambda x: np.sum(x) - 1
    f2 = lambda x: np.dot(x, P) - 760
    return f1, f2

実際にあなたが解こうとしているのは、Ax = b の形式の線形方程式の劣決定システムである可能性があります。A と b は次のように構成できます。

A = np.vstack((np.ones((len(molecules),)),
               [Psat(molecule) for molecule in molecules]))
b = np.array([1, 760])

そして、次のように 2 要素ベクトルを返す単一のラムダ関数を作成できます。

return lambda x: np.dot(A, x) - b

しかし、それが方程式を解くための最良のアプローチだとは本当に思いません。 で取得できる単一の解があるかnp.linalg.solve(A, b)、無限に多くの解を持つ線形システムがある場合、見つけたいのは底ですこれは、関数を入力として受け取る数値ソルバーから得られるものです。

于 2013-07-12T03:27:35.827 に答える
0

繰り返し構築することによって関数を本当に定義したい場合は、そうすることができます。これが最良の答え、または合理的な答えでさえある状況は思いつきませんが、それはあなたが求めたものです。

def my_func(components):
    f = lambda x: -1
    for component in components:
        def wrap(f):
            return lambda x: component * x[0] + f(x[1:])
        f = wrap(f)
    return f

今:

>>> f = my_func([1, 2, 3])
>>> f([4,5,6])
44

もちろん、これをデバッグするのは楽しくありません。たとえば、呼び出しからのトレースバックを見てくださいf([4,5])

于 2013-07-12T01:32:00.283 に答える