我正在尝试模拟Python中的引力N体问题。我在ith体上加速的代码与
具有相同的结构def acc(r,m,eps):
a = np.zeros((len(r),3))
for i in range(len(r)):
for j in range(len(r)):
ra2 = ((r[i,:]-r[j,:])**2).sum()
if (i != j):
a[i,:] += -(r[i,:]-r[j,:])*m[j]/(ra2**1.5)
return a # return acceleration
可在此处找到http://wiki.tomabel.org/index.php?title=Gravitational_N-body_Problem
然而,在这种格式中,我们不会进行不必要的计算,因为粒子j对粒子i的作用力只会是由于粒子i对粒子j的力的负面影响吗?为了让程序运行得更快,我们如何考虑这一点?我想某种方式拿一个N×N阵列,填充一半,然后进行转置,但我不确定如何做到这一点,或者是否有更好的方法。
非常感谢
答案 0 :(得分:1)
我会建议这样的事情:
def acc(r,m,eps):
a = np.zeros((len(r),3))
for i in range(len(r))[:-1]:
for j in range(len(r))[i+1:]:
ra2 = ((r[i,:]-r[j,:])**2).sum()
f= -(r[i,:]-r[j,:])*m[j]/(ra2**1.5)
a[i,:] += f
a[j,:] += -f
return a # return acceleration
通过这种方式,您可以同时更新i和j加速度,因此您可以始终假设j>我可以让你避免重复计算。