Java: 计算跳伞者的速度
Java: calculating velocity of a skydiver
在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;
}
}
我想自己解决这个问题,有人能给我一个大概的方向吗?使用一种方法本身是正确的想法还是我完全偏离了轨道?
从数学上讲,您要实现的公式是序列的递归表示。
递归序列需要一个起点,例如
v(0) = 0 (because a negative time does not make sense)
和计算下一个元素的规则,例如
v(t) = v(t-∆t) + (g - [(drag x crossArea x airDensity) / (2*mass)] * 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)
}
在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;
}
}
我想自己解决这个问题,有人能给我一个大概的方向吗?使用一种方法本身是正确的想法还是我完全偏离了轨道?
从数学上讲,您要实现的公式是序列的递归表示。
递归序列需要一个起点,例如
v(0) = 0 (because a negative time does not make sense)
和计算下一个元素的规则,例如
v(t) = v(t-∆t) + (g - [(drag x crossArea x airDensity) / (2*mass)] * 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)
}