sympy.polys.polyerrors.PolynomialError:不支持非交换表达式

问题描述 投票:0回答:1

我使用 sympy.groebner 遇到以下错误:“sympy.polys.polyerrors.PolynomialError:不支持非交换表达式”。

在真实的情况下,我的表达非常困难,不容易减少。要减少的多项式

p
的开头是

enter image description here

我得到(其中

compute_vtmv_product
计算一个多项式
p
应该使用 Groebner 基来减少)

enter image description here

我尝试减少问题(与实际示例中创建/使用变量的方式相同),但问题似乎消失了

enter image description here

在实际情况中,变量是混合的,所以我尝试添加 a/b/c 变量与 x/y/z 变量混合,但我得到 enter image description here

有人知道这些问题的原因吗?

sympy polynomials groebner-basis
1个回答
0
投票

您使用的是旧版本的 SymPy,但使用最新版本 1.13.1,您会在此处看到不同的错误:

CoercionFailed: expected an integer, got a

原因是

Groebner
归约方法期望要归约的表达式应该是具有与 Groebner 基相同的生成器和定义域的多项式。有两种方法可以做到这一点:

  • 将符号 a、b 和 c 作为变量添加到基础中。
  • 计算包含符号 a、b 和 c 的域上的基
In [21]: x, y, z = symbols('x, y, z')

In [22]: a, b, c = symbols('a, b, c')

In [23]: groebner([x, y, z])
Out[23]: GroebnerBasis([x, y, z], x, y, z, domain=ℤ, order=lex)

In [24]: groebner([x, y, z], [x, y, z, a, b, c])
Out[24]: GroebnerBasis([x, y, z], x, y, z, a, b, c, domain=ℤ, order=lex)

In [25]: groebner([x, y, z], domain=QQ[a, b, c])
Out[25]: GroebnerBasis([x, y, z], x, y, z, domain=ℚ[a, b, c], order=lex)

In [26]: G = groebner([x, y, z], domain=QQ[a, b, c])

In [27]: p = a*x + b*y + c*z

In [28]: G.reduce(p)
Out[28]: ([a, b, c], 0)
© www.soinside.com 2019 - 2024. All rights reserved.