【问题标题】:How to replace implicit subexpressions in Mathematica?如何替换 Mathematica 中的隐式子表达式?
【发布时间】:2011-12-09 22:34:30
【问题描述】:

我在 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 的答案,但不能始终如一地工作,并且对于像这样的更复杂的表达式。我希望这里有人有答案。

【问题讨论】:

  • 嗯......因为我似乎在评论中回答......从关系 {a - (b^2 + c^2)*d, alpha + beta - gamma , (b^2 + c^2)*bcsqrrecip - 1} (注意我们 n=有一个新的多项式和变量来通过往复处理分母项)。 Next Together 你的表达式并分别减少它的分子和分母,然后一起减少那些减少的商。所有这些的可变顺序将要求 b 和/或 c 比 a“大”。所有这一切的结果确实是 1 + dgamma + ad*gamma^2 (我从我的笔记本结果中剪切并粘贴了它)。
  • 感谢您的接受。我认为这是我所记得的答案和接受之间最长的差距。 :)

标签: wolfram-mathematica


【解决方案1】:

当前案例的难点在于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 的自动简化机制作斗争的一个案例,但对于这类问题,这将是主要障碍。我无法评估这对于更大和更复杂的表达式有多强大。

【讨论】:

    【解决方案2】:

    使用替换重复:

    (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))
    

    【讨论】:

    • 遗憾的是,鉴于替换规则,您得到的表达式并未完全简化。
    【解决方案3】:

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

    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}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 2021-11-16
      • 2011-12-16
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多