如何使用 sympy 只获得有理数而不是浮点数结果
How to obtain only rational and not floating point results using sympy
我考虑以下矩阵:
M1 = Matrix([[1/7,2/7],[3/7,4/7]])
M2 = Matrix([[1,2],[3,4]])/7
它们显然是相同的,但是当我确定它们的行列式时,我得到了不同的结果:
print(M1.det())
print(M2.det())
给出以下结果:
-0.0408163265306122
-2/49
我希望第一个结果表示为有理数而不是浮点数。
这是 SymPy 文档中 gochas and pitfalls 之一的示例。我的回答基本上会重申那里所说的内容。我强烈建议您完成它。
当您键入 1/7
时,Python 解释器在 SymPy 有机会将其识别为有理数之前将其更改为浮点数。为了让 SymPy 在 Python 之前对其进行评估,您需要使用其他方法。您已经使用 M2
展示了其中一种其他方法:将 SymPy 对象除以 7,而不是将 Python 整数除以 7。以下是一些其他方法:
from sympy import *
M = Matrix([[Rational(1, 7),Rational(2, 7)],[Rational(3, 7),Rational(4, 7)]]) # create a Rational object
print(det(M))
M = Matrix([[S(1)/7,S(2)/7],[S(3)/7,S(4)/7]]) # divide a SymPy Integer by 7
print(det(M))
M = Matrix([[S("1/7"),S("2/7")],[S("3/7"),S("4/7")]]) # let SymPy interpret it
print(det(M))
M = Matrix([[1,2],[3,4]])/7 # divide a SymPy Matrix by 7
print(det(M))
M = S("Matrix([[1/7,2/7],[3/7,4/7]])") # throw the whole thing into SymPy
print(det(M))
以上所有都会给出理性决定因素。可能还有很多方法可以让 SymPy 识别有理数。
我考虑以下矩阵:
M1 = Matrix([[1/7,2/7],[3/7,4/7]])
M2 = Matrix([[1,2],[3,4]])/7
它们显然是相同的,但是当我确定它们的行列式时,我得到了不同的结果:
print(M1.det())
print(M2.det())
给出以下结果:
-0.0408163265306122
-2/49
我希望第一个结果表示为有理数而不是浮点数。
这是 SymPy 文档中 gochas and pitfalls 之一的示例。我的回答基本上会重申那里所说的内容。我强烈建议您完成它。
当您键入 1/7
时,Python 解释器在 SymPy 有机会将其识别为有理数之前将其更改为浮点数。为了让 SymPy 在 Python 之前对其进行评估,您需要使用其他方法。您已经使用 M2
展示了其中一种其他方法:将 SymPy 对象除以 7,而不是将 Python 整数除以 7。以下是一些其他方法:
from sympy import *
M = Matrix([[Rational(1, 7),Rational(2, 7)],[Rational(3, 7),Rational(4, 7)]]) # create a Rational object
print(det(M))
M = Matrix([[S(1)/7,S(2)/7],[S(3)/7,S(4)/7]]) # divide a SymPy Integer by 7
print(det(M))
M = Matrix([[S("1/7"),S("2/7")],[S("3/7"),S("4/7")]]) # let SymPy interpret it
print(det(M))
M = Matrix([[1,2],[3,4]])/7 # divide a SymPy Matrix by 7
print(det(M))
M = S("Matrix([[1/7,2/7],[3/7,4/7]])") # throw the whole thing into SymPy
print(det(M))
以上所有都会给出理性决定因素。可能还有很多方法可以让 SymPy 识别有理数。