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
vsTr
,尤其是与f[I_]:=I^2;Trace[Table[f[i],{i,1,10},{j,1,10}]
(资料页)vsf[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
*)