0

方程式があるとしましょう

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()に渡すにはどうすればよいですか?

事前にどうもありがとうございました

4

1 に答える 1

0

解決策:「コマンドを文字列連結に外部委託する」 次のように、関数の外側に文字列を作成できます。

StringCommand = "f = [2*x[0] + 4*x[1], 18*x[1] - 18]"

その後、この StringCommand は、次のように呼び出される関数の入力パラメーターとして使用されます。

def func(x,StringCommand):
  exec StringCommand
  return f  

したがって、StringCommand はコマンド exec を介して実行されます。最後に、次のように fsolve() 内で関数を呼び出すだけです。

fsolve(func, [1, 1], StringCommand)

それでおしまい。このようにすると、StringCommand は関数 func() の外で一度構築されるため、fsolve() が関数 func() で反復を行うときに多くの時間を節約できます。[1,1] は反復の開始値であることに注意してください!

于 2013-02-19T08:48:25.743 に答える