You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 21:42:38