有效地计算物体的位置,速度和其他运动导数

时间:2015-03-20 20:55:07

标签: java physics motion

好的,这里有一个编程/物理难题,比方说Java(尽管它并不重要 - 但为了保持一致性,我们将使用Java)。

我有一个双精度数组,其中每个元素代表一个对象位置的连续派生。所以:

d[0] // position
d[1] // velocity
d[2] // accelleration
等等......

将至少有1个且可能有任意数量的元素(但实际上,可能不超过5个)。超出数组末尾的所有元素都假定为零。

我们还有double t时间。

因此,如果d.length为3则非常具体:

d[0] += d[1] * t + d[2] * t * t / 2
d[1] += d[2] * t

但是我们怎么能编写一个迭代解决方案(没有递归!)来更新数组的所有元素的时间t为任何长度?

应该为效率和简洁性而投票。

编辑: 运动定律在本网站的物理页面上,但基本上 每个术语都有以下形式:

power(t,n) / factorial(n)

因此,第一个等式的下一个项将是d[3] * t*t*t / 6

如果您不熟悉这些方程式,请不要让我解释。

测试用例:

final static double[] D = { 5.0, 4.0, 3.0, 2.0, 1.0 };
double t = 10.0

应该给:

[945.0, 300.66666666666663, 73.0, 12.0, 1.0]

第二个元素可能因精度错误而有所不同。

2 个答案:

答案 0 :(得分:2)

我觉得这样的事情很有效。

int length = d.length;
for (int i = 0; i < length - 1; i++) {
    double temp = 0;
    for (int j = length - 1; j > i; j--)
        temp = (temp + d[j]) * t / (j - i);
    d[i] += temp;
}

答案 1 :(得分:1)

更新:

for (int i = 0; i < d.length - 1; i++) {
    d[i] = 0;
    int f = 1;
    double p = 1;
    for (int j = i+1; j < d.length; j++) {
        f *= j - i;
        p *= t;
        d[i] += d[j] * p / f;
    }
}