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