Что-то не так с Simpy решить метод или анализатор латекса? - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь преобразовать латексное выражение в симпй форму и затем решить ее.Когда я передаю вывод анализатора (или преобразователя на самом деле?) Для решения метода, он не находит решения.Однако, если я вручную введу сгенерированное парсером выражение, оно успешно найдет корни.Что не так с parse_latex (наиболее вероятно) или методом решения?Заранее спасибо.Вот пример кода, который вы можете попробовать:

    from sympy import*
    from sympy.parsing.latex import*

    x = Symbol("x", real=True)
    sym_eqn = parse_latex("|x-2|-1") 
    print sym_eqn #  Abs(x - 2) - 1
    print type(sym_eqn) # <class 'sympy.core.add.Add'>
    print type(Abs(x - 2) - 1) # <class 'sympy.core.add.Add'>
    print solve(Abs(x-2)-1)  #  [1,3], which is ok
    #print solve(sym_eqn) # NotImplementedError: solving Abs(x - 2) when the argument is not real or imaginary.
    print solve(sym_eqn,x) # []

1 Ответ

0 голосов
/ 26 ноября 2018

Основная проблема здесь заключается в том, имеет или нет ваш символ '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"))

Остальная часть вашего кода будет работать так, как вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...