Python Symphy solve方法或latex解析器是否有问题?

Python Symphy solve方法或latex解析器是否有问题?,python,sympy,Python,Sympy,我试图将latex表达式转换为sympy形式,然后求解它。 当我将解析器(或者实际上是转换器?)的输出提供给solve方法时,它找不到解决方案。但是,如果手动输入解析器生成的表达式,它会成功地找到根。parse_latex(很可能)或solve方法有什么问题? 提前谢谢。以下是您可以尝试的代码示例: from sympy import* from sympy.parsing.latex import* x = Symbol("x", real=True) sym

我试图将latex表达式转换为sympy形式,然后求解它。 当我将解析器(或者实际上是转换器?)的输出提供给solve方法时,它找不到解决方案。但是,如果手动输入解析器生成的表达式,它会成功地找到根。parse_latex(很可能)或solve方法有什么问题? 提前谢谢。以下是您可以尝试的代码示例:

    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) # []
来自sympy导入的
*
从sympy.parsing.latex导入*
x=符号(“x”,实=真)
sym_eqn=parse_latex(“x-2 |-1”)
打印符号eqn#Abs(x-2)-1
打印类型(sym_eqn)#
打印类型(Abs(x-2)-1)#
打印solve(Abs(x-2)-1)#[1,3],哪一个可以
#打印solve(sym_eqn)#NotImplementedError:在参数不是实的或虚的情况下求解Abs(x-2)。
打印解算(sym_eqn,x)#[]

这里的根本问题是符号“x”是否将属性“real”设置为
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
返回包含
符号的表达式,即
real

我找到的唯一方法是编写一个递归遍历表达式树的函数,并重新构建它的副本,以使结果相同,除了所有
Symbol
s现在都是
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"))

剩下的代码将按照您的预期工作。

雅科夫的回答是正确的,但我想提供一个代码片段,在一次替换中将所有符号转换为“实”

from sympy import symbols

expr = expr.subs((str(symbol), symbols(str(symbol), real=True))
                  for symbol in expr.free_symbols)

非常感谢。我明白了。这起作用了。我还尝试了y=Symbol(“y”,real=True)sym.subs(x,y)的变通方法,但它不起作用,我很好奇,为什么?现在可以了。我应该写sym=sym.subs(x,y),因为sym本身是不可变的。不过,谢谢。。