Java:计算跳伞者的速度

Java:计算跳伞者的速度,java,recursion,Java,Recursion,在Java中,我试图实现以下方程式来计算跳伞者的当前速度,同时不忽略空气阻力 v(t)=v(t-∆t) +(g-[(阻力x横截面积x空气密度)/(2*质量)]* v[(t-∆t) ^2])*(∆(t) 我的问题是我不知道如何翻译“v(t-∆t) “转化为代码。现在我在下面有一个方法,你可以看到,我正在使用这个方法来找到前面的速度。这继续导致堆栈溢出错误消息,这是可以理解的 (时间步长=∆(t) 我在下面的方法中调用上面的方法。假设结束时间=int,将是用户输入,但以这种方式写入是动态的 publ

在Java中,我试图实现以下方程式来计算跳伞者的当前速度,同时不忽略空气阻力

v(t)=v(t-∆t) +(g-[(阻力x横截面积x空气密度)/(2*质量)]* v[(t-∆t) ^2])*(∆(t)

我的问题是我不知道如何翻译“v(t-∆t) “转化为代码。现在我在下面有一个方法,你可以看到,我正在使用这个方法来找到前面的速度。这继续导致堆栈溢出错误消息,这是可以理解的

(时间步长=∆(t)

我在下面的方法中调用上面的方法。假设结束时间=int,将是用户输入,但以这种方式写入是动态的

public void assignVelocitytoArrays(){
    double currentTime = 0;     
    while(currentTime <= endingTime){
        this.vFinal = calculateVelocity(currentTime);
        currentTime += timeStep;
    }
}   
public void assignVelocitytoArrays(){
双电流时间=0;

而(currentTime从数学上讲,您想要实现的公式是序列的递归表示

递归序列需要一个起点,例如

v(0)=0(因为负时间没有意义)

以及计算下一个元素的规则,例如

v(t)=v(t-∆t) +(g-[(阻力x横面积x空气密度)/(2*质量)]*v[(t-∆t) ^2])*(∆(t)

(顺便问一下:你确定它必须是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)
}
double[]v=新的双精度[maxTime/timeStep];
v[0]=0;//起点
对于(int t=1;t
什么是停止条件/基本情况?在自身中使用方法称为递归,需要某种形式的基本情况来停止自身无休止地调用自身,这就是导致StackOverflowException的原因我编辑了我的问题,以显示我调用calculateVelocity方法的方法。这就是基本ca的意思吗se,或者你的意思是有[v(0)=加速度]中断了吗?calculateVelocity方法所做的第一件事是再次调用calculateVelocity方法。因此,无论传入什么,它都不会停止连续调用该方法。递归调用需要某种类型的控制语句。例如
if(time-timeStep>0){calculateVelocity(time-timeStep)+代码的其余部分}否则返回速度;
(我不知道数学,所以在数学上可能没有意义,但这只是一个例子)。删除了
velocity
标记。它是为了框架,而不是为了速度不应该是
calculateVelocity((time-timeStep)*(time-timeStep))
?我认为您可能是对的,因为您在规则中犯了一个错误,我能够成功地使用数组作为替代,并且我得到了正确的值!
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)
}