我生成了一般形式的非常长且复杂的分析表达式:
(...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
更改为适当的头像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]
也简化了平方根。
我的计划是一次从底层向上迭代地使用Replace
,但这显然会导致Simplify
的大量重复工作,并最终导致完全相同的陷入困境Mathematica我在一开始就经历过。有没有办法将Simplify
限制在某个级别?
我意识到这种限制可能无法产生最佳结果,但这里的想法是获得“足够好”的东西。
答案 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 :如果您要指定要简化的表单,可以使用Replace
或ReplaceAll
代替其中一个亲戚{ {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
自动完成的;例如,即使不使用Times
,Plus
也会转为a + a
。
答案 1 :(得分: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]
此外,不要忘记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
。