在Java中,我试图实现以下等式来计算跳伞运动员的当前速度,而不是忽视空气阻力。
v(t)= v(t-Δt)+(g - [(drag x crossArea x airDensity)/(2 * mass)] * v [(t-Δt)^ 2])*(Δt)
我的问题是我不知道如何将“v(t - Δt)”翻译成代码。现在我在下面有这个方法,你可以看到我在其中使用该方法来找到以前的速度。这可以理解地继续导致堆栈溢出错误消息。
(timeStep =Δt)
public double calculateVelocity(double time){
double velocity;
velocity = calculateVelocity(time - timeStep)
+ (acceleration - ((drag * crossArea * airDensity)
/ (2 * massOfPerson))
* (calculateVelocity(time - timeStep)*(time * timeStep)))
* timeStep;
}
return velocity;
}
我在下面的方法中调用上述方法。假设结束时间=一个int,将是用户输入,但这样写成是动态的。
public void assignVelocitytoArrays(){
double currentTime = 0;
while(currentTime <= endingTime){
this.vFinal = calculateVelocity(currentTime);
currentTime += timeStep;
}
}
我想自己解决这个问题,有人可以给我一个大方向吗?使用一种方法本身就是正确的想法,还是我完全偏离轨道?
答案 0 :(得分:1)
您要实现的公式是序列的递归表示,从数学角度讲。
递归序列需要一个起点,例如
v(0)= 0(因为负时间没有意义)
以及计算下一个元素的规则,例如
v(t)= v(t-Δt)+(g - [(drag x crossArea x airDensity)/(2 * mass)] * v [(t-Δt)^ 2])*(Δ吨)
(顺便说一句:你确定它必须是v([t-Δt] ^ 2)而不是v([t-Δt])^ 2?)
因此,使用递归(在其自身内调用函数)来计算递归序列的方法是正确的。
在您的实施中,您只忘记了一个细节:起点。你的程序应该如何知道v(0)没有被定义为规则,而是一个确定的值?所以你必须包括它:
if(input value == starting point){
return starting point
}
else{
follow the rule
}
旁注:你似乎正在创造一个递增的速度阵列。使用数组中已计算的值而不是递归是有意义的,因此您不必一次又一次地计算每个步骤。
这只有在你确实在规则中犯了错误时才有效。
double[] v = new double[maxTime/timeStep];
v[0] = 0; //starting point
for(int t = 1; t < maxSteps; t++){
v[t] = v[t-1] + (g - [(drag x crossArea x airDensity) / (2*mass)] * v[t-1]^2 ) * (∆t)
}