对Mathematica的帮助:使用/。用IF []条件替换方法

时间:2011-05-24 19:30:19

标签: wolfram-mathematica mathematical-expressions

首先让我说我是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, _]]]

不会产生预期的数字术语。感谢你们所有人的帮助,尽管这个问题听起来有多么愚蠢。注意:我必须使用replace命令,而不是直接为xz分配值。

附录:

我简化了我的例子。举个例子:

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 个答案:

答案 0 :(得分:3)

定义函数时,使用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 :(得分:1)

我建议您更改“附录”代码:

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. 将替换内容移动到单个/.操作和规则列表中。再次,良好的做法,除非你真的打算进行连续替换。

  3. 在这种情况下,第一个更改可以解决您的问题,因为g[2, 4]的评估结果为:

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

    明确使用def。因此ReplaceAll/.)可以看到这些内容,并且替换效果正常。

    有一种更好的方法可以实现你的目标,但我不会猜测你的其余代码。