我的Python代码计算时间太长了!我可以使用numpy来更快地计算出来吗?如果是这样,怎么样?

时间:2014-10-10 09:49:14

标签: python numpy

我的目标是使用Verlet算法计算行星运动。

问题是,代码大约需要30分钟才能完成一个完整的循环。这是基本的计算,所以我不知道它为什么花了这么长时间。

我已经在这里阅读了一下,使用 numpy 应该更快吧?

我如何实现它?此外,它应该是完整的圆圈并停在0(或2*pi*r_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

2 个答案:

答案 0 :(得分:2)

好像你陷入了无限循环。

abs(x)给出一个始终为正的数字的绝对值。这意味着它永远不会低于-0.1,因此你的while循环永远不会结束。

您需要将abs(x)-0.1更改为其他内容。

答案 1 :(得分:0)

一个建议是定义“历史”数组before your loop,而不是每次迭代都附加它们。这样,预先保留一块存储器。这应该可以提高性能。但是,您需要提前确定v_historyx_history的大小。

例如,使用1D数组:

v_history = np.zeros((k,))
x_history = np.zeros((k,))

其中(k,)是数组的形状。

然后,您需要使用索引值将计算值存储在数组

# outside loop
x=0

# inside loop
v_history[x] = v
x +=1

您也可以开始考虑broadcasting