用Sympy计算黄金比例可得出复杂的结果



我正在尝试使用sympy构建常规五角形,然后计算对角线与边缘的比率。已知这是黄金比率(1 + sqrt(5)) / 2,但Sympy无法正确计算它。Sympy手工简化后的答案是黄金比率和-i(负假想常数(的产物,-i * (1 + sqrt(5)) / 2

from sympy import simplify
from sympy.geometry import RegularPolygon, Point
sides = 5
polygon = RegularPolygon(Point(0, 0), 1, sides)
diagonal = polygon.vertices[0].distance(polygon.vertices[2])
print("Ratio:", simplify(diagonal/polygon.length))

Ratio: sqrt(sqrt(5) + 5)/sqrt(-sqrt(5) + 5)

我使用的是sympy,因为我需要具有精确的值,并且在转到其他多边形之前,将五角大楼用作测试案例。有没有办法确保Sympy避免提供复杂的解决方案?

使用nsimplify而不是简化修复此操作。

我使用的是Sympy,因为我需要具有精确的值

Synpy用于符号数学。如果您真的需要"确切的值"。对于可用的精确度,也许MPMATH会更合适。

也就

from sympy import simplify
from sympy.geometry import RegularPolygon, Point
from sympy import GoldenRatio
sides = 5
polygon = RegularPolygon(Point(0, 0), 1, sides)
diagonal = polygon.vertices[0].distance(polygon.vertices[2])
print("Ratio:", simplify(diagonal/polygon.length))
print(simplify(diagonal/polygon.length).equals(GoldenRatio))
Ratio: sqrt(sqrt(5) + 5)/sqrt(5 - sqrt(5))
True

再次,这是符号数学。没有人拥有计算机功率,如果有的话,python都没有能够准确比较非理性数字的能力。

例如:

>>> 1/3
0.3333333333333333
>>> 1/3 * 3
1.0
>>> 0.3333333333333333 * 3
1.0

cpython只是很难定义0.9〜==1。

因此这些比较行不通:

>>> from sympy import GoldenRatio, simplify
>>> simplify(diagonal/polygon.length) == GoldenRatio
False
>>> import math
>>> GoldenRatio.equals(math.sqrt(math.sqrt(5)+5)/math.sqrt(5-math.sqrt(5)))
False

另一个示例:

>>> from sympy import GoldenRatio, simplify
>>> simplify(diagonal/polygon.length) - GoldenRatio
-GoldenRatio + sqrt(sqrt(5) + 5)/sqrt(5 - sqrt(5))
>>> (simplify(diagonal/polygon.length) - GoldenRatio) == 0
False
>>> (simplify(diagonal/polygon.length) - GoldenRatio).equals(0)
True

我非常抱歉,我无法避免这种情况:简化,伙计

最新更新