如何在计算交叉点时防止SymPy使用精确的有理数?

时间:2018-04-07 20:22:20

标签: python geometry sympy

我注意到我的Python 2.7代码很慢,因为SymPy使用精确的有理数而不是浮点数作为数字。我的代码基本上计算了直线,平面和类似几何对象之间的交叉点。我找到了this question,其中解释说你可以通过传入evaluate=False来加速几何对象的创建,这会迫使SymPy保留浮点数。我已经为我正在交叉的对象做了这个,虽然交叉结果是使用精确的有理数返回的(虽然我想要浮点数,即使精度丢失了)。例如:

>>> import sympy as sp
>>> l = sp.Line((0,0),(1.1,1.1), evaluate=False)
>>> sp.Line((1.1,0),(0,1.1), evaluate=False).intersection(l)
[Point2D(11/20, 11/20)]

如何禁用精确计算?另外一个图书馆也将被考虑。

1 个答案:

答案 0 :(得分:0)

这不是关于交叉的。当你这样做

l = Line((0, 0), (1.1, 1.1), evaluate=False)

结果是Line2D(Point2D(0, 0), Point2D(11/10, 11/10)) - 理性已存在。原因是你传递了元组而不是点,所以Line类的创建者首先将它们转换为Points。并且使用默认评估设置进行转换。

因此,请在此过程的早期使用evaluate=False

l = Line(Point((0, 0), evaluate=False), Point((1.1, 1.1), evaluate=False))
res = Line(Point((1.1, 0), evaluate=False), Point((0, 1.1), evaluate=False)).intersection(l)

返回[Point2D(0.550000000000000, 0.550000000000000)]

(这是假设from sympy import Line, Point,因为我不想一直输入前缀。)

我不承诺这会让这个过程更快。几何模块的效率并不为人所知。