我正在构建2D粒子模拟程序,但遇到了问题。 电荷为q1和q2且质量为m1和m2且其中心之间的距离为r的任何两个粒子均根据此定律承受力:
F q = K *(q1 * q2)/(r 2 )
F c = C * sqrt(m1 * m2)/(r 3 )
K和C是常数。
两个带相同符号电荷的粒子相互排斥,两个带相反符号电荷的粒子相互吸引。两个带不同符号电荷的粒子最终应该找到平衡,但我遇到一个问题:当两个粒子真正靠近时,它们的行为可能很奇怪。看来他们:
a)花费少得多的能量来达到较高的能量状态,并且当它们彼此非常靠近时,它们会像疯了似的在房间内奔跑。通常在(C / K)不太大(C = 10,K = 5)或精度常数很低的情况下发生这种情况。
b)互相紧握并再次开始运动,获得能量,(C / K)很大,即(C = 50,K = 5)(请参阅https://imgur.com/XZhug5R:fps = 60,precision = 10,速度= 1)。
引擎的工作方式如下:常数 dt = 1000 /(fps *精度/速度)。然后,每个粒子在时间段[t; t + dt]内线性改变其速度和位置。将精度从10更改为100会降低效果的幅度,但会使一切运行缓慢,并且仍然无法解决问题。
设计引擎时我做错了什么?有什么技巧可以提高精度并避免此问题?
答案 0 :(得分:2)
我不知道如何实现静态平衡-充其量,您将拥有某种动态平衡。您具有非零势能,并且没有引起阻尼(例如摩擦)的东西。粒子将以无限的精度以某种周期性模式(例如,彼此绕行)彼此运动。
不能在计算机上真正实现无限精度,但是浮点精度不太可能成为观察到的问题(尽管无论如何,只要运行足够长的时间,都会存在浮点精度)。
我不完全了解您如何编码“线性改变速度和位置”。请注意,您不能简单地假设在给定时间t
上计算出的力将保持恒定,直到时间t+dt
为止,并根据此假设来改变速度和位置。从允许您直接应用您选择的力定律的角度来看,这似乎很容易,但是无论您的dt
多么小,它仍然是有限的-并且进行此假设将引入相当大的误差。大于FP逼近所引起的任何误差。给定时间t
的初始位置和速度,要正确计算t+dt
处的状态,您需要(通常情况下)求解微分方程。您无法进行acceleration = force / mass
类型的简单数学运算(因为力会随着身体的移动而不断变化)。