在我自己最近的Anaconda iPython‘Anaconda版本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,但是看到人们将它用于微积分。我是做了什么蠢事,还是这是一个同情解决问题的错误。如果它是一个bug,我如何解决它呢?
发布于 2014-03-22 06:04:35
这看起来像个窃听器。我还没有彻底地阅读过他们的源代码,无法肯定地说,但我会继续报告,然后现在使用解决办法。
有一些方法可以解决这个问题。首先,您可以查看SymPy是如何安装的。我使用SymPy的开发版本,并将gmpy作为所有任意精确算法的后端安装。在我的系统中,这个问题出现在6.67E-32和6.67E-33之间,而不是6.67E-8和6.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位精度的答案(尽管这种方法也适用于默认的精度)。
发布于 2014-03-23 17:38:51
尝试使用SymPy 0.7.5。这个错误在那个版本中已经修复了。
发布于 2014-03-24 15:33:19
尝试将标志rational=False传递给solve。
https://stackoverflow.com/questions/22571673
复制相似问题