Advertisement
Guest User

computer physics

a guest
Nov 23rd, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.79 KB | None | 0 0
  1. import java.util.ArrayList;
  2.  
  3. public class EulerMethod {
  4.  
  5. /** Проекция на ось икс */
  6. private static final int AXIS_X_PROJECTION = 0;
  7. /** Проекция на ось игрек */
  8. private static final int AXIS_Y_PROJECTION = 1;
  9. /** Ось икс */
  10. private static final int X = 0;
  11. /** Ось игрек */
  12. private static final int Y = 1;
  13.  
  14. public static void main(String[] args) {
  15. firstSolve();
  16. }
  17.  
  18. /** Решение третьей задачи */
  19. private static void thirdSolve() {
  20. for (double densityBody : new double[] {2700, 7800, 19000}) {
  21. Coefficients coefficients =
  22. new Coefficients(densityBody, 9.81, 0.000018, 0.0001, 0.47, 1.29, .0001);
  23. double angle = Math.toRadians(40);
  24. double velocity = 20;
  25. Parameters[] flight = calculateFlight(coefficients, angle, velocity);
  26. System.out.println("Density body: " + densityBody);
  27. System.out.println("Range of flight: " + rangeOfFlight(flight));
  28. System.out.println("Max height: " + maxHeight(flight));
  29. System.out.println("===========================================");
  30. }
  31. }
  32.  
  33. /** Решение второй задачи */
  34. private static void secondSolve(){
  35. for (double velocity : new double[] {10, 20 ,100}) {
  36. Coefficients coefficients =
  37. new Coefficients(2700, 9.81, 0.000018, 0.0001, 0.47, 1.29, .0001);
  38. double angle = Math.toRadians(40);
  39. Parameters[] flight = calculateFlight(coefficients, angle, velocity);
  40. System.out.println("Velocity: " + velocity);
  41. System.out.println("Range of flight: " + rangeOfFlight(flight));
  42. System.out.println("Max height: " + maxHeight(flight));
  43. System.out.println("===========================================");
  44. }
  45. }
  46.  
  47. /** Решение первой задачи */
  48. private static void firstSolve() {
  49. double max = -1;
  50. double angleMax = -1;
  51. for (double i = 1; i <= 90; i+=.1) {
  52.  
  53. Coefficients coefficients =
  54. new Coefficients(2700, 9.81, 0.000018, 0.0001, 0.47, 1.29, .0001);
  55. double angle = Math.toRadians(i);
  56. double velocity = 20;
  57. Parameters[] flight = calculateFlight(coefficients, angle, velocity);
  58. double range = rangeOfFlight(flight);
  59. System.out.println(i + ": " + range);
  60. if (rangeOfFlight(flight) > max){
  61. max = range;
  62. angleMax = i;
  63. }
  64. }
  65. System.out.println("Maximum: " + angleMax);
  66. }
  67.  
  68. /**
  69. * Расчет дальности полета
  70. * @param flight параметры тела через время index после начала полета
  71. * @return дальность
  72. */
  73. private static double rangeOfFlight(Parameters[] flight) {
  74. return flight[flight.length - 1].coordinates[X] - flight[0].coordinates[X];
  75. }
  76.  
  77. /**
  78. * Расчет максимальной высоты полета
  79. * @param flight параметры тела через время index после начала полета
  80. * @return максимальная высота
  81. */
  82. private static double maxHeight(Parameters[] flight) {
  83. double max = Double.NEGATIVE_INFINITY;
  84. for (Parameters parameters : flight) {
  85. max = Math.max(max, parameters.coordinates[Y]);
  86. }
  87. return max;
  88. }
  89.  
  90. /**
  91. * Просчитывает параметры тела во всех точках полета
  92. * @param coefficients коэффициенты
  93. * @param angle угол броска
  94. * @param initialVelocity начальная скорость
  95. * @return параметры тела через вермя index после начала полета
  96. */
  97. private static Parameters[] calculateFlight(Coefficients coefficients, double angle, double initialVelocity) {
  98. Parameters initialParameters = new Parameters(
  99. new double[]{initialVelocity * Math.cos(angle), initialVelocity * Math.sin(angle)},
  100. new double[]{0, 0});
  101. ArrayList<Parameters> parametersList = new ArrayList<>();
  102.  
  103. Parameters parameters = initialParameters;
  104.  
  105. do {
  106. parametersList.add(new Parameters(parameters));
  107. parameters = calculateIteration(coefficients, parameters);
  108. } while (parameters.coordinates[Y] != 0);
  109.  
  110. return parametersList.toArray(new Parameters[0]);
  111. }
  112.  
  113. /**
  114. * Получает изначальные параметры тела, и просчитывает его параметры через единицу времени
  115. * @param coefficients коэффициенты
  116. * @param parameters изначальные параметры тела
  117. * @return новые параметры тела
  118. */
  119. private static Parameters calculateIteration(Coefficients coefficients, Parameters parameters) {
  120. Parameters newParameters = new Parameters();
  121. double velocityVectorModule =
  122. moduleOfVector(parameters.velocity[AXIS_X_PROJECTION], parameters.velocity[AXIS_Y_PROJECTION]);
  123.  
  124. newParameters.velocity[AXIS_X_PROJECTION] = parameters.velocity[AXIS_X_PROJECTION] + coefficients.tau *
  125. (-coefficients.alpha1 * parameters.velocity[AXIS_X_PROJECTION] - coefficients.alpha2 *
  126. velocityVectorModule * parameters.velocity[AXIS_X_PROJECTION]);
  127.  
  128. newParameters.velocity[AXIS_Y_PROJECTION] = parameters.velocity[AXIS_Y_PROJECTION] + coefficients.tau *
  129. (-coefficients.gravity - coefficients.alpha1 *
  130. parameters.velocity[AXIS_Y_PROJECTION] - coefficients.alpha2 *
  131. velocityVectorModule * parameters.velocity[AXIS_X_PROJECTION]);
  132.  
  133. newParameters.coordinates[X] = parameters.coordinates[X] + coefficients.tau * parameters.velocity[AXIS_X_PROJECTION];
  134. newParameters.coordinates[Y] = parameters.coordinates[Y] + coefficients.tau * parameters.velocity[AXIS_Y_PROJECTION];
  135.  
  136. if (newParameters.coordinates[Y] < 0)
  137. newParameters.coordinates[Y] = 0;
  138.  
  139. return newParameters;
  140. }
  141.  
  142. /**
  143. * Считает модуль вектора
  144. * @param x коориднаты вектора
  145. * @param y координаты вектора
  146. * @return длина вектора
  147. */
  148. private static double moduleOfVector(double x, double y) {
  149. return Math.sqrt(x * x + y * y);
  150. }
  151.  
  152. /** Класс параметров тела. Содержит все данные от теле в данный момент времени */
  153. private static class Parameters {
  154. /** Проекция скорости тела. Если index == 0 - проекция на ось X. Если index == 1 - проекция на ось Y */
  155. private double velocity[];
  156. /** Координаты тела. Если index == 0 - X. Если index == 1 - Y */
  157. private double coordinates[];
  158.  
  159. /**
  160. * Конструктор
  161. * @param velocity проекции скорости
  162. * @param coordinates координаты
  163. */
  164. Parameters(double[] velocity, double[] coordinates) {
  165. this.velocity = velocity.clone();
  166. this.coordinates = coordinates.clone();
  167. }
  168.  
  169. /**
  170. * Конструктор
  171. * @param parameters параметры
  172. */
  173. Parameters(Parameters parameters) {
  174. velocity = parameters.velocity.clone();
  175. coordinates = parameters.coordinates.clone();
  176. }
  177.  
  178. /**
  179. * Конструктор пустых параметров тела
  180. */
  181. Parameters() {
  182. velocity = new double[2];
  183. coordinates = new double[2];
  184. }
  185.  
  186. }
  187.  
  188. /**
  189. * Коэффициенты (константы). Параметры которые не изменяются во время полета.
  190. */
  191. private static class Coefficients {
  192. /** Масса тела */
  193. double mass;
  194. /** Ускорение свободного падения */
  195. double gravity;
  196. /** Динамическая вязкость среды */
  197. double viscosity;
  198. /** Площадь поперечного сечения */
  199. double square;
  200. /** Коэффициент лобового сопротивления */
  201. double drag;
  202. /** Плотность среды */
  203. double density;
  204. /** Единица времени. Обычно короткий и неделимый промежуток времени */
  205. double tau;
  206.  
  207. /** Объединения констант для упрощения формул */
  208. double alpha1;
  209. double alpha2;
  210.  
  211. /** Конструктор */
  212. Coefficients(double densityBody, double gravity, double viscosity, double square, double drag, double densityMedium, double tau) {
  213. //Расчет массы через площадь поперечного сечения и плотность
  214. this.mass = densityBody * 4 / 3 * Math.PI * Math.pow(square / Math.PI, 1.5);
  215. this.gravity = gravity;
  216. this.viscosity = viscosity;
  217. this.square = square;
  218. this.drag = drag;
  219. this.density = densityMedium;
  220. this.tau = tau;
  221.  
  222. //расчет альфа
  223. alpha1 = 6 * viscosity * Math.sqrt(Math.PI * square) / mass;
  224. alpha2 = drag * square * density / (2 * mass);
  225. }
  226. }
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement