好的,这里有一个编程/物理难题,比方说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]
第二个元素可能因精度错误而有所不同。
答案 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;
}
}