Math 使用迭代函数和时间步对物理模拟进行编码

Math 使用迭代函数和时间步对物理模拟进行编码,math,simulation,physics,game-physics,skphysicsbody,Math,Simulation,Physics,Game Physics,Skphysicsbody,我想创建一个物理模拟,其中初始值是所有物体的初始位置向量,所有物体的初始速度向量,所有物体的质量,所有物体的电荷,以及初始时间的0 模拟中计算两个物体之间距离的距离公式应与欧几里德空间中的距离公式相同 任何其他物体施加在任何物体上的力矢量取决于两个物体的电荷乘以两个物体之间距离f(距离)的函数乘以(该物体的位置矢量减去另一物体的位置矢量)除以两个物体之间距离的乘积。任何物体上的总力矢量取决于该物体上其他物体的所有力矢量之和。任何物体的加速度矢量取决于该物体上的总力矢量除以该物体的质量 在初始时间

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

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

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

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

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

模拟应该在三维以上的空间中工作。此外,对于我在第三段中提到的距离f(距离)函数,模拟应支持尽可能多的距离函数,包括距离的三角函数,如距离的sin(距离)和cos(距离),距离的双曲三角函数,如cosh(距离)和sinh(距离)距离多项式、距离的幂(如e^distance)、距离的对数、距离的贝塞尔函数、距离的误差函数、这些函数的组合以及其他函数(如可能)

理想情况下,模拟每分钟应能运行数百万个时间步,以便模拟速度更快,同时将模拟计算中的累积误差降至最低


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

让我们一次解决一个问题:

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

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

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


试着先写出你所有的公式,看看你能用什么代数简化,以节省额外的计算步骤(你能把所有的东西都加倍以避免被二除,你能把一些东西平方以避免平方根,等等)。要知道除法比乘法慢得多,平方根甚至更昂贵(想想距离大小)。

这个问题,以及它的各种变化,已经并将继续在计算科学中广泛研究。你可以做得比把你最喜欢的搜索引擎指向n体模拟更糟糕。我认为你在SO的限制范围内得到一个好答案的机会非常接近
0
。如果你想自己创建这个程序,我建议你从更简单的开始,然后再构建。