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

Math 如何检查表达式是否包含复杂表达式?,math,wolfram-mathematica,Math,Wolfram Mathematica,有没有办法检查表达式是否包含复数/虚数 文档中说,由于表达式的解释方式,无法检查表达式是否包含I。 我也试过ImaginaryQ[expr\uz]:=expr!=共轭[expr]和简化[expr]=!=简化[Conjugate[expr]],但它不会产生准确的结果。 我还尝试使用MemberQ[expr,Complex],但这似乎也不起作用 我在笔记本上贴了一些例子: 我不会使用MemberQ[expr,Complex],因为这应该为实数提供True。或者更确切地说,Element[expr,c

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

文档中说,由于表达式的解释方式,无法检查表达式是否包含
I
。 我也试过
ImaginaryQ[expr\uz]:=expr!=共轭[expr]
简化[expr]=!=简化[Conjugate[expr]]
,但它不会产生准确的结果。 我还尝试使用MemberQ[expr,Complex],但这似乎也不起作用

我在笔记本上贴了一些例子:

我不会使用
MemberQ[expr,Complex]
,因为这应该为实数提供
True
。或者更确切地说,
Element[expr,complements]
会——我不确定您的版本会做什么。那怎么办

Not[Element[expr, Reals]]

怎么样

ImaginaryQ[expr_] := ! FreeQ[expr, _Complex]
在您的两个示例中使用它:

imExpr = a Sin[a + 2 I];
ImaginaryQ@imExpr
(* True *)

reExpr = a Sin[a^2 + a];
ImaginaryQ@reExpr
(* False *)

要明确为什么
MemberQ[expr,Complex]
对于real不一定返回
True
(对于复杂表达式可能返回也可能不返回
True
MemberQ
不是询问某个东西是否是real集合的成员或类似的东西

MemberQ[expr,form]
如果
expr
的级别1的元素之一与
form
匹配,则返回
True
。如果您执行
TreeForm
,则级别1是从顶部获得的第二个级别。此外,默认情况下,
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]

因此,在第一种情况下,在第一级存在一个
复合体
,在第二种情况下,在第1级没有
复合体
。这就是为什么我们得到上面的
True
False
。可以使用

MemberQ[List@l, Complex, -1, Heads -> True]
(*
-> True
*)
在各个层次上都要匹配

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

总之,
MemberQ
与数学关系不大;这是一个测试列表(或任何表达式,头部不重要)中模式的构造


在任何情况下,如果要使用结构测试,
FreeQ
是最重要的,而
元素
是数学测试。

MemberQ[expr,Complex]
不会返回reals的
True
,因为它是一个结构问题,而不是数学问题one@yoda:谢谢,更正。Mathematica有点像我的第十种语言,我经常感到困惑。@Charles:是的,这也是我经常犯的一个错误:)对我来说,
Real
更常见,因为,
Real
在Mathematica中是一个有效的头,语法着色不会突出它,然而,我立即捕捉到了
Imag
,因为它没有定义,显示为蓝色。@yoda,@Charles和
Trace
vs
Tr
,尤其是与
f[I_]:=I^2;Trace[Table[f[i],{i,1,10},{j,1,10}]
(资料页)vs
f[i_]:=i^2;Tr[Table[f[i],{i,1,10},{j,1,10}]
(385).@Charles:Btw,
元素
的问题在于未定义的符号,与其说是测试,不如说是断言。例如,
元素[a+IB,复合体]
。从数学上讲,是的,它不应该返回
True
False
,因为我们没有定义
a
b
。但是,我假设OP只想检查表达式中是否存在
I
。类似地,
Im[expr]
也不总是返回true/false(例如,检查OP的第一个示例
imExpr
)@yoda当然,我也不会使用
元素
,因为我认为它是一个断言,而不是一个测试。我在评论答案时说,不应该使用
MemberQ[expr,Complex]
,因为这应该给出实数的
True
,我觉得这反映了结构运算和数学运算之间缺乏区别(即,
MemberQ
不是关于是否是一个数学集合的成员)@尤达:如果Mathematica足够聪明,
Not[Element[a+b I,Reals]
会返回类似
b=0的结果。我认为
元素[a+ib,complex]
将返回
True
。(所有这些都是假设我们告诉Math'ca,
a
b
Reals
)当然是的。我想把这个贴到另一个答案上。我已经这样做了,并删除了这个:)@Charles谢谢!顺便说一句,你想要的更多的是
减少
所做的事情,而不是
元素
;因此
Reduce[a+b*I\[Element]Reals,{a,b}]
Reduce[a+b*I\[Element]Reals&&a\[Element]Reals&&b\[Element]Reals,{a,b}]
@acl我同意查尔斯的观点-很好的解释!你是否需要检查像
(-1)^(1/3)
这样的表达式,或者仅仅是明确的
Complex[a,b]==a+ib
尤达的答案所指向的对象?这非常有效!但是为什么FreeQ的form参数是一种模式,复杂而不仅仅是一个符号,复杂?
Complex
是所有复数和表达式的头部。所以我们使用一个模式
\u Complex
来捕获任何带有
头部的东西。如果使用符号
Complex
,此示例:
FreeQ[{a,b,Complex},Complex]
将返回
False
,即使
Complex
不是复数
FreeQ[{a,b,Complex},_Complex]
按其应该的方式返回
True
MemberQ[List@l, Complex, -1, Heads -> True]
(*
-> True
*)