Основная проблема здесь заключается в том, имеет или нет ваш символ 'x' атрибут «реальный», установленный на True
, или нет.
Рассмотрим следующие два символа:
a = Symbol('x',real=True)
b = Symbol('x')
a
и b
не относятся к одному типу и фактически a==b
- это False
.
Что происходит при выполнении
sym_eqn = parse_latex("|x-2|-1")
, так это то, что sym_eqn
теперь является выражением, которое содержит Symbol
, для которого атрибут real
не установлен в True
который требуется для запуска solve
на нем.
Поняв это, теперь возникает вопрос, как заставить parse_latex
вернуть выражение, которое будет содержать Symbol
, то есть real
?
Единственный способ, который я нашел, - написать функцию, которая рекурсивно обходит дерево выражения и перестраивает его копию так, чтобы результат был одинаковым, за исключением того, что все Symbol
теперь real
.
def rewrite_expr_real(expr):
res_list = []
if isinstance(expr,Symbol):
return Symbol(str(expr),real=True)
if not expr.args:
return expr
for a in expr.args:
res_list.append(rewrite_expr_real(a))
return expr.func(*tuple(res_list))
Теперь,
, если вы переписываете свой код следующим образом:
sym_eqn = rewrite_expr_real(parse_latex("|x-2|-1"))
Остальная часть вашего кода будет работать так, как вы ожидаете.