首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当浮子的大小发生变化时,Sympy solve()停止处理一个单一的线性方程。

当浮子的大小发生变化时,Sympy solve()停止处理一个单一的线性方程。
EN

Stack Overflow用户
提问于 2014-03-22 00:08:47
回答 3查看 190关注 0票数 1

在我自己最近的Anaconda iPython‘Anaconda版本0.7.4.1’中,我尝试了这一点,并得到了同样的结果:

代码语言:javascript
复制
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

其结果是:

代码语言:javascript
复制
F_g == 6.67e-8*m_1*m_2/r**2
[14992503.7481259*F_g*r**2/m_2]

我用一个更改将e-8改为e-9重新运行该程序。

代码语言:javascript
复制
G = Float("6.67e-9")

给出了结果

代码语言:javascript
复制
F_g == 6.67e-9*m_1*m_2/r**2
[]

这种情况在含有小蟒蛇浮子或渐近浮体的方程中是一致的。

我注意到了0.72版本中基本代数错误的another report,但是看到人们将它用于微积分。我是做了什么蠢事,还是这是一个同情解决问题的错误。如果它是一个bug,我如何解决它呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-22 06:04:35

这看起来像个窃听器。我还没有彻底地阅读过他们的源代码,无法肯定地说,但我会继续报告,然后现在使用解决办法。

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

仅部分更改设置可避免错误。下面是一个修改过的代码版本,它完全避免了这个问题:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-03-23 17:38:51

尝试使用SymPy 0.7.5。这个错误在那个版本中已经修复了。

票数 1
EN

Stack Overflow用户

发布于 2014-03-24 15:33:19

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22571673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档