空白在替换规则的分母中

时间:2011-08-23 21:54:07

标签: wolfram-mathematica

Mathematica 7.0似乎不喜欢在分母中有空白。任何人都可以解释为什么会这样吗?

输入:

ClearAll["Global`*"];
(*Without blanks:*)
a^2 / b^2 /. a^2 / b^2 -> d
(*with:*)
a^2 / b^2 /. a^c_ / b^c_ -> d
(*Without blanks:*)
a^2 / b^2 /. (a / b)^2 -> d
(*With:*)
a^2 / b^2 /. (a / b)^c_ -> d
(*Without blanks:*)    
a^2 / b^2 /. a^2 * b^(-2) -> d
(*With:*)
a^2 / b^2 /. a^c_ * b^(-c_) -> d

输出:

d
a^2/b^2
d
a^2/b^2
d
a^2/b^2

我正在努力解决一个更复杂的问题。我要做的替换是表达形式:

(a ^ c_. * Coefficient1_. / b ^ c_. / Coefficient2_.)  +  (a ^ d_. * Coefficient3_. / b ^ d_. / Coefficient4_.)

如果系数可能涉及可能包括ab的变量的总和,产品和商数

可能相关:

FullForm显示分母中的幂被存储为-1和c的乘积:

输入:

FullForm[a^2/b^2]
FullForm[a^c_/b^c_]
FullForm[ (a / b)^2 ]
FullForm[(a / b)^c_ ]
FullForm[a^2 * b^(-2) ]
FullForm[a^c_ * b^(-c_)]

输出:

Times[Power[a,2],Power[b,-2]]
Times[Power[a,Pattern[c,Blank[]]],Power[b,Times[-1,Pattern[c,Blank[]]]]]
Times[Power[a,2],Power[b,-2]]
Power[Times[a,Power[b,-1]],Pattern[c,Blank[]]]
Times[Power[a,2],Power[b,-2]]
Times[Power[a,Pattern[c,Blank[]]],Power[b,Times[-1,Pattern[c,Blank[]]]]]

编辑:粗略改变我的实际案例。

3 个答案:

答案 0 :(得分:11)

一般来说,您应该尽量避免使用{em>结构工具ReplaceAll进行数学操作。

FullForm相反,我将使用TreeForm来说明这些表达式:

a^2/b^2   // TreeForm
a^c_/b^c_ // TreeForm

enter image description here enter image description here

您可以看到,虽然这些表达式在数学上相似,但它们结构完全不同。您可以为特定案例制定有效的替换规则,但通常最好使用 Mathematica 提供的Formula Manipulation(或Polynomial Algebra)工具。

如果您仔细描述了您希望实现的数学操作,我将尝试提供更好的解决方案。


正如belisarius在评论中幽默地指出的那样,试图迫使 Mathematica “看”或以你的方式显示表达方式通常都是徒劳的。这是上述开头陈述成立的原因之一。

答案 1 :(得分:6)

我同意everything Mr.Wizard wrote。话虽如此,在这种特定情况下可以使用的替换规则是:

a^2/b^2 /. (Times[Power[a,c_],Power[b,e_]]/; e == -c )-> d

a^2/b^2 /.  (a^c_ b^e_/; e == -c )-> d

请注意,我添加了约束/; e == -c,因此我实际上有一个-c_而没有实际创建相应的Times[-1,c_]表达式

答案 2 :(得分:4)

a^2 / b^2 /. a^c_ / b^c_ -> d无效的主要原因是您使用Rule (->)而不是RuleDelayed (:>)。正如您在FullForm中发现的那样,第二个原因是a/b被解释为Times[a, Power[b,-1]],因此最好不要使用除法。做出这些改变,

a^2 / b^2 /. a^n_ b^m_ :> {n,m}

返回{2, -2}。通常,您需要default value,以便

a / b^2 /. a^n_. b^m_. :> {n,m}

返回{1,-2}

编辑:为确保两个指数相等,需要添加Condition(/;)

a^2 / b^2 /. a^n_. b^m_. /; n == m :> n

注意:使用_.时,这也会抓住a/b