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