Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: xslittlegrassОтветов: 2

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

variable-assignmentwolfram-mathematicadifferential-equations

Ответы

Ответ 1 · рейтинг 1 · Steve Waldman

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

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]

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

Ответ 2 · рейтинг 1 · Mr.Wizard

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы