Расчет кинематических уравнений на основе пользовательского ввода (более короткий путь?)

В настоящее время я пишу программу, которая будет вычислять оставшиеся переменные для простых кинематических уравнений в физике. Мне нужно иметь 4/6 переменных, а затем я могу вычислить результат для двух других переменных. В нынешнем виде я использую массив логического типа, чтобы определить, какая переменная была введена, а какая нет, и мне приходится сравнивать каждый случай и переписывать одну из трех формул для решения этой переменной. Это заканчивается абсурдным количеством раздутого кода.

Вот пример только одного из уравнений в моем коде:



    if(variableEntered[1] == false && variableEntered[3] == false) {
        // calculate final velocity
       double fvNumber = getInitialVelocity() + (getAcceleration() * (getFinalTime() - getInitialTime())); 
       setFinalVelocity(fvNumber);
       // calculate final position
       double fpNumber = (getInitialPosition() + (getInitialVelocity() * (getFinalTime() - getInitialTime())) + 
           ((0.5 * getAcceleration()) * ((getFinalTime() - getInitialTime()) * (getFinalTime() - getInitialTime()))));
       setFinalPosition(fpNumber);
       System.out.printf("The final velocity is: %.2f m/s.", getFinalVelocity());
       System.out.println();
       System.out.printf("The final position is: %.2f meters.", getFinalPosition());
       System.out.println(); 
       }

 

Три уравнения, которые я использую: Vf = Vi + a(tf - ti) Xf = Xi + Vi(tf - ti) + (1/2)a(tf - ti)2 Vf2 - Vi2 = 2a(Xf - Xi)

Есть ли способ сократить это или упростить реализацию? Будет ли как-то работать использование списка массивов?


person Alex    schedule 14.05.2014    source источник
comment
Как вы думаете, почему ArrayList поможет?   -  person awksp    schedule 14.05.2014


Ответы (2)


  1. Используйте BigDecimal, чтобы избежать потери точности и неправильных ответов из-за этого.
  2. Вы можете разбить каждую формулу на отдельный метод и выполнять каждую часть шаг за шагом. Чем больше скобок, тем труднее читать. например deltaT = tf-ti; vf = vi + а*дельтаТ;

  3. Если вы используете BigDecimal или Strings или Wrapper Types, такие как Double, вы можете проверить значение null вместо сохранения логического массива.

person user3624390    schedule 14.05.2014

Вы можете рассматривать это как 3 уравнения с 6 переменными. На каждом шаге вычисляйте полные градиенты/производные и используйте частные производные свободных переменных для выполнения шагов Ньютона по направлению к согласованному состоянию.

person Lutz Lehmann    schedule 14.05.2014