Wolfram mathematica 替换规则分母中的空格

Wolfram mathematica 替换规则分母中的空格,wolfram-mathematica,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_ ->

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
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_)]
输出:

d
a^2/b^2
d
a^2/b^2
d
a^2/b^2
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[]]]]]
我正试图解决一个更复杂的问题。我要进行的替换是以下形式的表达式:

(a ^ c_. * Coefficient1_. / b ^ c_. / Coefficient2_.)  +  (a ^ d_. * Coefficient3_. / b ^ d_. / Coefficient4_.)
其中系数可能涉及变量的总和、乘积和商,这些变量可能包括也可能不包括
a
b

可能相关:

完整形式显示分母中的幂存储为-1和c的乘积:

输入:

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
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_)]
输出:

d
a^2/b^2
d
a^2/b^2
d
a^2/b^2
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[]]]]]

编辑:粗体更改为我的实际案例。

主要原因
a^2/b^2/。a^c\u/b^c\u->d
不起作用是因为您没有使用它。第二个原因,正如您在
FullForm
中发现的,是
a/b
被解释为
乘以[a,幂[b,-1]]
,因此最好不要使用除法。作出这些改变,

a^2 / b^2 /. a^n_ b^m_ :> {n,m}
返回
{2,-2}
。通常,你会想要一个

返回
{1,-2}

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


注意:通过使用
这也将捕获
a/b

一般来说,您应该尽量避免使用结构工具
ReplaceAll
进行数学运算

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

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

您可以看到,虽然这些表达式在数学上相似,但在结构上却完全不同。您可能能够针对特定情况敲定一个有效的替换规则,但您通常最好使用Mathematica提供的(或)工具

如果你仔细描述你希望实现的数学运算,我将尝试提供一个更好的解决方案


正如belisarius在一篇评论中幽默地指出的那样,试图强迫Mathematica以你的方式“看”或显示表达式通常是徒劳的。这是上述开场白属实的原因之一。

我同意。话虽如此,在这种具体情况下适用的替代规则是:

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


注意,我添加了约束
/;e==-c
这样我就有效地拥有了一个
-c
,而没有实际创建相应的
时间[-1,c\]
表达式

切换到DelayedRule对我提供的任何示例都没有影响<代码>a^2/b^2/。a^c\b^e\ud->code>可以工作,但问题是它不能确保顶部和底部的功率相同。尽管我认为这可以通过一个条件来解决:
a^2/b^2/。a^c_uB^e_u/;c==-e->d
。对我来说,感觉还是有点可疑。你说得对,我没有考虑确保它们是相同的力量,这让它很痛苦。我自己可能会同意这个条件。@rcollyer我想我看到了Leonid关于使用模式匹配分母的一个很好的答案或评论。我现在找不到。@belisarius也找过了,也找不到。我模糊地记得关于这个话题的一些讨论,但在我的回答或评论中找不到任何相关内容。一般来说,对于任何复杂的表达式,与空格的精确匹配都会变得非常脆弱——我只能在@Mr.Wizard.+1的答案中添加我的声音,这一点很好。如果绝对必要,请使用模式进行操作,主要是因为无法检查它们。使用
Replace
可以非常容易地做出数学上荒谬的更改。+1但是OP应该得到警告,试图强迫Mma以人类通常的方式编写公式(有时)就像试图喂养雕像。@belisarius I添加了一条注释;这是否涵盖了你的意思,或者你愿意编辑答案并多说点什么吗?@先生,我想现在可以了。每个Mma用户都至少去过一次,希望能够学会让系统按自己的方式运行。@rcollyer当然,有时结构工具适合于数学表达式。然而,从OP对“一个更复杂的问题”的描述来看,我认为这在这种情况下是不可能的。我并不打算宣布这是一条严格的规则,但我使用了“一般来说”和“通常更好”这样的短语,相当聪明。为了清晰起见,是否保留了明确的完整函数名?我想你也应该包括标准形式。是的,我用它来说明这个表达式和问题底部的表达式在结构上是相等的。增加了紧凑的形式了。谢谢嘿嘿。我希望@rcollyer的回答中我的评论+1来自你:)@maberib事实上不是我,否则我不会发布这个。我错过了你的评论,等你看完后我会删除我的答案。