我的目标是使用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
答案 0 :(得分:2)
好像你陷入了无限循环。
abs(x)
给出一个始终为正的数字的绝对值。这意味着它永远不会低于-0.1
,因此你的while循环永远不会结束。
您需要将abs(x)
或-0.1
更改为其他内容。
答案 1 :(得分:0)
一个建议是定义“历史”数组before your loop,而不是每次迭代都附加它们。这样,预先保留一块存储器。这应该可以提高性能。但是,您需要提前确定v_history
和x_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