【问题标题】:Coding a physics simulation using iterative functions and time steps使用迭代函数和时间步对物理模拟进行编码
【发布时间】:2018-07-15 22:32:36
【问题描述】:

我想创建一个物理模拟,其中初始值将是所有物体的初始位置向量、所有物体的初始速度向量、所有物体的质量、所有物体的电荷, 初始时间为 0。

模拟中计算两个物体之间距离的距离公式应与欧几里得空间中的距离公式相同。

任何物体上任何其他物体的力矢量将取决于两个物体的电荷乘以两个物体之间的距离 f(距离)乘以(该物体的位置矢量减去位置的函数)的乘积另一个物体的矢量)除以两个物体之间的距离。任何物体上的总力矢量将取决于该物体上来自其他物体的所有力矢量的总和。任何物体的加速度矢量取决于该物体上的总力矢量除以该物体的质量。

在初始时间步之后的每个时间步中,每个物体的新位置向量将取决于 1/2 乘以先前的加速度向量乘以先前的时间步长的平方加上先前的速度向量乘以先前的时间步长加上前一个位置向量。新的速度向量将取决于先前的加速度向量乘以先前的时间步长加上先前的速度向量。此外,经过的新时间将取决于之前经过的时间加上之前的时间步长。

如果我改变维数、添加新物体、移除现有物体、改变现有物体的质量、改变现有物体的电荷,公式需要自动调整以继续匹配我之前所说的内容,改变现有物体的位置矢量,改变现有物体的速度矢量,或者改变我前面提到的力公式中的距离函数。

模拟应该在超过三个维度的空间中工作。同样对于我在第三段中提到的距离函数 f(距离),模拟应该支持尽可能多的距离函数,包括距离的三角函数,例如距离的 sin(距离)和 cos(距离),双曲线距离的三角函数,例如距离的 cosh(distance) 和 sinh(distance) 多项式,距离的幂,例如 e^distance,距离的对数,距离的 Bessel 函数,距离的误差函数,以及这些功能和其他功能(如果可能)的组合。

理想情况下,模拟应该有可能每分钟运行数百万个时间步,以便模拟速度快,同时最大限度地减少模拟计算中的累积误差。

如何编写符合上述所有标准的物理模拟以及哪种类型的程序最适合此类模拟?

【问题讨论】:

  • 这个问题及其变体已经并继续在计算科学中得到广泛研究。您可能比将您最喜欢的搜索引擎指向 n-body 模拟 做得更糟。我认为您在 SO 所提出的限制内得到一个好的答案的机会非常接近0
  • 如果你打算自己创建这个程序,我建议你先从很多简单的东西开始,然后再构建。

标签: math simulation physics game-physics skphysicsbody


【解决方案1】:

让我们一次解决这些问题:

要处理任意数量的维度,您必须将位置、速度和加速度向量存储为数组,然后在这些数组上映射一些函数,而不是显式接受 x、y 和 z 或其他东西。

将您的位置/速度/加速度/力数组和电荷存储在代表该对象的某个对象或结构中,并将所有这些存储在一个更大的数组中,然后您可以对其进行迭代以计算力向量,并更新力相应的数组。计算完所有力后,更新位置/速度/加速度,并重置力矢量。

为了满足您的准确性和性能要求,您可能必须使用 C 之类的编译语言编写此模拟。此外,为了支持您列出的所有距离函数,您可能需要使用组合查找表和算术技巧/近似值以足够快地获得值。

尝试先写出所有公式,看看可以应用哪些代数化简,以节省额外的计算步骤(您可以将所有内容加倍以避免除以二,您是否可以平方某项以避免平方根等)。要知道除法比乘法慢得多,而且平方根的成本更高(想想距离大小)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    相关资源
    最近更新 更多