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