【问题标题】:How to obtain only rational and not floating point results using sympy如何使用 sympy 仅获得理性而非浮点结果
【发布时间】:2021-01-24 14:51:42
【问题描述】:

我考虑以下矩阵:

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


    【解决方案1】:

    这是 SymPy 文档中gochas and pitfalls 之一的示例。我的回答基本上会重申那里所说的话。我强烈建议您通过它。

    当您键入1/7 时,Python 解释器会在 SymPy 有机会将其识别为有理数之前将其更改为浮点数。为了让 SymPy 在 Python 之前对其进行评估,您需要使用其他方法。您已经使用M2 展示了其他方法之一:将 SymPy 对象除以 7 而不是 Python int 除以 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 识别有理数。

    【讨论】:

    • 这就是我要找的。我想我会选择后一种解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 2022-09-27
    • 2012-07-27
    相关资源
    最近更新 更多