当浮点数的变化时,Sympy solve()停止使用单个线性方程

时间:2014-03-22 00:08:47

标签: sympy

我已经尝试过这个问题,并在我最近的Anaconda iPython' sympy版本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
[]

这种情况在具有小蟒蛇浮子或同情浮子的方程式中始终如一。

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

3 个答案:

答案 0 :(得分: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位精度的答案(尽管这种方法也适用于默认精度)。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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