我正在尝试解决任意方程的大型系统(对于使用简单数学编写的物理组件模型的过程流程图应用程序)。
在处理非整数数字时,我对sympy的solve_poly_system函数的行为感到困惑,并且无法通过文档找出它。这个简单的代码片段:
sympy.solve_poly_system([x-5,y-x])
正如我所料,给了我[(5,5)]。当我将数字更改为浮点数时:
sympy.solve_poly_system([x-5.1,y-x])
我收到错误: 提出DomainError(“无法在%s上计算Groebner基础”%opt.domain) sympy.polys.polyerrors.DomainError:无法计算基于RR的Groebner基础
文档中提到sympy更喜欢使用自己的变量类型,所以我尝试使用'sympify'将我的输入函数转换为更适合没有运气的东西。关于如何解决这个问题的任何建议?我只是使用了错误的工具吗?
注意:显然这是一个微不足道的例子,我只是想说明我已经提炼出的基本问题。
我在Windows 7上使用python 2.7。
答案 0 :(得分:2)
尝试使用SymPy 0.7.4(几天前刚刚发布)。这现在有效。
In [37]: solve_poly_system([x-5,y-x])
Out[37]: [(5, 5)]
In [38]: solve_poly_system([x-5.1,y-x])
Out[38]: [(5.1, 5.1)]
要澄清这个问题的一些困惑:
SymPy确实使用自己的类型,但在大多数情况下,您无需担心这一点。评估x - 5.1
时,会在__sub__
和x
(5.1
)上调用Symbol
方法,该方法会立即将5.1
转换为{Float(5.1)
1}}使用sympify
。您唯一需要担心的是当您执行操作时,两个操作数都不是SymPy类型,并且SymPy行为与内置行为不同(例如,您不必担心1 - 4
与sympify(1) - sympify(4)
)。唯一的例子是int/int
,例如1/4
。 Python会将此评估为0
(或Python 3中的0.25
),而SymPy会将其评估为Rational(1, 4)
。因此,在这种情况下,您需要同意其中一个论点以获得理性,例如S(1)/4
(S
是sympify
的简写)。
DomainError事件是指解算器使用的多项式的内部表示。它从未打算被用户看到(这是一个错误)。特别是,这个错误与某些算法没有实现浮点数(与有理数相反)的事实有关。
如果您仍然看到错误的更多非常重要的示例,请在SymPy issue tracker中将其报告为错误。