粒子在我的物理引擎中表现异常
Particles behave strangely in my physics engine
我正在构建一个 2D 粒子模拟程序,我遇到了一个问题 运行。
任意两个电荷为 q1 和 q2 且质量为 m1 和 m2 且中心间距离为 r 的粒子都会根据此定律受到力:
Fq = K * (q1 * q2) / (r2)
Fc = C * sqrt(m1 * m2) / (r3)
K和C是常数。
两个带相同电荷符号的粒子相互排斥,两个带相反电荷符号的粒子相互吸引。两个带不同符号电荷的粒子最终应该会找到平衡,但我 运行 遇到了一个问题:当两个粒子非常靠近时,它们的行为可能会很奇怪。似乎他们:
a) 花费更少的能量来达到更高的能量状态,并在他们彼此非常接近时开始 运行 疯狂地在房间里转来转去。这通常发生在 (C/K) 不是很大 (C=10, K=5) 或精度常数很低的情况下。
b) 紧贴彼此并开始移动,再次获得能量,其中 (C/K) 相当大,即 (C=50, K=5)(参见 https://imgur.com/XZhug5R:fps=60,精度= 10, 速度=1).
引擎按以下方式工作:常量 dt = 1000/(fps*precision/speed)。然后每个粒子在时间段 [t;t+dt] 内线性改变其速度和位置。将精度从 10 更改为 100 会降低影响的幅度,但会使一切变得非常缓慢 运行 并且仍然无法解决问题。
我在设计引擎时做错了什么?有什么技巧可以提高精度并避免这个问题吗?
我看不出静态平衡如何可能 - 充其量,您将拥有某种动态平衡。你有 non-zero 势能,没有任何东西会导致阻尼(例如摩擦)。以无限的精度,粒子将以某种周期性模式相互移动(例如,相互绕行)。
Infinite-precision 无法在计算机上真正完成,但 floating-point 精度不太可能是观察到的问题(尽管它会是,如果你 运行 模拟反正够长了)。
我不完全理解你是如何编码 'changes speed and position linearly' 的。请注意,您不能简单地假设您在给定时间 t
计算的力将保持不变,直到时间 t+dt
并根据此假设改变您的速度和位置。这可能看起来很容易,因为它允许您直接应用您选择的力定律,但无论您的 dt
有多小,它仍然是有限的 - 并且做出这个假设会引入相当多的错误大于由 FP 近似引起的任何误差。给定时间 t
时的初始位置和速度,要正确计算 t+dt
时的状态,您需要(在一般情况下)求解微分方程。您无法进行 acceleration = force / mass
这种简单的数学运算(因为力会随着 body 的移动而不断变化)。
我正在构建一个 2D 粒子模拟程序,我遇到了一个问题 运行。 任意两个电荷为 q1 和 q2 且质量为 m1 和 m2 且中心间距离为 r 的粒子都会根据此定律受到力:
Fq = K * (q1 * q2) / (r2)
Fc = C * sqrt(m1 * m2) / (r3)
K和C是常数。
两个带相同电荷符号的粒子相互排斥,两个带相反电荷符号的粒子相互吸引。两个带不同符号电荷的粒子最终应该会找到平衡,但我 运行 遇到了一个问题:当两个粒子非常靠近时,它们的行为可能会很奇怪。似乎他们:
a) 花费更少的能量来达到更高的能量状态,并在他们彼此非常接近时开始 运行 疯狂地在房间里转来转去。这通常发生在 (C/K) 不是很大 (C=10, K=5) 或精度常数很低的情况下。
b) 紧贴彼此并开始移动,再次获得能量,其中 (C/K) 相当大,即 (C=50, K=5)(参见 https://imgur.com/XZhug5R:fps=60,精度= 10, 速度=1).
引擎按以下方式工作:常量 dt = 1000/(fps*precision/speed)。然后每个粒子在时间段 [t;t+dt] 内线性改变其速度和位置。将精度从 10 更改为 100 会降低影响的幅度,但会使一切变得非常缓慢 运行 并且仍然无法解决问题。
我在设计引擎时做错了什么?有什么技巧可以提高精度并避免这个问题吗?
我看不出静态平衡如何可能 - 充其量,您将拥有某种动态平衡。你有 non-zero 势能,没有任何东西会导致阻尼(例如摩擦)。以无限的精度,粒子将以某种周期性模式相互移动(例如,相互绕行)。
Infinite-precision 无法在计算机上真正完成,但 floating-point 精度不太可能是观察到的问题(尽管它会是,如果你 运行 模拟反正够长了)。
我不完全理解你是如何编码 'changes speed and position linearly' 的。请注意,您不能简单地假设您在给定时间 t
计算的力将保持不变,直到时间 t+dt
并根据此假设改变您的速度和位置。这可能看起来很容易,因为它允许您直接应用您选择的力定律,但无论您的 dt
有多小,它仍然是有限的 - 并且做出这个假设会引入相当多的错误大于由 FP 近似引起的任何误差。给定时间 t
时的初始位置和速度,要正确计算 t+dt
时的状态,您需要(在一般情况下)求解微分方程。您无法进行 acceleration = force / mass
这种简单的数学运算(因为力会随着 body 的移动而不断变化)。