Как проверить, содержит ли выражение сложное выражение? - PullRequest
3 голосов
/ 29 июня 2011

Есть ли способ проверить, содержит ли выражение сложные выражения / мнимые числа?

В документации сказано, что вы не можете проверить, содержит ли выражение I из-за его интерпретации.Я также пробовал ImaginaryQ[expr_] := expr != Conjugate[expr] и Simplify[expr] =!= Simplify[Conjugate[expr]], но это не дает точных результатов.Я также пытался использовать MemberQ [expr, Complex], но, похоже, это тоже не работает.

Я разместил несколько примеров в блокноте: http://www.eacousineau.com/download/complex-test.nb

Ответы [ 3 ]

6 голосов
/ 29 июня 2011

Как насчет

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

Используя его на двух ваших примерах:

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

reExpr = a Sin[a^2 + a];
ImaginaryQ@reExpr
(* False *)
3 голосов
/ 29 июня 2011

Чтобы понять, почему MemberQ[expr,Complex] не обязательно вернет True для действительных значений (и может или не может вернуть True для сложных выражений). MemberQ не спрашивает, является ли что-то из множества реалов или что-то в этом роде.

MemberQ[expr,form] возвращает True, если один из элементов уровня 1 из expr соответствует form. Уровень 1 - это то, что вы получаете вторым сверху, если вы делаете 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]:

enter image description here

Таким образом, на первом уровне в первом случае стоит Complex, а на втором уровне - Complex. Вот почему мы получаем True и False выше. Можно использовать

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

для соответствия на всех уровнях.

Наконец, чтобы увидеть, что MemberQ действительно является структурным вопросом, попробуйте MemberQ[1 + Exp[3*I], Complex, Heads -> True], который дает False, хотя первый аргумент, очевидно, является сложным.

Итак, подведем итог, MemberQ имеет мало общего с математикой; это конструкция для проверки шаблонов в списках (или любом выражении, голова не имеет значения).

В любом случае, если кто-то собирается использовать структурные тесты, FreeQ - это самый простой способ , тогда как Element - это способ с математическими тестами.

0 голосов
/ 29 июня 2011

Я бы не использовал MemberQ[expr, Complex], потому что это должно дать True для действительных чисел.Или, скорее, Element[expr, Complexes] будет - я не уверен, что, во всяком случае, ваша версия будет делать.А как насчет

Not[Element[expr, Reals]]

или

Im[expr] != 0

?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...