我的Python代码计算时间太长!我能用numpy更快地计算吗?如果是,怎么做?
我的目标是用Verlet算法计算行星运动 问题是,代码大约需要30分钟才能完成一个完整的循环。这是基本的计算,所以我不知道为什么要花这么长时间 我在这里读了一些,使用我的Python代码计算时间太长!我能用numpy更快地计算吗?如果是,怎么做?,python,numpy,Python,Numpy,我的目标是用Verlet算法计算行星运动 问题是,代码大约需要30分钟才能完成一个完整的循环。这是基本的计算,所以我不知道为什么要花这么长时间 我在这里读了一些,使用numpy应该更快,对吗 但是我如何实现它呢?此外,它应该绕一整圈,停在0(或者2*pi*r\u earth,如果它在计算行驶距离),但它根本不停,只是继续,有人能看到我的极限为什么不起作用吗? 这是我的密码: grav = 6.673481*(10**-11) # = 6.673481e-11
numpy
应该更快,对吗
但是我如何实现它呢?此外,它应该绕一整圈,停在0
(或者2*pi*r\u earth
,如果它在计算行驶距离),但它根本不停,只是继续,有人能看到我的极限为什么不起作用吗?
这是我的密码:
grav = 6.673481*(10**-11) # = 6.673481e-11 # a direct way
m_sun = 1.989*(10**30) # = 1.989e+30
m_earth = 5.972*(10**24) # = 5.972e+24
r_earth = 149.59787*(10**9) # = 1.4959787e+11
def verlet_v( prev_v, prev_f, mass ):
current_v = ( prev_v + ( prev_f / mass ) )
print "New Velocity: %f" % current_v
return current_v
def verlet_x( prev_x, current_v ):
current_x = prev_x + current_v
print "New Position: %f" % current_x
return current_x
verlet_v( 20, 50, 3 )
v = 29.8*(10**3) # = 2.98e+04
x = 0
f = ( -grav * ( ( m_earth * m_sun ) / r_earth**2 ) )
v_history = []
x_history = []
while( abs(x) > ( -0.1 ) ): # ABS( <_anything_> ) is ALWAYS > -0.1
print "Mod(x): %f" % abs(x)
print "Limit: %f" % (0)
v = verlet_v( v, f, m_earth )
x = verlet_x( x, v )
v_history.append(v)
x_history.append(x)
print v_history
print x_history
grav=6.673481*(10**-11)#=6.673481e-11#直接方式
孙明宇=1.989*(10**30)#=1.989e+30
m_接地=5.972*(10**24)#=5.972e+24
r_地球=149.59787*(10**9)#=1.4959787e+11
def verlet_v(上一个,上一个,质量):
当前体积=(上体积+(上体积/质量))
打印“新速度:%f”%current\u v
返回电流
def verlet_x(上一个,当前个):
当前x=上一个x+当前v
打印“新职位:%f”%current\u x
返回电流
verlet_v(20,50,3)
v=29.8*(10**3)#=2.98e+04
x=0
f=(-grav*((地球*太阳)/地球**2))
v_历史=[]
x_历史=[]
而(abs(x)>(-0.1)):#abs()始终大于-0.1
打印“模块(x):%f”%abs(x)
打印“限制:%f”%(0)
v=verlet_v(v,f,m_接地)
x=verlet_x(x,v)
v_history.append(v)
x_history.append(x)
打印v_历史记录
打印x_历史记录
你似乎陷入了一个无限循环
abs(x)
给出一个始终为正的数字的绝对值。这意味着它永远不会低于-0.1
,因此您的while循环永远不会结束
您需要将abs(x)或
-0.1
更改为其他内容。一个建议是定义“历史记录”数组,而不是每次迭代都将其追加。这样,就预先保留了一块内存。这将提高性能。但是,您需要提前计算出v_历史
和x_历史
的大小
例如,使用1D阵列:
v_history = np.zeros((k,))
x_history = np.zeros((k,))
其中(k,)
是数组的形状
然后需要使用索引值将计算值存储在数组中
# outside loop
x=0
# inside loop
v_history[x] = v
x +=1
另外,你可能想开始考虑我认为Numpy不会帮你:你需要以前的职位来计算新的职位。Numpy一次对许多变量(例如位置)进行操作,但由于只能逐个计算,因此无法同时计算所有变量。也许你可以试试Cython,但要注意的是,使用Cython可能会被扔进深渊。如果你想用你的代码计算它,请使用Everts的建议。如果你对ode的快速解决方案感兴趣,请查看并相应地重新规划你的问题。目前,你的星球只是直线加速,因此代码无法检测到某种“循环”并停止运行
:)