方程式があるとしましょう
x + 2*cos(x) = 0
そして私はそれを解決したいと思います。次に、次のようにプログラムできます。
def func1(x):
out = x + 2*cos(x)
return out
Solution = fsolve(func1, StartValue)
この例では、StartValueは任意の値を持つことができます。ここまでは順調ですね!fsolve()で解きたい非線形連立方程式を作成するシミュレーションをプログラミングしています。ここでの課題は、実行前に(!)非線形連立方程式のサイズがわからない(!)ことです。これは私が例えば持つことができることを意味します
x + 2 * cos(x)= 0
私が持つことができるのと同じように
2*x + 4*y = 0
18*y -18 = 0
最後に述べた連立方程式(私のプログラムでは通常常に非線形になる)を解くために、次の解を見つけました。
def func2(x):
out = [2*x[0] + 4*x[1]]
out.append(18*x[1]-18)
return out
Solution = fsolve(func2, [1, 1])
これも非常にうまく機能します。しかし、func2(x)に示されているソリューションを使用できない理由がいくつかあります。それにより、プログラムが非常に遅くなります。関数fsolve()は、解が見つかるまで関数func2(x)を数回繰り返し呼び出します[-21]。しかし、私のプログラムは、数百から数千行の線形連立方程式を処理します。これは、すべての反復ステップで、func2(x)に示されているように、これらすべてのthousends行が追加されることを意味します。したがって、ONCEが連立方程式を関数func3(x)として作成し、その後fsolve()が既成のfunc3(x)のみを呼び出すソリューションを探しています。擬似コードの例を次に示します。
func3 = lambda x: 2*x[0] + 4*x[1]
func3.append(lambda x: 18*x[1] - 18)
Solution = fsolve(func3, [1, 1])
残念ながら、上記の擬似コードで示したように、関数を追加することはできません。したがって、私の質問:関数func3を動的に構築してから、(!)ONCE READY BUILT(!)関数func3をfsolve()に渡すにはどうすればよいですか?
事前にどうもありがとうございました