Помощь с 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 *)
Изменения:
Переместить
If
утверждение в чистую функцию отдельно отa[b, c]
, Сюдаa[b, c]
оценивается только один раз, что, как правило, является хорошей практикой.Переместить ваши замены в один
/.
операция и список правил. Опять же, хорошая практика, если вы на самом деле не намерены заменить серийный номер.
В этом случае первое изменение решает вашу проблему, потому что g[2, 4]
оценивает:
If[2 + d + e + f < 0, -3 (2 + d + e + f), 2 + d + e + f]
который явно использует d
, e
, а также f
, Поэтому они видны ReplaceAll
(/.
) и замены работают правильно.
Вероятно, есть лучший способ достичь вашей цели, но я воздержусь от угадывания остальной части вашего кода.