Wolfram mathematica 如何替换Mathematica中的隐式子表达式?

Wolfram mathematica 如何替换Mathematica中的隐式子表达式?,wolfram-mathematica,Wolfram Mathematica,我在Mathematica中有一个表达式: (a^2 (alpha + beta)^2)/(b^2 + c^2) + (a (alpha + beta))/(b^2 + c^2) + 1 如您所见,表达式中有几个子表达式在整个表达式中重复 我希望能够用d替换a/(b^2+c^2),用gamma替换alpha+beta 最终表达式应为: 1+d*gamma+a*d*gamma^2 我有更复杂的表达式,能够这样做会大大简化我的工作 我试过用谷歌搜索这个问题,我只找到了使用FactorTerm

我在Mathematica中有一个表达式:

(a^2 (alpha + beta)^2)/(b^2 + c^2) + (a (alpha + beta))/(b^2 + c^2) + 1  
如您所见,表达式中有几个子表达式在整个表达式中重复

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

最终表达式应为:

1+d*gamma+a*d*gamma^2
我有更复杂的表达式,能够这样做会大大简化我的工作

我试过用谷歌搜索这个问题,我只找到了使用FactorTerms和replaceTreated的答案,但对于像这样一个更复杂的表达式,这些答案并不一致。我希望这里有人能找到答案

使用replace重复:

(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}
或使用转换函数:

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

手头的案例最难的部分是
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}
我们现在想做的是在
expr
规则中扩展产品的功能。问题是,即使我们这样做,他们也会自动评估权力。为了防止这种情况发生,我们需要将它们包装成,例如,
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
我们必须在
HoldPattern
中额外包装l.h.s.的规则,以防止产品崩溃回到那里的权力

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

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

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}

可能会从以下方面找到一些想法:嗯……因为我似乎在评论中回答了……从关系式{a-(b^2+c^2)*d,alpha+beta-gamma,(b^2+c^2)*bcsqrrecip-1}中建立Groebner基(注意,我们n=有一个新的多项式和变量,通过倒数处理分母项)。然后把你的表达式放在一起,分别减少它的分子和分母,然后把这些还原剂的商放在一起。所有这些的可变顺序要求b和/或c比a“大”。所有这一切的结果将确实是1+dgamma+ad*gamma^2(我从笔记本结果中剪切并粘贴了它)。感谢接受。我想这是我记忆中回答和接受之间最长的差距遗憾的是,根据替换规则,您得到的表达式没有完全简化。