使用代码FullSimplify[Abs[q + I*w], Element[{q, w}, Reals]]
会导致
Abs[q + I w]
而不是
Sqrt[q^2 + w^2]
我错过了什么?
P.S。 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]]
有效。
答案 0 :(得分:6)
问题是你认为“简单”和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
因此,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]
根据要求。基本上,我们通过f[e]
告诉MMA,Abs
形式的所有部分的计数应该算作100个叶子。
编辑:正如Brett所说,你也可以使它更通用,并使用_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]
答案 1 :(得分:6)
我建议使用ComplexExpand
,告诉系统所有变量都是真实的。
In[28]:= Abs[q + I*w] // ComplexExpand
Out[28]= Sqrt[q^2 + w^2]
答案 2 :(得分:-1)
这些评论没有帮助。 Mathematica未能评估复数,因为Abs[5+i20]
保持不变。 i
已正确编码。对“什么是或不简单”进行抽象观察是无关紧要的。应该有一个浮点数,而不是一些代数。 N
和ImportForm
也不起作用。