有效地计算物体的位置、速度和其他运动导数
Calculating an object's position, velocity and other derivatives of motion efficiently
好的,这里有一个 programming/physics 拼图,假设是 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 内任意长度的 a?
应该为效率和简洁性投票。
编辑:
运动定律在这个网站的物理页面上,但基本上
每个术语的形式为:
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;
}
}
我认为这样的方法可行。
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;
}
好的,这里有一个 programming/physics 拼图,假设是 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 内任意长度的 a?
应该为效率和简洁性投票。
编辑: 运动定律在这个网站的物理页面上,但基本上 每个术语的形式为:
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;
}
}
我认为这样的方法可行。
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;
}