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)}}

但是我的问题是我的真实代码中有 20 多个 equs 变量,并且明确地写出它们会使代码不易阅读。有没有办法解决这个问题?

4

2 回答 2

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 回答
1

一种方法是使用正式符号。这些是安全的Protected,因此无需本地化(例如 Module)即可安全使用。它们进入速度较慢(例如Esc$aEsc),但一旦使用,恕我直言非常干净。

数学图形

于 2012-10-31T04:02:42.917 回答