在Mathematica中有针对性的简化

时间:2009-11-17 15:48:38

标签: wolfram-mathematica

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

(...something not so complex...)(...ditto...)(...ditto...)...lots...

当我尝试使用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)]

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]

也简化了平方根。

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

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

3 个答案:

答案 0 :(得分:4)

有很多方法可以做到这一点,但它可能有点棘手,取决于你实际表达的结构。但是,通常括号中的多个术语的产品会有头部Times,您可以使用FullForm来验证这一点:

In[1]:= FullForm[(a+b)(c+d)]
Out[1]= Times[Plus[a, b], Plus[c, d]]

您可以将高阶函数Map与头部Times的表达式一起使用,就像使用头部List的表达式一样,这可能会让您{{1一次一个词的表达式,如下:

Simplify

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

要添加的EDIT :如果您要指定要简化的表单,可以使用ReplaceReplaceAll代替其中一个亲戚{ {1}}。 Map[Simplify, yourGinormousExpression] 特别有用,因为它需要level specification,因此您只能影响最顶级产品中的因素。举个简单的例子,请考虑以下几点:

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]

只有第二个词(取决于a)已被更改。但要注意的是,有些转换是由In[3]:= Replace[expr, form_ /; FreeQ[form, a] :> Simplify[form], {1}] Out[3]= Sqrt[(1 + a)/a] Sqrt[1 + 1/b] b自动完成的;例如,即使不使用TimesPlus也会转为a + a

答案 1 :(得分:2)

我不同意我的同事,因为使用MapSimplify应用于每个子表达式可能无法保存任何时间,因为它仍将应用于每个子表达式。而是尝试MapAt,如下所示:

In[1]:= MapAt[f, SomeHead[a,b,c,d], {4}]
Out[1]:= SomeHead[a, b, c, f[d]]

棘手的部分是确定位置规范。虽然,如果你想要简化的表达式是第一级,那么它应该比我上面写的更困难。


现在,如果您仍希望简化所有内容,但希望保留一些结构,请尝试使用选项ExcludedForms。在过去,我曾经习惯于防止这种简化:

In[2]:= Simplify[d Exp[I (a + b)] Cos[c/2]]
Out[2]:= Exp[I(a + b + c)](d + d Exp[c])

Mathematica似乎喜欢,所以我做

In[3]:= Simplify[d Exp[I (a + b)] Cos[c/2], ExcludedForms -> {_Cos,_Sin}]
Out[3]:= d Exp[I (a + b)] Cos[c/2]

此外,不要忘记Simplify的第二个参数是用于假设,并且可以极大地减轻您将表达式变为有用形式的困难。

答案 2 :(得分:1)

你应该试试Map 一般来说,Map[foo, G[a, b, c, ...]]会为G[foo[a], foo[b], foo[c], ...]和任何表达式G提供foo,因此对于

  Map[Simplify, a b c d e]

它给出了

  Simplify[a] Simplify[b] Simplify[c] Simplify[d] Simplify[e]

请注意,如果您觉得更方便,可以表示Map[foo, expr] als foo /@ expr