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_.)
如果系数可能涉及可能包括a
和b
的变量的总和,产品和商数
可能相关:
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[]]]]]
编辑:粗略改变我的实际案例。
答案 0 :(得分:11)
一般来说,您应该尽量避免使用{em>结构工具ReplaceAll
进行数学操作。
与FullForm
相反,我将使用TreeForm
来说明这些表达式:
a^2/b^2 // TreeForm
a^c_/b^c_ // TreeForm
您可以看到,虽然这些表达式在数学上相似,但它们结构完全不同。您可以为特定案例制定有效的替换规则,但通常最好使用 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
。