2016-06-01 2 views
2

я нашел документацию для lambdify на SymPy сайте здесь: http://docs.sympy.org/dev/modules/utilities/lambdify.htmlSymPy комплекс Expression Для Python функции

Пытаетесь примеры с комплексными числами, кажется, разваливается:

SympyExpression = sympy.parsing.sympy_parser.parse_expr('0.2*exp(1.6*I*pi*x)*log(x - 1.5)') 
print "\nSympyExpression.subs(sympy.Symbol('x'), 0.0):" 
print SympyExpression.subs(sympy.Symbol('x'), 0.0) 

PythonFunction = sympy.lambdify((sympy.Symbol('x')), SympyExpression, "numpy") 
print "\nPythonFunction(0.0):" 
print PythonFunction(0.0) 

>>>> SympyExpression.subs(sympy.Symbol('x'), 0.0): 
>>>> 0.0810930216216329 + 0.2*I*pi 

>>>> PythonFunction(0.0): 
>>>> /usr/lib/python2.7/dist-packages/numpy/__init__.py:1: RuntimeWarning: invalid value encountered in log 
>>>> """ 
>>>> (nan+nan*j) 

ли я сделать что-то глупо или это ошибка?

+0

Я закончил обертывание и выдачу результата .subs на собственный «сложный» номер, используя complex() -> его медленный, но он работает –

ответ

3

Функция журнала NumPy требует сложного dtype для отрицательных реальных значений, иначе она возвращает nan. От documentation:

Для вещественных входных типов данных журнал всегда возвращает реальный результат. Для каждого значения, которое не может быть выражено как действительное число или бесконечность, оно дает nan и устанавливает недопустимый флаг ошибки с плавающей запятой.

Чтобы получить то, что вы хотите, либо передать в Numpy массив с dtype=complex, или передать в 0j, то есть, с явным complex набран 0. Для других реальных значений, проходят в, например, 1.0+0j вместо 1.0.

In [36]: lambdify(x, 0.2*exp(1.6*I*pi*x)*log(x - 1.5), 'numpy')(0.0j) 
Out[36]: (0.081093021621632885+0.62831853071795862j) 
Смежные вопросы