如何在Mathematica中替换隐式子表达式?

时间:2011-12-09 22:34:31

标签: wolfram-mathematica

我在Mathematica中有这个表达式:

(a^2 (alpha + beta)^2)/(b^2 + c^2) + (a (alpha + beta))/(b^2 + c^2) + 1  

正如您所看到的,表达式中有几个子表达式在整个表达式中重复出现。

我希望能够将a/(b^2+c^2)替换为d,将alpha+beta替换为gamma

最后的表达应该是:

1+d*gamma+a*d*gamma^2

我有更复杂的表达方式,能够做到这一点会大大简化我的工作。

我尝试过谷歌搜索这个问题,我只找到使用FactorTerms和ReplaceRepeated的答案,但是不能保持一致,并且对于像这样的更复杂的表达。我希望有人在这里有答案。

3 个答案:

答案 0 :(得分:5)

案件的难点在于d的规则。或许,有更简单的方法可以做到这一点,但一种方法是将权力扩展到产品,使其发挥作用。让我们说这是你的表达:

expr  = (a^2 (alpha + beta)^2)/(b^2 + c^2) + (a (alpha + beta))/(b^2 + c^2) + 1

这些是人们天真地写的规则:

rules = {a/(b^2 + c^2) -> d, alpha + beta -> gamma}

我们现在要做的是在exprrules中扩展产品的权限。问题是,即使我们这样做,他们也会自动评估权力。为了防止这种情况,我们需要将它们包装成,例如Hold。这是一个可以帮助我们的功能:

Clear[withExpandedPowers];
withExpandedPowers[expr_, f_: Hold] :=
  Module[{times},
    Apply[f,
       Hold[expr] /. x_^(n_Integer?Positive) :>
          With[{eval = times @@ Table[x, {n}]}, eval /; True] /.
       times -> Times //.
       HoldPattern[Times[left___, Times[middle__], right___]] :>
          Times[left, middle, right]]];

例如:

In[39]:= withExpandedPowers[expr]
Out[39]= Hold[1+(a (alpha+beta))/(b b+c c)+((alpha+beta) (alpha+beta) a a)/(b b+c c)]

接下来将完成这项工作:

In[40]:= 
ReleaseHold[
   withExpandedPowers[expr] //. 
      withExpandedPowers[Map[MapAt[HoldPattern, #, 1] &, rules], Identity]]

Out[40]= 1 + d gamma + a d gamma^2

我们不得不另外包装l.h.s. HoldPattern中的规则,以防止产品崩溃回到那里的权力。

这只是我们不得不与Mathematica的自动简化机制作斗争的一个案例,但对于这类问题,这将是主要的障碍。我无法评估这对于更大和更复杂的表达式有多强大。

答案 1 :(得分:2)

使用ReplaceRepeated:

(a^2 (alpha + beta)^2)/(b^2 + c^2) + (a (alpha + beta))/(b^2 + c^2) + 
  1 //. {a/(b^2 + c^2) -> d, alpha + beta -> gamma}

或使用TransformationFunctions:

FullSimplify[(a^2 (alpha + beta)^2)/(b^2 + 
     c^2) + (a (alpha + beta))/(b^2 + c^2) + 1, 
 TransformationFunctions -> {Automatic, # /. 
     a/(b^2 + c^2) -> d &, # /. alpha + beta -> gamma &}]

两者都给:

1 + gamma (d + (a^2 gamma)/(b^2 + c^2))

答案 2 :(得分:0)

我谦虚地 - 我不是计算机科学家---认为这比所有其他提议的解决方案更简单

1+a(alpha+beta)/(b^2 + c^2) +a^2(alpha+beta)^2/(b^2 + c^2) \\.
{a^2-> a  z, a/(b^2 + c^2)-> d,alpha+\beta -> gamma,z-> a}