基于维基百科公式的O(n²)二维N体模拟异常:粒子向外扩散
嘿,我之前做N体模拟时也踩过类似的坑,粒子集体“叛逃”的样子真的让人头大!咱们一步步来揪出问题:
引力公式的符号&向量方向再仔细核对
虽然你说已经翻转过力向量,但再确认下核心公式:对于粒子i受到粒子j的引力,正确的向量计算应该是:r_ij = r_j - r_i(从粒子i指向j的向量)
引力大小是G * m_i * m_j / |r_ij|²,方向是朝向j,所以完整的力向量是:F_ij = G * m_i * m_j * r_ij / |r_ij|³
这里的关键是分母是距离的三次方(因为要把r_ij转成单位向量再乘以力的大小)。如果不小心写成了|r_ij|²,力的大小会随距离衰减得更慢,可能导致粒子被“甩”出去;如果符号搞反(比如加了负号),就会变成排斥力——但你说翻转后还是不行,那可能是其他环节出问题了。检查积分方法与步长
如果你用的是简单的欧拉法,那步长太大很容易导致数值不稳定,哪怕力的方向是对的,粒子也会因为积分误差出现“爆炸式”运动,看起来像是被排斥。试试把时间步长调到原来的1/10甚至1/100,看看粒子会不会开始往中心聚集。如果改善了,那就是欧拉法的锅,可以换成Verlet积分或者Runge-Kutta法,稳定性会好很多。初始条件是否合理
有没有可能给粒子设置了过大的初始向外速度?如果初始速度超过了系统的逃逸速度,哪怕有引力拉着,粒子也会一直往外跑。可以先把所有粒子的初始速度设为0,看它们会不会自然向中心聚拢——如果会,那就是初始速度的问题;如果还是往外飞,那再回到力的计算上找问题。质量参数是否全为正
别笑,我真的见过有人不小心把质量设成负数的情况!如果粒子质量是负的,万有引力公式就会变成排斥力,哪怕你翻转力向量,负质量的乘积还是会让力的方向变回排斥。赶紧检查下所有粒子的mass值是不是都是正数。坐标系的可视化映射问题
有时候物理计算是对的,但可视化时坐标系搞反了(比如屏幕的y轴向下,而物理模拟的y轴向上),导致看起来粒子在往外飞,但实际运动是对的?不过这种情况一般不会所有粒子都向外,还是先排查前面的核心问题。
如果这些都试过了还是不行,建议贴出你计算力和更新粒子位置/速度的核心代码片段,这样更容易精准定位问题!
内容的提问来源于stack exchange,提问作者Pavlin

