2013-06-13 6 views
2

У меня есть небольшой вопрос о симпы. я загрузить библиотеку с:Оценка функции Sympy

from sympy import * 

В какой-то момент моей программы я хотел бы оценить функцию.

x=Symbol('x', real=True) 
sqrt(1-x).subs(x, 9).evalf() 
>>> 2.82842712474619*I 

SymPy мне ответить на комплексное значение, но я хотел бы ошибку, как в основной питона:

sqrt(-1) 
>>> ValueError: math domain error 

Кто-то знает, как сделать это с помощью SymPy?

ответ

3

Может быть, я ошибаюсь, но я не думаю, что вы можете сделать это кричать, что путь, потому что это научная библиотека, так сделано для поддержки мнимых чисел, но вы можете изменить его немного:

x=Symbol('x', real=True) 
v = sqrt(1-x).subs(x, 9).evalf() 

if not v.is_real: 
    raise ValueError, "math domain error" 

или вы можете создать функцию:

def assert_real(v): 
    if not v.is_real: 
     raise ValueError, "math domain error" 
    return v 

так что вы можете сделать:

x = Symbol('x', real=True) 
v = assert_real(sqrt(1-x).subs(x, 9).evalf()) 
+0

Я думал о том же растворе. Спасибо, что ответил, это решение для меня! – sloan

+0

Вам может понадобиться 'evalf (chop = True)' вообще, чтобы очистить небольшие мнимые части. – asmeurer

+1

Вы хотите 'not v.is_real', а не' v.is_imaginary'. 'is_imaginary' - только для чисто мнимых чисел. '(1 + 2 * I) .is_imaginary' будет' False'. – asmeurer

Смежные вопросы