Помощь с Mathematica: использование /. заменить метод условным IF[]

Позвольте мне сначала заявить, что я новичок в Mathematica, и на этот вопрос, вероятно, легко ответить, но я до сих пор не смог найти никакой помощи для решения этой конкретной проблемы, связанной с поиском в Интернете. Здесь я в основном суммировал, что мне нужно, чтобы мой код делал. Существует некоторая проблема с использованием /. заменить команду на 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,

ДОПОЛНЕНИЕ:

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

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 ответа

Когда вы определяете функцию, вы используете 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]]

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

Итак, когда вы делаете замены, Mathematica начинает заменять d,e,f где бы он ни находился в выражении (которое есть только в условии), и как только он оценивает условие и достигает шагов "затем" или "еще", заменить его нечем.

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

In[2]:= rules = {d -> 1, e -> 2, f -> 3};
        g[2, 4] //. rules
Out[2]= 8

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

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 (/.) и замены работают правильно.

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

Другие вопросы по тегам