Помощь с Mathematica: использование /. заменить метод условным IF [] - PullRequest
2 голосов
/ 24 мая 2011

Позвольте мне сначала заявить, что я новичок в Mathematica, и на этот вопрос, вероятно, легко ответить, но я до сих пор не смог найти никакой помощи для решения этой конкретной проблемы, связанной с поиском в Интернете.Здесь я в основном суммировал, что мне нужно, чтобы мой код делал.Возникла некоторая проблема при использовании команды /. replace с условным оператором IF.По сути, у меня есть очень длинная функция, которая содержит другую функцию, которая определяется глобально условным условием IF.Эти несколько строк кода демонстрируют ошибку, с которой я сталкиваюсь ...

In[1]:= y[x_, z_] = 2*x + 3*z;

In[2]:= zz[x_, z_] := If[y[x, z] < 0, 4*y[x, z], y[x, z]]

In[3]:= zz[-1, -2]

Out[3]= -32

Но мне нужно ...

In[4]:= zz[x_, z_] /. x -> -1 /. z -> -2

Out[4]= If[3 Pattern[-2, _] + 2 Pattern[-1, _] < 0, 
 4 y[Pattern[-1, _], Pattern[-2, _]], 
 y[Pattern[-1, _], Pattern[-2, _]]]

, которая не дает ожидаемого числового термина.Заранее всем спасибо за помощь, несмотря на то, как глупо может звучать этот вопрос.Примечание: я должен использовать команду замены вместо прямого присвоения значения x и z.

ADDENDUM:

Я слишком сильно упростил свой пример,Возьмите этот пример:

In[91]:= a[b_, c_] = -3*b + 2*c + d + e + f;

In[92]:= g[b_, c_] := If[a[b, c] < 0, -3*a[b, c], a[b, c]];

In[10]:= g[2, 4] /. d -> 1 /. e -> 2 /. f -> 3

Out[10]= 2 + d + e + f

Но я ожидаю увидеть результат Out[10]= 8

Надеюсь, еще одно простое исправление.

Ответы [ 2 ]

3 голосов
/ 24 мая 2011

Когда вы определяете функцию, вы используете x_, которая сообщает mathematica найти шаблон с именем x и применить к нему определение. Поэтому f[x_]=x^2 говорит "возьмите выражение x и преобразуйте его в Power[x,2]".

Когда вы вызываете функцию, вы больше не используете шаблон, а вместо этого используете переменную или значение, которое mathematica в конечном итоге заменяет x. Так что f[a] даст вам a^2, если a не определено, или используйте определение для a и выдайте результат соответственно.

Так, как Говард упомянул в комментарии, если вы просто удалите подчеркивание, вы получите желаемое выражение.

In[1]:= zz[x, z] /. x -> -1 /. z -> -2

Out[1]= -32

РЕДАКТИРОВАТЬ

Чтобы ответить на ваш комментарий,

If оценивает второй и третий аргументы только после оценки условия. Так что если вы посмотрите на g[2,4], вы получите

If[2 + d + e + f < 0, -3 a[2, 4], a[2, 4]]

вы видите, что утверждения "then" и "else" остаются неоцененными, хотя a[2,4] само по себе дает вам 2 + d + e + f.

Таким образом, когда вы выполняете замены, mathematica начинает заменять d,e,f, где бы она ни находилась в выражении (которое есть только в условии), и как только она оценивает условие и достигает шагов «then» или «else», больше нечего заменить.

То, что вам нужно использовать, это ReplaceAll или //., который многократно применяет правила до тех пор, пока он больше не может быть применен. Вот как

In[2]:= rules = {d -> 1, e -> 2, f -> 3};
        g[2, 4] //. rules
Out[2]= 8
1 голос
/ 25 мая 2011

Я предлагаю этот вариант вашего кода "Дополнения":

a[b_, c_] = -3*b + 2*c + d + e + f;

g[b_, c_] := If[# < 0, -3*#, #] & @ a[b, c]

g[2, 4] /. {d -> 1, e -> 2, f -> 3}

(* Out = 8 *)

Изменения:

  1. Переместите оператор If в чистую функцию, отдельную от a[b, c]. Таким образом, a[b, c] оценивается только один раз, что, как правило, является хорошей практикой.

  2. Переместите ваши замены в одну /. операцию и список правил. Опять же, хорошая практика, если вы на самом деле не намереваетесь заменить серийный номер.

В этом случае первое изменение решает вашу проблему, потому что g[2, 4] оценивается как:

If[2 + d + e + f < 0, -3 (2 + d + e + f), 2 + d + e + f]

, который явно использует d, e и f. Поэтому они видны для ReplaceAll (/.), и замены работают правильно.

Вероятно, есть лучший способ достичь вашей цели, но я не буду угадывать остальную часть вашего кода.

...