Есть ли способ поместить выражение в переменную в Mathematica, не заботясь о локальных переменных?

Я использую NDSolve в Mathematica для решения набора уравнений. Я ищу способ поместить набор уравнений в переменную и ссылаться на нее позже в 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 в моем реальном коде, и явное их написание сделает код непростым для чтения. Есть ли способ решить эту проблему?


person xslittlegrass    schedule 29.10.2012    source источник


Ответы (2)


Этот вариант, кажется, работает для меня:

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]

Я не уверен, как выглядит ваша реальная система, но, возможно, что-то вроде этого сработает.

person Steve Waldman    schedule 29.10.2012

Один из способов заключается в использовании формальных символов. Это Protected, поэтому их можно безопасно использовать без локализации, такой как Module. Они медленнее вводятся (например, Esc$aEsc), но после их использования они довольно чисты, ИМХО.

Графика Mathematica

person Mr.Wizard    schedule 31.10.2012
comment
возможно, f[a_, b_] := {x, y} /. Solve[equs /. {\[FormalA] -> a, \[FormalB] -> b}, {x, y}] дает ожидаемый результат. - person agentp; 06.03.2017