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
到适当的头部Plus
或Power
使得可以非常准确地瞄准简化.但是,仍然存在以下问题/问题:仍然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
到某个级别?
我意识到这种限制可能无法产生最佳结果,但这里的想法是获得"足够好"的东西.
有很多方法可以做到这一点,但它可能有点棘手,这取决于实际表达式的结构。但是,通常括号中的多个项的乘积会有 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
如果您需要随后展开括号,您可以在结果上使用。
编辑添加:如果要指定要简化的表单,可以使用Replace
或ReplaceAll
代替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
。