Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算对象';s的位置、速度和其他运动导数_Java_Physics_Motion - Fatal编程技术网

Java 计算对象';s的位置、速度和其他运动导数

Java 计算对象';s的位置、速度和其他运动导数,java,physics,motion,Java,Physics,Motion,好的,这里有一个编程/物理难题,比方说Java(虽然这并不重要——但为了一致性,我们将使用Java) 我有一个双精度数组,其中每个元素表示对象位置的连续导数。因此: d[0] // position d[1] // velocity d[2] // accelleration 等等 将至少有1个元素,并且可能有任意数量的元素(但在实践中,可能不超过5个)。数组末尾以外的所有元素都假定为零 我们还有一个时间的双t 因此,如果d.length为3,则非常明确: d[0] += d[1] * t +

好的,这里有一个编程/物理难题,比方说Java(虽然这并不重要——但为了一致性,我们将使用Java)

我有一个双精度数组,其中每个元素表示对象位置的连续导数。因此:

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

将至少有1个元素,并且可能有任意数量的元素(但在实践中,可能不超过5个)。数组末尾以外的所有元素都假定为零

我们还有一个时间的
双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]
第二个元素可能因精度错误而变化。

更新:

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;
    }
}
for(int i=0;i
我认为这样做是可行的

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;
}
int-length=d.length;
对于(int i=0;ii;j--)
温度=(温度+d[j])*t/(j-i);
d[i]+=温度;
}

请更新您的问题,以显示一个a.length==3的示例。那么您想问的是集成方案吗?你有固定的时间步长吗?应该是长度==3。将数组名更改为d,以免将其与加速度混淆。t显然不是固定不变的。感谢到目前为止的回复。我将把它留一点时间,看看是否有什么真正有趣的东西突然出现。投票给第一个答案,但我认为至少可以避免重新计算阶乘和内部循环中的幂。甚至可能在外循环中。这会比其他解决方案的舍入误差稍差:[945.0,300.6674,73.0,12.0,1.0]@rghome它可以。准确计算像
t*t*t*t*t
这样的幂的方法是使用
Math.pow
(因为每次连续乘法都会引入另一个错误)。因此,如果你想要准确,你实际上不能重复使用先前计算出的
t
t*t
t*t*t
t*t*t
。如果准确度是您想要的,我认为您不能比从头开始计算
t
t*t/2
t*t/6
更好,但我可能错了。我首先进行除法时得到的舍入误差较小,但这可能取决于测试用例。