1

Mathematica で NDSolve を使用して一連の方程式を解いています。コードを読みやすくするために、一連の方程式を変数に入れ、後でNDSolveで参照する方法を探しています。

これが私がやっていることのより簡単なバージョンです:

In[1]:= equs = {a x + b y == 0, x - y == 1};
In[2]:= f[a_, b_] := Module[{x, y}, {x, y} /. Solve[equs, {x, y}]]

評価すると、正しい答えが得られません。

In[3]:=   f[1, 1]
Out[3]:=  {x$627, y$627}

これは、x、y、a、b がローカル変数であり、x、y、a、b とは異なる内部名が付けられているためです。equs の定義を関数に変更すると、正しい結果が得られます。

In[4]:= Clear[equs, f]

In[5]:= equs[x_, y_, a_, b_] := {a x + b y == 0, x - y == 1};

In[6]:= f[a_, b_] := 
 Module[{x, y}, {x, y} /. Solve[equs[x, y, a, b], {x, y}]]

In[7]:= f[1, 1]

Out[7]= {{1/2, -(1/2)}}

しかし、私の問題は、実際のコードの equs に 20 個を超える変数があり、それらを明示的に書き出すとコードが読みにくくなることです。これを解決する方法はありますか?

4

2 に答える 2

1

1つの方法は、正式な記号を使用することです。これらはProtected安全であるため、モジュールなどのローカリゼーションなしで安全に使用できます。それらは入るのが遅いですが(例えばEsc$aEsc)、一度使用されるとかなりきれいな私見です。

Mathematicaグラフィックス

于 2012-10-31T04:02:42.917 に答える
1

このバリエーションは私にとってはうまくいくようです:

equs = {a x + b y == 0, x - y == 1};
sols = Block[{x, y}, {x, y} /. (Solve[equs, {x, y}])];
f[a_, b_] := Evaluate[sols];
f[1,1]

あなたの実際のシステムがどのように見えるかはわかりませんが、おそらくこのようなものがうまくいくでしょう。

于 2012-10-29T21:36:38.227 に答える