Advertisement
MI5TONER

Untitled

Nov 26th, 2023
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 7.89 KB | None | 0 0
  1. %% Начальные данные
  2.  
  3. V_0 = 113.6;                     % Начальная скорость пули, [м/с]
  4. m = 0.34 * 10^(-3);              % Масса пули, [кг]
  5. d = 4.5 * 10^(-3);               % Калибр, [м]
  6. C_xa = 0.4;                      % Коэффициент лобового сопративления, [б/р]
  7. theta_0 = deg2rad(0.61);         % Начальный угол бросания, [рад]
  8. S = pi * (d / 2)^2;              % Площадь миделя, [м^2]
  9.  
  10. b = 18.5 * 10^(-3);
  11.  
  12. %% Константы
  13.  
  14. rho = 1.225;                     % Плотность воздуха при НУ, [кг/м^3]
  15. g = 9.80665;                     % Ускорение свободного падения, [м/с^2]
  16.  
  17. %% Начальные условия
  18.  
  19. t = 0;
  20. x = 0;
  21. y = 1e-5;
  22. V = V_0;
  23. theta = theta_0;
  24.  
  25. %% Траектория пули при theta = theta_0
  26.  
  27. % Найдем пересечение параболы безопасности с y = 0 --> final_x
  28. final_x = V_0^2 / g;
  29.  
  30. % Построим параболу безопасности
  31. Parabola_Safe(final_x, V_0, g);
  32.  
  33. % Создадим пустые вектора для графика
  34. time_vector = zeros();
  35. x_vector = zeros();
  36. y_vector = zeros();
  37. V_vector = zeros();
  38. theta_vector = zeros();
  39. %vizirovanie_zeros = zeros();
  40.  
  41. % Еще пустые вектора для таблицы
  42. time_table = zeros();
  43. x_table = zeros();
  44. y_table = zeros();
  45. V_table = zeros();
  46. theta_table = zeros();
  47.  
  48. % Интегрирование
  49. i = 1;
  50. j = 1;
  51. k = 1;
  52. dt = 0.00001;
  53. while y > 0
  54.     % Запись
  55.     time_vector(i) = t;
  56.     x_vector(i) = x;
  57.     y_vector(i) = y;
  58.     V_vector(i) = V;
  59.     theta_vector(i) = theta;
  60.    
  61.     % Сортировка таблицы
  62.     if mod(i - 1, 1000) == 0
  63.         time_table(k) = t;
  64.         x_table(k) = x;
  65.         y_table(k) = y;
  66.         V_table(k) = V;
  67.         theta_table(k) = theta;
  68.         k = k + 1;
  69.     end
  70.  
  71.     % Координаты точек пересечния линии визирования с траекторией
  72.     if round(y, 5) == b
  73.         %vizirovanie_zeros(j) = x;
  74.         j = j + 1;
  75.     end
  76.    
  77.     [x, y, V, theta] = RK4(x, y, V, theta, dt, g, S, C_xa, rho, m);
  78.  
  79.     % Обновление времени и счетчика
  80.     t = t + dt;
  81.     i = i + 1;
  82. end
  83.  
  84. % Создадим таблицу для t = [0 0.01 0.02 ... time_vector(i - 1)]
  85. head = ["t, [с]", "x, [м]", "y, [м]", "V, [м/с]", "theta, [град.]"];
  86. table_1 = cat(1, time_table, x_table, y_table, V_table, rad2deg(theta_table));
  87. table_1 = table_1';
  88. last_row = [time_vector(i - 1), x_vector(i - 1), y_vector(i - 1), V_vector(i - 1),...
  89.     rad2deg(theta_vector(i - 1))];
  90. table_1 = cat(1, head, table_1, last_row);
  91.  
  92. % График траектории пули
  93. figure('Name',"График траектории пули")
  94. plot(x_vector, y_vector, "r-"); grid on;
  95. xlim([0 max(x_vector)]);
  96. ylim([0 max(y_vector)]);
  97. hold on;
  98. %plot(vizirovanie_zeros, [b b], "k--x");
  99. hold off;
  100. title('График траектории пули при \theta_0 = 0.61 [град.]');
  101. xlabel('x, [м]');
  102. ylabel('y, [м]');
  103.  
  104. %% Прямой выстрел
  105.  
  106. coef = 0;
  107. Height = 0;
  108. while Height < 1
  109.     % Для каждой новой итерации переписываем начальные условия
  110.     t = 0;
  111.     x = 0;
  112.     y = 1e-5;
  113.     V = V_0;
  114.     theta = theta_0 + coef;
  115.  
  116.     % Создадим пустые вектора для графика
  117.     time_vector_straight = zeros();
  118.     x_vector_straight = zeros();
  119.     y_vector_straight = zeros();
  120.     V_vector_straight = zeros();
  121.     theta_vector_straight = zeros();
  122.  
  123.     % Создадим пустые вектора для графика
  124.     time_table_straight = zeros();
  125.     x_table_straight = zeros();
  126.     y_table_straight = zeros();
  127.     V_table_straight = zeros();
  128.     theta_table_straight = zeros();
  129.    
  130.     % Интегрирование
  131.     i = 1;
  132.     j = 1;
  133.     while y > 0
  134.         time_vector_straight(i) = t;
  135.         x_vector_straight(i) = x;
  136.         y_vector_straight(i) = y;
  137.         V_vector_straight(i) = V;
  138.         theta_vector_straight(i) = theta;
  139.  
  140.         % Сортировка таблицы
  141.         if mod(i - 1, 1000) == 0
  142.             time_table_straight(k) = t;
  143.             x_table_straight(k) = x;
  144.             y_table_straight(k) = y;
  145.             V_table_straight(k) = V;
  146.             theta_table_straight(k) = theta;
  147.             k = k + 1;
  148.         end
  149.  
  150.         [x, y, V, theta] = RK4(x, y, V, theta, dt, g, S, C_xa, rho, m);
  151.  
  152.         t = t + dt;
  153.         i = i + 1;
  154.     end
  155.     Height = max(y_vector_straight);
  156.     coef = coef + 0.0001;
  157.  
  158.     disp(Height);
  159. end
  160.  
  161. % Создадим таблицу для t = [0 0.01 0.02 ... time_vector_straight(i - 1)]
  162. table_2 = cat(1, time_table_straight, x_table_straight, y_table_straight, ...
  163.     V_table_straight, rad2deg(theta_table_straight));
  164. table_2 = table_2';
  165. last_row_straight = [time_vector_straight(i - 1), x_vector_straight(i - 1),...
  166.     y_vector_straight(i - 1), V_vector_straight(i - 1),...
  167.     rad2deg(theta_vector_straight(i - 1))];
  168. table_2 = cat(1, head, table_2, last_row_straight);
  169.  
  170.  
  171. % График траектории пули при прямом выстреле
  172. figure('Name',"Прямой выстрел");
  173. plot(x_vector_straight, y_vector_straight, "r-"); grid on;
  174. ylim([0 1.002]);
  175. xlim([0 65]);
  176. hold on
  177. plot([0 65], [b b], "k--");
  178. hold off
  179. title('Прямой выстрел');
  180. xlabel('x, [м]');
  181. ylabel('y, [м]');
  182.  
  183. %% Функции
  184.  
  185. % Парабола безопасности
  186. function Parabola_Safe(final_x, V_0, g)
  187.     x_vector = 0:(final_x / 1000): final_x;
  188.     y_vector = zeros();
  189.     i = 1;
  190.     for x = x_vector
  191.         y_vector(i) = V_0^2 / (2 * g) - (g * x^2) / (2 * V_0^2);
  192.         i = i + 1;
  193.     end
  194.     figure('Name',"Парабола безопасности");
  195.     plot(x_vector, y_vector, "r-"); grid on;
  196.     title('Парабола безопасности');
  197.     xlabel('x');
  198.     ylabel('y');
  199. end
  200.  
  201. % Сила лобового сопротивления
  202. function [Xa] = X_a(V, S, C_xa, rho)
  203.     Xa = C_xa * (rho * V^2) / 2 * S;
  204. end
  205.  
  206. % Математическая модель
  207. function [dxdt] = dx_dt(V, theta)
  208.     dxdt = V * cos(theta);
  209. end
  210. function [dydt] = dy_dt(V, theta)
  211.     dydt = V * sin(theta);
  212. end
  213. function [dVdt] = dV_dt(V, theta, g, S, C_xa, rho, m)
  214.     dVdt = (-X_a(V, S, C_xa, rho) - m * g * cos(theta)) / m;
  215. end
  216. function [dthetadt] = dtheta_dt(V, theta, g)
  217.     dthetadt = (-g * cos(theta)) / V;
  218. end
  219.  
  220. % РК4
  221. function [x, y, V, theta] = RK4(x, y, V, theta, dt, g, S, C_xa, rho, m)
  222.     K1_x     = dt *     dx_dt(V, theta);
  223.     K1_y     = dt *     dy_dt(V, theta);
  224.     K1_V     = dt *     dV_dt(V, theta, g, S, C_xa, rho, m);
  225.     K1_theta = dt * dtheta_dt(V, theta, g);
  226.  
  227.     K2_x     = dt *     dx_dt(V + K1_V / 2, theta + K1_theta / 2);
  228.     K2_y     = dt *     dy_dt(V + K1_V / 2, theta + K1_theta / 2);
  229.     K2_V     = dt *     dV_dt(V + K1_V / 2, theta + K1_theta / 2, g, S, C_xa, rho, m);
  230.     K2_theta = dt * dtheta_dt(V + K1_V / 2, theta + K1_theta / 2, g);
  231.  
  232.     K3_x     = dt *     dx_dt(V + K2_V / 2, theta + K2_theta / 2);
  233.     K3_y     = dt *     dy_dt(V + K2_V / 2, theta + K2_theta / 2);
  234.     K3_V     = dt *     dV_dt(V + K2_V / 2, theta + K2_theta / 2, g, S, C_xa, rho, m);
  235.     K3_theta = dt * dtheta_dt(V + K2_V / 2, theta + K2_theta / 2, g);
  236.  
  237.     K4_x     = dt *     dx_dt(V + K3_V, theta + K3_theta);
  238.     K4_y     = dt *     dy_dt(V + K3_V, theta + K3_theta);
  239.     K4_V     = dt *     dV_dt(V + K3_V, theta + K3_theta, g, S, C_xa, rho, m);
  240.     K4_theta = dt * dtheta_dt(V + K3_V, theta + K3_theta, g);
  241.  
  242.     x = x + (K1_x + 2 * K2_x + 2 * K3_x + K4_x) / 6;
  243.     y = y + (K1_y + 2 * K2_y + 2 * K3_y + K4_y) / 6;
  244.     V = V + (K1_V + 2 * K2_V + 2 * K3_V + K4_V) / 6;
  245.     theta = theta + (K1_theta + 2 * K2_theta + 2 * K3_theta + K4_theta) / 6;
  246. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement