有没有办法检查表达式是否包含复杂的表达式/虚数?
文档说您无法检查表达式是否包含I
,因为它的解释方式。
我也尝试了ImaginaryQ[expr_] := expr != Conjugate[expr]
和Simplify[expr] =!= Simplify[Conjugate[expr]]
,但它没有产生准确的结果。
我也试过使用MemberQ [expr,Complex],但这似乎也不起作用。
我在笔记本上贴了一些例子: http://www.eacousineau.com/download/complex-test.nb
答案 0 :(得分:6)
怎么样
ImaginaryQ[expr_] := ! FreeQ[expr, _Complex]
在两个例子中使用它:
imExpr = a Sin[a + 2 I];
ImaginaryQ@imExpr
(* True *)
reExpr = a Sin[a^2 + a];
ImaginaryQ@reExpr
(* False *)
答案 1 :(得分:3)
要明确为什么MemberQ[expr,Complex]
不一定会为实数返回True
(并且可能会或可能不会为复杂表达式返回True
)。 MemberQ
并不是在询问某些事物是否是这组实物的成员。
MemberQ[expr,form]
的第1级元素之一与True
匹配,则 expr
会返回form
。如果你做TreeForm
,你将获得第二级。此外,默认情况下,MemberQ
不会查看头部。因此:
l = List[1 + I];
MemberQ[l, Complex, Heads -> True]
MemberQ[List@l, Complex, Heads -> True]
(*
->
True
False
*)
(Heads->True
部分是让MemberQ
也看表达式的头部)。要了解原因,请查看TreeForm@l
和Treeform[List@l]
:
因此,第一种情况下第一级有Complex
,第二种情况下第1级没有Complex
。这就是我们获得True
和False
的原因。可以使用
MemberQ[List@l, Complex, -1, Heads -> True]
(*
-> True
*)
匹配所有级别。
最后,要看到MemberQ
确实是一个结构性问题,请尝试使用MemberQ[1 + Exp[3*I], Complex, Heads -> True]
False
,即使第一个参数显然很复杂。
总而言之,MemberQ
与数学无关;它是一个用于测试列表中模式的构造(或任何表达式,头部无关紧要)。
在任何情况下,如果要使用结构测试,FreeQ
为easiest way,而Element
is the way to do this则为数学测试。
答案 2 :(得分:0)
我不会使用MemberQ[expr, Complex]
,因为这应该为实数提供True
。或者更确切地说,Element[expr, Complexes]
会 - 我不确定你的版本会做什么,如果有的话。
Not[Element[expr, Reals]]
或
Im[expr] != 0