Избегайте Sympy со сложными числами

Я использую синтаксический анализ для анализа строки:

f = parse_expr('(x-1)^(1/3)')

Когда я использую f.subs({x:0}), он дает мне комплексное число вместо -1. Как мне избавиться от такого поведения?

Мне нужно что-то общее, потому что функция может быть произвольной, и я не знаю, какие переменные там будут.

Спасибо.


person Andrew Fount    schedule 14.02.2014    source источник
comment
вместо -1? почему это даст -1? Здесь должно получиться комплексное число.   -  person M4rtini    schedule 15.02.2014
comment
Поскольку существует 3 числа, возведение в 3-й степени даст -1. Это -1 и 2 комплексные. Я хочу -1 вместо комплекса.   -  person Andrew Fount    schedule 15.02.2014


Ответы (2)


Посмотрев на код и узнав функцию real_root, мне удалось использовать преобразования для написания собственного конвертера.

person Andrew Fount    schedule 17.02.2014
comment
Я думал об этом несколько дней, чтобы исправить это, но не осознавал, что это было real_root. SymPy начинает достигать состояния любой вашей проблемы, которая уже была решена кем-то другим. - person asmeurer; 23.02.2014

Ваше решение кажется лучшим. Вы также можете выполнить замену символически, вместо того, чтобы пытаться изменить синтаксический анализатор. Взгляните на atoms и xreplace.

Я просто хочу добавить, что SymPy использует соглашение о том, что дробные степени - это примитивные корни с наименьшим сложным аргументом. Сам Python следует этим соглашениям:

>>> (-1+0j)**(1/3)
(0.5000000000000001+0.8660254037844386j)

Для этого есть много веских причин. Наиболее очевидным является то, что вторая и третья степени числа дадут вам два других корня:

>>> (-1+0j)**(2/3)
(-0.4999999999999998+0.8660254037844388j)
>>> (-1+0j)**(3/3)
(-1+0j)
person asmeurer    schedule 22.02.2014