此代码的原因是找到具有2个行星(粒子)的行星系统彼此之间相遇的时间。但是,对于具有5个粒子的行星系统,我想解决这个问题。这将打印在最后一行print(sim.t)
。
http://rebound.readthedocs.io/en/latest/examples.html以下是一些关于REBOUND用法的文档,您可以在其中找到我所做的一些声明的最佳解释。
sim = setupSimulation()
sim.exit_min_distance = 0.01
Noutputs = 10000
year = 2.*np.pi
times = np.linspace(0.,10E+9.*year, Noutputs)
distances = np.zeros(Noutputs)
ps = sim.particles
try:
for i,time in enumerate(times):
sim.integrate(time)
dp = ps[1] - ps[2]
distances[i] = np.sqrt(dp.x*dp.x+dp.y*dp.y+dp.z*dp.z)
except rebound.Encounter as error:
print(error)
print(sim.t)
第2行定义了两个粒子之间的近距离接触(达到此值时模拟将停止)。
第11行采用粒子坐标的差异,如果< = .01,则表示存在近距离接触。
我正在考虑if-then声明:
if ps[1] - ps[2] <= .01:
dp = ps[1] - ps[2]
else ps[2] - ps[3] <= .01:
dp = ps[2] - ps[3]
依旧......
我想在运行它之前确保它的工作原理只是因为模拟时间是10e + 9年,并且只能在本地超级计算机上运行以在合理的时间内获得结果。
答案 0 :(得分:0)
我不明白为什么if语句方法不能用于检测是否有任何两个粒子彼此足够接近。编辑:编写此示例,就像2个粒子的代码示例正在运行一样。
根据您是否需要检查非连续粒子,您需要生成每个组合并进行检查(如示例所示)。
看起来你还需要一个不同的距离枚举策略。如果索引不必与时间计数器匹配,则可以增加一个单独的计数器(如示例所示)。
您还可以使用itertools
生成if语句以避免拼写错误并提高清晰度:
import itertools
# other setup code
counter = 0
try:
for time in times:
sim.integrate(time)
for p0, p1 in itertools.combinations(range(1, 6)): # generates combinations of the particles numbered 1 thru 5
dp = ps[p0] - ps[p1]
distances[counter] = np.sqrt(dp.x*dp.x+dp.y*dp.y+dp.z*dp.z)
counter += 1
except rebound.Encounter as error:
print(error)
我会添加一些 - 为了确保您的代码有效,您可能应该为它编写某种测试套件。如果它解决而不会解决会发生什么。
您可以创建一个对象来模拟sim
及其方法,在知道的位置返回正文将会或不会满足您的退出条件,而不需要超级计算机的所有开销。你可以在一个小清单中对它们进行硬编码。