Advertisement
MI5TONER

Untitled

Nov 23rd, 2023
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 8.65 KB | None | 0 0
  1. %% Исходные данные
  2.  
  3. Rm = 1738 * 10^3;           % Радиус Луны
  4. mu_m = 4.903 * 10^12;       % Гравитационная постоянная Луны
  5. W = 3540;                   % Эффективная скорость истечения топлива, [м/с]
  6. P = [8350 9500];            % Тяга СВ, [Н]
  7. h_isl = [148 180;
  8.          180 260] .* 10^3;  % Высота орбиты, [м]
  9.  
  10. m_0 = 3015;                 % Начальная масса СВ, [кг]
  11. m_fuel_k = 1550;            % Предельная масса рабочего запаса топлива, [кг]
  12. m_const = 615;              % Масса конструкции, [кг]
  13. t_vert = 14;                % Продолжительность вертикального участка выведения, [с]
  14. V_k = mu_m / (Rm + h_isl(1,1));
  15.  
  16. dt = 0.1;                   % Шаг интегрирования, [c]
  17.  
  18. % Начальные условия при t = 0
  19. t = 0; x = 0; y = 0; V_x = 0; V_y = 0; m = m_0;
  20.  
  21. t_1 = 360.323;
  22. t_2 = 600.241;
  23. theta_dot = -0.003;
  24. theta_2 = -0.08266;
  25.  
  26. %% Вызов функций
  27.  
  28. [Sost_list, table, Coordinates] = Integration(P(1), W, dt, t_vert, t_1, t_2, theta_dot,...
  29.     theta_2, mu_m, Rm, m_0, m_fuel_k, V_k);
  30.  
  31. Plot_Trajectory(Rm, h_isl(1,1), Coordinates(:, 2), Coordinates(:, 3), Sost_list(:, 4), Sost_list(:, 5));
  32.  
  33.  
  34. %% Функции
  35.  
  36. % Введем вектор состояния, который будет описывать всю ММ
  37. % Sost = [V_x, V_y, x, y, m] ---> Sost(1) = V_x, ...
  38.  
  39. % ММ движения СВ
  40. function Mathmodel = MM(t, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  41.     theta_2, P, W)
  42.  
  43.     % Проекции гравитационного ускорения Луны
  44.     g_x = - (mu_m * Sost(3)) / (Sost(3)^2 + (Rm + Sost(4))^2)^(3 / 2);
  45.     g_y = - (mu_m * (Rm + Sost(4))) / (Sost(3)^2 + (Rm + Sost(4))^2)^(3 /2);
  46.  
  47.     % Изменение угла тангажа
  48.     if t <= t_vert
  49.         theta = pi / 2;
  50.     elseif ((t > t_vert) && (t <= t_1))
  51.         theta = pi / 2 + theta_dot * (t - t_vert);
  52.     elseif t >= t_2
  53.         theta = theta_2;
  54.     else
  55.         theta = 0;
  56.     end
  57.  
  58.     % Система уравнений
  59.     Vx_Dot = P / Sost(5) * cos(theta) + g_x;
  60.     Vy_Dot = P / Sost(5) * sin(theta) + g_y;
  61.     x_Dot = Sost(1);
  62.     y_Dot = Sost(2);
  63.     m_Dot = - P / W;
  64.  
  65.     % Свернем все в один вектор (вуктор-строка)
  66.     Mathmodel = [Vx_Dot Vy_Dot x_Dot y_Dot m_Dot];
  67. end
  68.  
  69. % Ф-ия Рунге-Кутта 4-го порядка
  70. function Sost = RK4(t, dt, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  71.     theta_2, P, W)
  72.  
  73.     K1 = dt * MM(t, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  74.         theta_2, P, W);
  75.     K2 = dt * MM(t + dt / 2, Sost + K1/2, mu_m, Rm, t_vert, t_1, t_2, ...
  76.         theta_dot, theta_2, P, W);
  77.     K3 = dt * MM(t + dt / 2, Sost + K2/2, mu_m, Rm, t_vert, t_1, t_2, ...
  78.         theta_dot, theta_2, P, W);
  79.     K4 = dt * MM(t + dt, Sost + K3, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  80.         theta_2, P, W);
  81.  
  82.     % Обновляем результаты
  83.     Sost = Sost + (K1 + 2 * K2 + 2 * K3 + K4) / 6;
  84. end
  85.  
  86. % Интегрирование
  87. function [Sost_list, table, Coordinates] = Integration(P, W, dt, t_vert, t_1, t_2, theta_dot,...
  88.     theta_2, mu_m, Rm, m_0, m_fuel_k, V_k)
  89.  
  90.     t = 0; x = 0; y = 0; V_x = 0; V_y = 0; m = m_0;  % Начальные условия при t = 0
  91.     Sost = [V_x V_y x y m];                          % Вектор состояния с начальными данными
  92.     Sost_list = zeros(1, 6);                         % "Хранилище" (Вектор строка, образованная из t и Sost)
  93.    
  94.     % Создадим пустые строки для записи координат и времени
  95.     x_list = zeros();
  96.     y_list = zeros();
  97.     t_list = zeros();
  98.     i = 1;
  99.  
  100.     % Заголовок таблицы
  101.     head = ["t, [s]", "V_x, [m/s]", "V_y, [m/s]", "x, [m]", "y, [m]", "m, [kg]"];
  102.    
  103.     % Точка t_vert
  104.     while t < t_vert
  105.         Sost = RK4(t, dt, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  106.             theta_2, P, W);
  107.         t = t + dt;
  108.  
  109.         [x_list, y_list, t_list] = Record(x_list, y_list, t_list, Sost, t, i);
  110.         i = i + 1;
  111.         if round(t, 1) == t_vert
  112.             Sost_list = cat(2, t, Sost);
  113.         end
  114.     end
  115.  
  116.     % Точка t_1
  117.     while t < t_1
  118.         if round(t, 1) == round(t_1 - mod(t_1, dt), 1) % 300.3
  119.             dt_local = mod(t_1, dt);                   %   0.023
  120.             Sost = RK4(t, dt_local, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  121.                 theta_2, P, W);
  122.             Sost_list = cat(1, Sost_list, cat(2, t_1, Sost));
  123.  
  124.             % Выключаем тягу P = 0 и доделываем шаг до 300.4
  125.             Sost = RK4(t_1, dt - dt_local, Sost, mu_m, Rm, t_vert, t_1, t_2, ...
  126.                 theta_dot, theta_2, 0, W);
  127.             t = t + dt;
  128.            
  129.             [x_list, y_list, t_list] = Record(x_list, y_list, t_list, Sost, t, i);
  130.             i = i + 1;
  131.         else
  132.             Sost = RK4(t, dt, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  133.                 theta_2, P, W);
  134.             t = t + dt;
  135.            
  136.             [x_list, y_list, t_list] = Record(x_list, y_list, t_list, Sost, t, i);
  137.             i = i + 1;
  138.         end
  139.     end
  140.  
  141.     % Точка t_2
  142.     while t < t_2
  143.         if round(t, 1) == round(t_2 - mod(t_2, dt), 1) % 600.2
  144.             dt_local = mod(t_2, dt);                   %   0.041
  145.             Sost = RK4(t, dt_local, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  146.                 theta_2, 0, W);
  147.             Sost_list = cat(1, Sost_list, cat(2, t_2, Sost));
  148.  
  149.             % Включаем тягу и доделываем шаг до 600.3
  150.             Sost = RK4(t_2, dt - dt_local, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  151.                 theta_2, P, W);
  152.             t = t + dt;
  153.            
  154.             [x_list, y_list, t_list] = Record(x_list, y_list, t_list, Sost, t, i);
  155.             i = i + 1;
  156.         else
  157.             Sost = RK4(t, dt, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  158.                 theta_2, 0, W);
  159.             t = t + dt;
  160.  
  161.             [x_list, y_list, t_list] = Record(x_list, y_list, t_list, Sost, t, i);
  162.             i = i + 1;
  163.         end
  164.     end
  165.  
  166.     % Интегрирование по скорости
  167.     while abs(Sost(1)^2 + Sost(2)^2 - V_k) > 10^(-8)
  168.         % Сохраняем вектор состояния в момент времени t = 600.3
  169.         Sost_previous = Sost;
  170.  
  171.         Sost = RK4(t, dt, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  172.                 theta_2, P, W);
  173.  
  174.         if (Sost(1)^2 + Sost(2)^2) > V_k
  175.             Sost = Sost_previous;
  176.             dt = dt / 10;
  177.         else
  178.             t = t + dt;
  179.             [x_list, y_list, t_list] = Record(x_list, y_list, t_list, Sost, t, i);
  180.             i = i + 1;
  181.         end
  182.        
  183.         % Условие на массу СВ
  184.         if round(Sost(5), 8) < (m_0 - m_fuel_k)
  185.             Sost = Sost_previous;
  186.             t = t - dt;
  187.             disp('Карамба!')
  188.             break
  189.         end
  190.     end
  191.  
  192.  
  193.  
  194.     % Обновление таблицы
  195.     table = cat(1, head, Sost_list);
  196.  
  197.     % Таблица [x_list', y_list', t_list']
  198.     Coordinates = cat(2, t_list', x_list', y_list');
  199.  
  200.     % Вложенная вспомогательная функция записи координат и времени
  201.     function [x_list, y_list, t_list] = Record(x_list, y_list, t_list, Sost, t, i)
  202.         x_list(i) = Sost(3);
  203.         y_list(i) = Sost(4);
  204.         t_list(i) = t;
  205.     end
  206. end
  207.  
  208. % Визуализация
  209. function Plot_Trajectory(Rm, h_isl, x_list, y_list, x_special, y_special)
  210.     figure('Name', "Траектория");
  211.     hold on;
  212.  
  213.     % Луна
  214.     theta = linspace(deg2rad(75), deg2rad(105), 10^3);
  215.     x_moon = Rm * cos(theta);
  216.     y_moon = Rm * (sin(theta) - 1);
  217.     plot(x_moon, y_moon, 'k');
  218.  
  219.     % Орбита
  220.     x_orb = Rm * cos(theta);
  221.     y_orb = Rm * (sin(theta) - 1) + h_isl;
  222.     plot(x_orb, y_orb, 'k--');
  223.  
  224.     % Траектория
  225.     plot(x_list, y_list, 'b');
  226.  
  227.     % Критические точки
  228.     scatter(x_special, y_special, 'rs');
  229.  
  230.     % Настройка осей и сетки
  231.     grid on;
  232.     grid minor;
  233.     xline(0, 'k--');
  234.     yline(0, 'k--');
  235.     axis equal;
  236.     xlabel('x, [m]');
  237.     ylabel('y, [m]');
  238.     title('Траектория СВ');
  239.     legend('Луна', 'Орбита', 'Траектория СВ', 'Особые точки', 'Location', 'Northwest');
  240.  
  241.     hold off;
  242. end
  243.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement