sha*_*red 5 math wolfram-mathematica
使用代码FullSimplify[Abs[q + I*w], Element[{q, w}, Reals]]结果
Abs[q + I w]
Run Code Online (Sandbox Code Playgroud)
并不是
Sqrt[q^2 + w^2]
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
PS Assuming[{q \[Element] Reals, w \[Element] Reals},
Abs[q + I*w]]也不起作用.注意:Simplify[Abs[w]^2, Element[{q, w}, Reals]]和Simplify[Abs[I*q]^2, Element[{q, w}, Reals]]工作.
问题是你认为"简单"和MMA认为简单的东西是两回事.看看ComplexityFunction表明MMA主要关注"LeafCount".应用LeafCount给出:
In[3]:= Abs[q + I w] // LeafCount
Out[3]= 8
In[4]:= Sqrt[q^2 + w^2] // LeafCount
Out[4]= 11
Run Code Online (Sandbox Code Playgroud)
因此,MMA认为Abs形式更好.(可以使用TreeForm或FullForm直观地探索简单性).我们需要做的是告诉MMA将MMA视为更昂贵.为此,我们从ComplexityFunction中获取示例并编写:
In[7]:= f[e_] := 100 Count[e, _Abs, {0, Infinity}] + LeafCount[e]
FullSimplify[Abs[q + I w], Element[{q, w}, Reals],
ComplexityFunction -> f]
Out[8]= Sqrt[q^2 + w^2]
Run Code Online (Sandbox Code Playgroud)
按照要求.基本上,我们告诉MMA f[e],表单中所有部分的Abs计数应该算作100个叶子.
编辑: 正如布雷特所提到的,你也可以使它更通用,并_Complex作为规则来寻找:
In[20]:= f[e_] := 100 Count[e, _Complex, {0, Infinity}] + LeafCount[e]
FullSimplify[Abs[q + I w], Element[{q, w}, Reals],
ComplexityFunction -> f]
Out[21]= Sqrt[q^2 + w^2]
Run Code Online (Sandbox Code Playgroud)
我建议使用ComplexExpand,告诉系统所有变量都是真实的.
In[28]:= Abs[q + I*w] // ComplexExpand
Out[28]= Sqrt[q^2 + w^2]
Run Code Online (Sandbox Code Playgroud)