Оценка функции Sympy

У меня есть небольшой вопрос о sympy. Я загрузил библиотеку с помощью:

from sympy import *

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

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

Sympy отвечает мне на сложное значение, но мне нужна ошибка, как в базовом python:

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

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


person sloan    schedule 13.06.2013    source источник


Ответы (1)


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

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())
person zmo    schedule 13.06.2013
comment
Я думал о том же решении. Спасибо за ответ, это своего рода решение для меня! - person sloan; 13.06.2013
comment
Возможно, вам придется сделать evalf(chop=True) в целом, чтобы убрать мелкие воображаемые части. - person asmeurer; 14.06.2013
comment
Вы хотите not v.is_real, а не v.is_imaginary. is_imaginary предназначен только для чисто мнимых чисел. (1 + 2*I).is_imaginary будет False. - person asmeurer; 14.06.2013