Wolfram mathematica 数学中的目标简化

Wolfram mathematica 数学中的目标简化,wolfram-mathematica,Wolfram Mathematica,我生成了非常长且复杂的一般形式的分析表达式: (...something not so complex...)(...ditto...)(...ditto...)...lots... 当我尝试使用Mathematica时,我假设Mathematica会停下来,因为它试图扩展括号,或者简化不同的括号。括号虽然包含长表达式,但Mathematica很容易自行简化。是否有某种方法可以一次将范围限制为一个括号 编辑:一些附加信息和进度 所以,根据你们的建议,我现在开始使用 In[1]:= troubl

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

(...something not so complex...)(...ditto...)(...ditto...)...lots...
当我尝试使用Mathematica时,我假设Mathematica会停下来,因为它试图扩展括号,或者简化不同的括号。括号虽然包含长表达式,但Mathematica很容易自行简化。是否有某种方法可以一次将范围限制为一个括号

编辑:一些附加信息和进度

所以,根据你们的建议,我现在开始使用

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)]
时间
更改为适当的头部,如
Plus
Power
,可以非常准确地确定简化目标。然而,仍然存在的问题如下:仍将下降到指定的水平以下,例如

也简化了平方根

我的计划是一次从下到上迭代使用一个级别,但这显然会导致大量重复工作,并最终导致与我一开始所经历的Mathematica完全相同的困境。有没有办法限制到某一水平


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

您应该尝试
Map

通常,
Map[foo,G[a,b,c,…]
为任何头
G
和任何表达式
foo
提供
G[foo[a],foo[b],foo[c],…]

  Map[Simplify, a b c d e]
它给

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

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

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

In[1]:= FullForm[(a+b)(c+d)]
Out[1]= Times[Plus[a, b], Plus[c, d]]
您可以将高阶函数用于带有head的表达式
Times
,方法与使用带有head的表达式
List
的方法相同,这样您就可以
一次简化表达式一个项,如下所示:

Map[Simplify, yourGinormousExpression]
如果随后需要展开括号,则可以对结果使用

编辑以添加:如果要指定要简化的表单,可以使用或而不是
映射的某个相关项
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
)。但是要记住的一点是,一些转换是通过
时间
加上
自动完成的;例如,
a+a
即使不使用
Simplify
也会变成
2a

我不同意我的同事的看法,因为使用
Map
Simplify
应用于每个子表达式可能不会节省任何时间,因为它仍将应用于每个子表达式。相反,请尝试以下操作:

In[1]:= MapAt[f, SomeHead[a,b,c,d], {4}]
Out[1]:= SomeHead[a, b, c, f[d]]
棘手的部分是确定位置规格。尽管如此,如果您想要简化的表达式是在第一级,它应该不会比我上面所写的更难


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

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
的第二个参数是用于假设的,它可以极大地减轻将表达式转换为有用形式的困难

小费很好,谢谢!我只是想知道Mathematica有一种方法专门包括除转换函数以外的简化形式,而转换函数不能设置为括号…感谢这一点(以及其他答案)帮了大忙。刚刚测试了这个有用的技巧,用变量列表{y1,y2,…}代替“a”,效果非常好。
In[3]:= Simplify[d Exp[I (a + b)] Cos[c/2], ExcludedForms -> {_Cos,_Sin}]
Out[3]:= d Exp[I (a + b)] Cos[c/2]