【问题标题】:How to check if expression contains a Complex expression?如何检查表达式是否包含复杂表达式?
【发布时间】:2011-06-29 16:34:00
【问题描述】:

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

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

我将一些示例发布到笔记本中: http://www.eacousineau.com/download/complex-test.nb

【问题讨论】:

  • 您是否需要检查像 (-1)^(1/3) 这样的表达式,或者只是明确的 Complex[a, b] == a + I b Yoda 的答案所针对的对象?

标签: math wolfram-mathematica


【解决方案1】:

怎么样

ImaginaryQ[expr_] := ! FreeQ[expr, _Complex]

在你的两个例子中使用它:

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

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

【讨论】:

  • 效果很好!但是,为什么 FreeQ 的表单参数是一个模式 _Complex,而不仅仅是一个符号 Complex?
  • Complex 是所有复数和表达式的头部。所以我们使用_Complex 模式来捕获任何带有Head 的东西。如果您改用符号 Complex,则此示例:FreeQ[{a,b,Complex},Complex] 将返回 False,尽管 Complex 不是复数...FreeQ[{a,b,Complex},_Complex] 返回 True应该。
【解决方案2】:

要清楚为什么MemberQ[expr,Complex] 不一定会为实数返回True(对于复杂的表达式可能会或可能不会返回True)。 MemberQ 不是在询问某物是否是实数集的成员或类似的东西。

如果expr 的级别1 的元素之一匹配form,则MemberQ[expr,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]:

因此,在第一种情况下,第一级有Complex,而在第二种情况下,第一级没有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 是数学测试。

【讨论】:

  • @yoda 当然,我也不会使用Element,因为我认为它是一种断言而不是测试。我在评论说不应该使用MemberQ[expr, Complex] 的答案,因为这应该给True 实数,我觉得这反映了结构和数学运算之间缺乏区别(即MemberQ 不是关于存在或不是数学集合的成员)
  • @yoda:如果 Mathematica 足够聪明,Not[Element[a + b I, Reals]] 会返回类似b = 0 的东西。我认为Element[a + I b, Complexes] 会返回True。 (所有这些都是假设我们告诉 Math'ca a 和 b 是 Reals。)
  • 当然可以。我打算将其发布到另一个答案。我已经这样做并删除了这个:)
  • @Charles 谢谢!顺便说一句,你想要的更多的是Reduce 所做的而不是Elements;因此Reduce[a + b*I \[Element] Reals, {a, b}] 或Reduce[a + b*I \[Element] Reals && a \[Element] Reals && b \[Element] Reals, {a, b}]
  • @acl 我同意查尔斯 - 很好的解释!
【解决方案3】:

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

Not[Element[expr, Reals]]

或

Im[expr] != 0

?

【讨论】:

  • MemberQ[expr, Complex] 不会返回 True 的实数,因为这是一个结构问题,而不是数学问题
  • @yoda:谢谢,已更正。 Mathematica 是我的第 10 种语言,我经常感到困惑。
  • @Charles: 是的,这也是我经常犯的错误 :) 对我来说,Real 更常见,因为Real 在 Mathematica 中是一个有效的头部,语法着色不会突出显示它,而我立即捕捉到Imag,因为它未定义并显示为蓝色。
  • @yoda、@Charles 以及 Trace 与 Tr 怎么样,尤其是与 f[i_] := i^2; Trace[Table[f[i], {i, 1, 10}, {j, 1, 10}]](内容页面)与 f[i_] := i^2; Tr[Table[f[i], {i, 1, 10}, {j, 1, 10}]](385)类似的东西......
  • @Charles:顺便说一句,Element 的问题在于未定义的符号,它更像是一个断言而不是一个测试。例如Element[a + I b, Complexes]。从数学上讲,是的,它不应该返回True 或False,因为我们还没有定义a 和b。但是,我假设 OP 只想检查表达式中是否存在 I。同样,Im[expr] 也不总是返回真/假(例如,检查 OP 的第一个示例 imExpr)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 2016-12-20
相关资源
最近更新 更多