2D N 人体模拟
2D N body simulation
我遵循了在维基百科上找到的 n 体问题的方程式,并实现了一个简单的 O(n²) n 体模拟。然而,一旦我将模拟可视化,事情就不会像预期的那样运行,即所有粒子都远离中心移动,就好像它们具有高排斥力一样。一开始我以为我可能弄错了力矢量的方向,但我试着翻转它,结果几乎一样。
data = np.random.rand(100, 2)
velocities = np.zeros_like(data)
masses = np.ones_like(data)
dt = 60 * 60 * 24
for _ in range(10000):
forces = np.zeros_like(data)
for i, node1 in enumerate(data):
for j, node2 in enumerate(data):
d = node2 - node1
# First term is gravitational constant, 1e-8 is a softening factor
forces[i] += 6.67384e-11 * d / (np.sqrt(d.dot(d) + 1e-8) ** 3)
velocities += forces * dt / masses
data += velocities * dt
yield data # for visualization
我还认为它可能在 2D 中不起作用(尽管没有理由根本不应该,所以我也通过将随机尺寸设置为 (100, 3) 在 3D 中进行了尝试,但是行为是一样的。
我查看了在线提供的其他代码,但我似乎找不到我做错了什么(或与其他代码不同),所以任何帮助将不胜感激。
编辑 1
这实际上似乎与方程式一致。我已经为 [-1, 1] 和 [1, 1](忽略 G)和 p1 手动计算了前几个步骤,力分别为 [0.25, 0.7, 81, 0, 0]。然而,由于从第三步开始速度非常高,而且粒子 p2 与 p1 的行为相反,它们移动得非常快。但是,在网上很容易找到的其他实现不会面临这个问题。我似乎无法弄清楚为什么。我认为这可能是初始化,但其他实现似乎并没有受到影响。
我的 dt 太大了。将 dt 设置为较小的值,例如0.05 做到了。
我遵循了在维基百科上找到的 n 体问题的方程式,并实现了一个简单的 O(n²) n 体模拟。然而,一旦我将模拟可视化,事情就不会像预期的那样运行,即所有粒子都远离中心移动,就好像它们具有高排斥力一样。一开始我以为我可能弄错了力矢量的方向,但我试着翻转它,结果几乎一样。
data = np.random.rand(100, 2)
velocities = np.zeros_like(data)
masses = np.ones_like(data)
dt = 60 * 60 * 24
for _ in range(10000):
forces = np.zeros_like(data)
for i, node1 in enumerate(data):
for j, node2 in enumerate(data):
d = node2 - node1
# First term is gravitational constant, 1e-8 is a softening factor
forces[i] += 6.67384e-11 * d / (np.sqrt(d.dot(d) + 1e-8) ** 3)
velocities += forces * dt / masses
data += velocities * dt
yield data # for visualization
我还认为它可能在 2D 中不起作用(尽管没有理由根本不应该,所以我也通过将随机尺寸设置为 (100, 3) 在 3D 中进行了尝试,但是行为是一样的。
我查看了在线提供的其他代码,但我似乎找不到我做错了什么(或与其他代码不同),所以任何帮助将不胜感激。
编辑 1 这实际上似乎与方程式一致。我已经为 [-1, 1] 和 [1, 1](忽略 G)和 p1 手动计算了前几个步骤,力分别为 [0.25, 0.7, 81, 0, 0]。然而,由于从第三步开始速度非常高,而且粒子 p2 与 p1 的行为相反,它们移动得非常快。但是,在网上很容易找到的其他实现不会面临这个问题。我似乎无法弄清楚为什么。我认为这可能是初始化,但其他实现似乎并没有受到影响。
我的 dt 太大了。将 dt 设置为较小的值,例如0.05 做到了。