Java:计算跳伞者的速度

时间:2015-03-03 05:41:49

标签: java recursion

在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;
    }
}   

我想自己解决这个问题,有人可以给我一个大方向吗?使用一种方法本身就是正确的想法,还是我完全偏离轨道?

1 个答案:

答案 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)
}