在Mathematica中有针对性的简化

Tim*_*imo 6 wolfram-mathematica

我生成了一般形式的非常长且复杂的分析表达式:

(...something not so complex...)(...ditto...)(...ditto...)...lots...
Run Code Online (Sandbox Code Playgroud)

当我尝试使用时Simplify,Mathematica陷入停顿,我假设它是因为它试图扩展括号和/或简化不同的括号.包含长表达式的括号很容易由Mathematica自行简化.有什么方法可以一次限制Simplify一个支架的范围吗?

编辑:一些额外的信息和进展.

因此,根据你们的建议,我现在开始使用一些东西了

In[1]:= trouble = Log[(x + I y) (x - I y) + Sqrt[(a + I b) (a - I b)]];

In[2]:= Replace[trouble, form_ /; (Head[form] == Times) :> Simplify[form],{3}]

Out[2]= Log[Sqrt[a^2 + b^2] + (x - I y) (x + I y)]
Run Code Online (Sandbox Code Playgroud)

改变Times到适当的头部PlusPower使得可以非常准确地瞄准简化.但是,仍然存在以下问题/问题:仍然Simplify会比指定的级别深入下降Replace,例如

In[3]:= Replace[trouble, form_ /; (Head[form] == Plus) :> Simplify[form], {1}]

Out[3]= Log[Sqrt[a^2 + b^2] + x^2 + y^2]
Run Code Online (Sandbox Code Playgroud)

也简化了平方根.

我的计划是一次Replace从底部向上迭代地使用,但这显然会导致大量的重复工作,Simplify并最终导致我在一开始就遇到的Mathematica完全相同的陷阱.有没有办法限制Simplify到某个级别?

我意识到这种限制可能无法产生最佳结果,但这里的想法是获得"足够好"的东西.

Pil*_*lsy 5

有很多方法可以做到这一点,但它可能有点棘手,这取决于实际表达式的结构。但是,通常括号中的多个项的乘积会有 head Times,您可以使用它FullForm来验证这一点:

In[1]:= FullForm[(a+b)(c+d)]
Out[1]= Times[Plus[a, b], Plus[c, d]]
Run Code Online (Sandbox Code Playgroud)

您可以将高阶函数Map与带有 headTimes的表达式一起使用,就像在带有 head 的表达式中使用它一样List,这可能允许您Simplify一次一个表达式,如下所示:

Map[Simplify, yourGinormousExpression]
Run Code Online (Sandbox Code Playgroud)

Expand如果您需要随后展开括号,您可以在结果上使用。

编辑添加:如果要指定要简化的表单,可以使用ReplaceReplaceAll代替Map. Replace特别有用,因为它需要一个级别规范,允许您只影响最顶层产品中的因素。作为一个简单的例子,请考虑以下内容:

In[1]:= expr = Sqrt[(a + 1)/a] Sqrt[(b + 1)/b];

In[2]:= Simplify[expr]
Out[2]= Sqrt[1 + 1/a] Sqrt[1 + 1/b]
Run Code Online (Sandbox Code Playgroud)

如果您不想简化依赖于a. 你可以这样做:

In[3]:= Replace[expr, form_ /; FreeQ[form, a] :> Simplify[form], {1}]
Out[3]= Sqrt[(1 + a)/a] Sqrt[1 + 1/b]
Run Code Online (Sandbox Code Playgroud)

只有依赖于 的第二项b发生了变化。但要记住的一件事是,某些转换是由Times或自动完成的Plus;例如a + a将变成2 a没有用的,甚至Simplify