2015-03-03 4 views
0

В Java я пытаюсь реализовать следующее уравнение для вычисления текущей скорости парашютиста, не пренебрегая сопротивлением воздуха.Java: вычислительная скорость скайдайвера

V (T) = V (трет-& Dgr; t) + (г - [(перетащить й crossArea х airDensity)/(2 * масса)] * v [(трет-& Dgr; t)^2]) * (Δt)

Моя проблема в том, что я не уверен, как перевести «v (t - Δt)» в код. Прямо сейчас у меня есть этот метод ниже, где, как вы можете видеть, я использую метод внутри себя, чтобы найти предыдущую скорость. По-видимому, это продолжало приводить сообщение об ошибке переполнения стека.

(Timestep = & Dgr; 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

Каково ваше условие остановки/базовый корпус?Использование метода внутри себя называется рекурсией и требует некоторой формы базового случая, чтобы остановить себя от бесконечного вызова самого себя, что является причиной StackOverflowException – yitzih

+0

. Я отредактировал свой вопрос, чтобы показать метод, которым я вызываю метод calculateVelocity. Это то, что вы имеете в виду базовый случай, или вы имеете в виду что-то вроде того, что [v (0) = ускорение] является перерывом? –

+1

Первое, что делает ваш метод вычислений velocity, это снова вызвать метод вычислений. Поэтому он никогда не перестанет постоянно вызывать метод независимо от того, в чем он проходит. Там должен быть какой-то оператор управления, окружающий рекурсивный вызов. Например: if (time-timeStep> 0) {calculateVelocity (time-timeStep) + остальная часть кода} else return speed; '(я не знаю математику, чтобы математика не имела смысла, но ее пример). – yitzih

ответ

1

Формула, которую вы хотите реализовать, является рекурсивным представлением последовательности, математически говорящей.

Рекурсивные последовательности требуют начальной точки, например.

v (0) = 0 (потому что отрицательное время не имеет смысла)

и правило для вычисления следующих элементов, например,

V (T) = V (трет-& Dgr; t) + (г - [(перетащить й crossArea х airDensity)/(2 * масса)] * v [(трет-& Dgr; t)^2]) * (t)

(кстати: вы уверены, что это должно быть v ([т-& Dgr; t]^2) вместо у ([т-& Delta; 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) 
} 
+0

Я думаю, что вы можете быть правы, допустив ошибку в правиле, я могу успешно использовать массивы в качестве замены, и я получаю правильные значения! –

Смежные вопросы