Java 计算对象';s的位置、速度和其他运动导数
好的,这里有一个编程/物理难题,比方说Java(虽然这并不重要——但为了一致性,我们将使用Java) 我有一个双精度数组,其中每个元素表示对象位置的连续导数。因此: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 +
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
更好,但我可能错了。我首先进行除法时得到的舍入误差较小,但这可能取决于测试用例。