【问题标题】:Sympy solve() stops working with a single linear equation when magnitude of floats changes当浮点数发生变化时,Sympy solve() 停止使用单个线性方程
【发布时间】:2014-03-22 00:08:47
【问题描述】:

我已经在 sympylive 和我自己最近的 Anaconda iPython 'sympy version 0.7.4.1' 上尝试过这个,结果相同:

m1,m2,r, F, G = symbols("m_1 m_2 r F_g G")
G = Float("6.67e-8")
rhs = (G * m1 * m2/r**2)


eq = Eq(F, rhs)
print eq

s=solve(eq, m1)
print s

给出了结果:

F_g == 6.67e-8*m_1*m_2/r**2
[14992503.7481259*F_g*r**2/m_2]

我重新运行了程序,只做了一个更改 - 将 e-8 更改为 e-9

G = Float("6.67e-9")

给出了结果

F_g == 6.67e-9*m_1*m_2/r**2
[]

这在带有小型 python 浮点数或 sympy 浮点数的方程中始终如一地发生。

我注意到another report 0.72 版中的基本代数错误,但看到人们将它用于微积分。我是在做一些非常愚蠢的事情,还是这是 sympy 求解器中的错误。如果是错误,我该如何解决?

【问题讨论】:

    标签: sympy


    【解决方案1】:

    这看起来像一个错误。 我还没有彻底阅读他们的源代码,无法确定,但我会继续报告它,然后暂时使用解决方法。

    有一些方法可以解决这个问题。 首先,您可以查看 SymPy 的安装方式。 我使用 SymPy 的开发版本并安装了 gmpy 作为所有任意精度算术的后端。 在我的系统上,这个问题出现在6.67E-326.67E-33 之间,而不是6.67E-86.67E-9 之间。 获取开发版本并切换后端可能会有所帮助。 另一方面,这只是对您的系统以及 SymPy 的配置方式的猜测。 我可能完全错了。

    仅部分更改设置可避免该错误。 这是完全避免此问题的代码的修改版本:

    import sympy as sy
    m1, m2, r, F, G = sy.symbols("m_1, m_2, r, F_g, G")
    rhs = (G * m1 * m2/r**2)
    eq = sy.Eq(F, rhs)
    print eq
    s=sy.solve(eq, m1)
    print s[0].subs(G, sy.Float("6.67E-10000000000000000000", 1000))
    

    唯一的区别是这段代码让 SymPy 使用符号完成所有工作,然后在最后替换浮点数。 尽管指数非常高,但这会在我的机器上返回正确答案。 用于实例化Float 对象的第二个参数是精度。 这显示了 1000 位精度的答案(尽管这种方法也适用于默认精度)。

    【讨论】:

      【解决方案2】:

      尝试使用 SymPy 0.7.5。此错误已在该版本中修复。

      【讨论】:

      • 不起作用。现在刚刚下载并测试了7.5。 G=sympy.Float("6.67e-32") 有效,但 e-33 给出相同的错误。
      • 它现在可以在最新的开发版本中使用。
      【解决方案3】:

      尝试将标志 rational=False 传递给 solve

      【讨论】:

        猜你喜欢
        • 2019-07-19
        • 1970-01-01
        • 1970-01-01
        • 2018-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-23
        • 1970-01-01
        相关资源
        最近更新 更多