7

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

(...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到某个级别?

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

4

3 回答 3

5

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

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

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

Map[Simplify, yourGinormousExpression]

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

编辑添加:如果要指定要简化的表单,可以使用ReplaceorReplaceAll代替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已更改。不过要记住的一件事是,某些转换是由Timesor自动完成的Plus;例如即使不使用a + a也会变成.2 aSimplify

于 2009-11-17T16:02:31.187 回答
2

我希望与我的同事有所不同,因为使用Map应用于Simplify每个子表达式可能不会节省任何时间,因为它仍将应用于每个子表达式。而是尝试 , 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]

另外,不要忘记 for 的第二个参数Simplify是用于假设的,它可以极大地缓解您将表达式转换为有用形式的困难。

于 2009-11-17T19:01:14.633 回答
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

于 2009-11-17T16:01:23.623 回答