如何检查表达式是否包含复杂表达式?

时间:2011-06-29 16:34:01

标签: math wolfram-mathematica

有没有办法检查表达式是否包含复杂的表达式/虚数?

文档说您无法检查表达式是否包含I,因为它的解释方式。 我也尝试了ImaginaryQ[expr_] := expr != Conjugate[expr]Simplify[expr] =!= Simplify[Conjugate[expr]],但它没有产生准确的结果。 我也试过使用MemberQ [expr,Complex],但这似乎也不起作用。

我在笔记本上贴了一些例子: http://www.eacousineau.com/download/complex-test.nb

3 个答案:

答案 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@lTreeform[List@l]

enter image description here

因此,第一种情况下第一级有Complex,第二种情况下第1级没有Complex。这就是我们获得TrueFalse的原因。可以使用

MemberQ[List@l, Complex, -1, Heads -> True]
(*
-> True
*)

匹配所有级别。

最后,要看到MemberQ确实是一个结构性问题,请尝试使用MemberQ[1 + Exp[3*I], Complex, Heads -> True] False,即使第一个参数显然很复杂。

总而言之,MemberQ与数学无关;它是一个用于测试列表中模式的构造(或任何表达式,头部无关紧要)。

在任何情况下,如果要使用结构测试,FreeQeasiest way,而Element is the way to do this则为数学测试。

答案 2 :(得分:0)

我不会使用MemberQ[expr, Complex],因为这应该为实数提供True。或者更确切地说,Element[expr, Complexes]会 - 我不确定你的版本会做什么,如果有的话。

怎么样?
Not[Element[expr, Reals]]

Im[expr] != 0