sympy.sympify的evaluate=False选项导致sp.Poly报错的原因咨询
为什么sympy.sympify(evaluate=False)会导致sp.Poly报错?
核心原因在于evaluate=False对表达式结构的影响:
- 默认
sympify(evaluate=True)会将字符串解析为已求值的常规SymPy表达式,比如"x2*x3"会被处理成普通的Mul(x2, x3)节点,SymPy能正常识别这是两个符号的乘积。 - 当开启
evaluate=False时,sympify会生成未求值的表达式结构,"x2*x3"会被保留为Mul(x2, x3, evaluate=False)——这个乘法节点不会被“展开”或解析为常规的符号乘积,而是保持原始的未计算状态。
为什么Poly会报错?
sp.Poly要求输入的表达式必须是关于指定生成元(这里是x1、x2、x3)的标准多项式形式,即每个项都能拆解为生成元的幂次乘积。但未求值的Mul(x2, x3, evaluate=False)不会被Poly拆解,Poly会把整个乘法节点当作一个单独元素,而这个元素里又包含了作为生成元的x2和x3,违反了Poly的规则(生成元应是表达式中最基础的变量单元,不能出现生成元之间的未拆解乘积),因此抛出PolynomialError。
而默认evaluate=True的场景下,x2*x3是已求值的常规乘积,Poly可以正常拆解这个节点,识别出这是x2和x3的一次幂乘积,因此能正确构造多项式。
解决方法(如果需要保留evaluate=False)
如果必须用evaluate=False解析字符串,可以在构造Poly前手动触发表达式求值:
import sympy as sp def test(s1 = "x1 - x2*x3"): e1 = sp.sympify(s1, evaluate=False).doit() # 用doit()触发求值 syms = sorted(e1.free_symbols, key=lambda s: s.name) p1 = sp.Poly(e1, *syms, expand=False)
内容的提问来源于stack exchange,提问作者Accepted
相关产品推荐
相关产品推荐

