Advertisement
MI5TONER

Untitled

Nov 26th, 2023
32
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 13.44 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.  
  15. V_k = mu_m / (Rm + h_isl(1,1));
  16.  
  17. dt = 0.1;                   % Шаг интегрирования, [c]
  18.  
  19. % Начальные условия при t = 0
  20. t = 0; x = 0; y = 0; V_x = 0; V_y = 0; m = m_0;
  21.  
  22. t_1 = 350.323; % 360.323
  23. t_2 = 540.241; % 600.241
  24. theta_dot = -0.00309; % -0.00309
  25. theta_2 = -0.08266;   % -0.08266
  26.  
  27. %% Вызов функций
  28.  
  29. % [Coordinates, Sost_list] = Integration(P(1), W, dt, t_vert, t_1, t_2, theta_dot,...
  30. %     theta_2, mu_m, Rm, m_0, m_fuel_k, V_k);
  31. %
  32. % [r_current, Theta_current] = Border_Params(Coordinates, Rm);
  33.  
  34. U_i = Border_Task(theta_dot, theta_2, P(1), W, dt, t_vert, t_1, t_2, ...
  35.     mu_m, Rm, m_0, m_fuel_k, V_k, h_isl(1,1));
  36.  
  37. [Coordinates, Sost_list] = Integration(P(1), W, dt, t_vert, t_1, t_2, U_i(1, 1),...
  38.     U_i(2, 1), mu_m, Rm, m_0, m_fuel_k, V_k);
  39.  
  40. Plot_Trajectory(Rm, h_isl(1,1), Coordinates(:, 4), Coordinates(:, 5), Sost_list(:, 4), Sost_list(:, 5));
  41.  
  42.  
  43. %% Функции
  44.  
  45. % Введем вектор состояния, который будет описывать всю ММ
  46. % Sost = [V_x, V_y, x, y, m] ---> Sost(1) = V_x, ...
  47.  
  48. %% ММ движения СВ
  49.  
  50. function Mathmodel = MM(t, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  51.     theta_2, P, W)
  52.  
  53.     % Проекции гравитационного ускорения Луны
  54.     g_x = - (mu_m * Sost(3)) / (Sost(3)^2 + (Rm + Sost(4))^2)^(3 / 2);
  55.     g_y = - (mu_m * (Rm + Sost(4))) / (Sost(3)^2 + (Rm + Sost(4))^2)^(3 /2);
  56.  
  57.     % Изменение угла тангажа
  58.     if t <= t_vert
  59.         theta = pi / 2;
  60.     elseif ((t > t_vert) && (t <= t_1))
  61.         theta = pi / 2 + theta_dot * (t - t_vert);
  62.     elseif t >= t_2
  63.         theta = theta_2;
  64.     else
  65.         theta = 0;
  66.     end
  67.  
  68.     % Система уравнений
  69.     Vx_Dot = P / Sost(5) * cos(theta) + g_x;
  70.     Vy_Dot = P / Sost(5) * sin(theta) + g_y;
  71.     x_Dot = Sost(1);
  72.     y_Dot = Sost(2);
  73.     m_Dot = - P / W;
  74.  
  75.     % Свернем все в один вектор (вуктор-строка)
  76.     Mathmodel = [Vx_Dot Vy_Dot x_Dot y_Dot m_Dot];
  77. end
  78.  
  79. %% Ф-ия Рунге-Кутта 4-го порядка
  80.  
  81. function Sost = RK4(t, dt, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  82.     theta_2, P, W)
  83.  
  84.     K1 = dt * MM(t, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  85.         theta_2, P, W);
  86.     K2 = dt * MM(t + dt / 2, Sost + K1/2, mu_m, Rm, t_vert, t_1, t_2, ...
  87.         theta_dot, theta_2, P, W);
  88.     K3 = dt * MM(t + dt / 2, Sost + K2/2, mu_m, Rm, t_vert, t_1, t_2, ...
  89.         theta_dot, theta_2, P, W);
  90.     K4 = dt * MM(t + dt, Sost + K3, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  91.         theta_2, P, W);
  92.  
  93.     % Обновляем результаты
  94.     Sost = Sost + (K1 + 2 * K2 + 2 * K3 + K4) / 6;
  95. end
  96.  
  97. %% Интегрирование
  98.  
  99. function [Coordinates, Sost_list] = Integration(P, W, dt, t_vert, t_1, t_2, theta_dot,...
  100.     theta_2, mu_m, Rm, m_0, m_fuel_k, V_k)
  101.  
  102.     t = 0; x = 0; y = 0; V_x = 0; V_y = 0; m = m_0;  % Начальные условия при t = 0
  103.     Sost = [V_x V_y x y m];                          % Вектор состояния с начальными данными
  104.     Sost_list = zeros(1, 6);                         % "Хранилище" (Вектор строка, образованная из t и Sost)
  105.    
  106.     % Создадим пустые строки для записи координат и времени
  107.     Vx_list = zeros();     Vy_list = zeros();
  108.     x_list = zeros();      y_list = zeros();
  109.     m_list = zeros();      t_list = zeros();
  110.  
  111.     i = 1;
  112.    
  113.     % Точка t_vert
  114.     while t < t_vert
  115.         Sost = RK4(t, dt, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  116.             theta_2, P, W);
  117.         t = t + dt;
  118.  
  119.         [Vx_list, Vy_list, x_list, y_list, m_list, t_list] = Record(Sost, t, i, ...
  120.             Vx_list, Vy_list, x_list, y_list, m_list, t_list);
  121.         i = i + 1;
  122.         if round(t, 1) == t_vert
  123.             Sost_list = cat(2, t, Sost);
  124.         end
  125.     end
  126.  
  127.     % Точка t_1
  128.     while t < t_1
  129.         if round(t, 1) == round(t_1 - mod(t_1, dt), 1) % 360.3
  130.             dt_local = t_1 - t;                        %   0.023
  131.             Sost = RK4(t, dt_local, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  132.                 theta_2, P, W);
  133.             Sost_list = cat(1, Sost_list, cat(2, t_1, Sost));
  134.  
  135.             % Выключаем тягу P = 0 и доделываем шаг до 360.4
  136.             Sost = RK4(t_1, dt - dt_local, Sost, mu_m, Rm, t_vert, t_1, t_2, ...
  137.                 theta_dot, theta_2, 0, W);
  138.             t = t + dt;
  139.            
  140.             [Vx_list, Vy_list, x_list, y_list, m_list, t_list] = Record(Sost, t, i, ...
  141.                 Vx_list, Vy_list, x_list, y_list, m_list, t_list);
  142.             i = i + 1;
  143.         else
  144.             Sost = RK4(t, dt, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  145.                 theta_2, P, W);
  146.             t = t + dt;
  147.            
  148.             [Vx_list, Vy_list, x_list, y_list, m_list, t_list] = Record(Sost, t, i, ...
  149.                 Vx_list, Vy_list, x_list, y_list, m_list, t_list);
  150.             i = i + 1;
  151.         end
  152.     end
  153.  
  154.     % Точка t_2
  155.     while t < t_2
  156.         if round(t, 1) == round(t_2 - mod(t_2, dt), 1) % 600.2
  157.             dt_local = t_2 - t;                        %   0.041
  158.             Sost = RK4(t, dt_local, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  159.                 theta_2, 0, W);
  160.             Sost_list = cat(1, Sost_list, cat(2, t_2, Sost));
  161.  
  162.             % Включаем тягу и доделываем шаг до 600.3
  163.             Sost = RK4(t_2, dt - dt_local, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  164.                 theta_2, P, W);
  165.             t = t + dt;
  166.            
  167.             [Vx_list, Vy_list, x_list, y_list, m_list, t_list] = Record(Sost, t, i, ...
  168.                 Vx_list, Vy_list, x_list, y_list, m_list, t_list);
  169.             i = i + 1;
  170.         else
  171.             Sost = RK4(t, dt, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  172.                 theta_2, 0, W);
  173.             t = t + dt;
  174.  
  175.             [Vx_list, Vy_list, x_list, y_list, m_list, t_list] = Record(Sost, t, i, ...
  176.                 Vx_list, Vy_list, x_list, y_list, m_list, t_list);
  177.             i = i + 1;
  178.         end
  179.     end
  180.  
  181.     % Интегрирование по скорости
  182.     while abs(sqrt(Sost(1)^2 + Sost(2)^2) - sqrt(V_k)) > 10^(-7)
  183.         % Сохраняем вектор состояния в момент времени t = 600.3
  184.         Sost_previous = Sost;
  185.        
  186.         Sost = RK4(t, dt, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  187.                 theta_2, P, W);
  188.  
  189.         if (Sost(1)^2 + Sost(2)^2) > V_k
  190.             Sost = Sost_previous;
  191.             dt = dt / 10;
  192.         else
  193.             t = t + dt;
  194.             [Vx_list, Vy_list, x_list, y_list, m_list, t_list] = Record(Sost, t, i, ...
  195.                 Vx_list, Vy_list, x_list, y_list, m_list, t_list);
  196.             i = i + 1;
  197.         end
  198.        
  199.         % Условие на массу СВ
  200.         if round(Sost(5), 8) < (m_0 - m_fuel_k)
  201.             Sost = Sost_previous;
  202.             t = t - dt;
  203.             disp('Карамба!');
  204.             break
  205.         end
  206.     end
  207.  
  208.     % Таблица [t_list' Vx_list' Vy_list' x_list', y_list' m_list']
  209.     Coordinates = cat(2, t_list', Vx_list', Vy_list', x_list', y_list', m_list');
  210.  
  211.     % Вложенная вспомогательная функция записи координат и времени
  212.     function [Vx_list, Vy_list, x_list, y_list, m_list, t_list] = Record(Sost, t, i, ...
  213.                 Vx_list, Vy_list, x_list, y_list, m_list, t_list)
  214.         Vx_list(i) = Sost(1);  Vy_list(i) = Sost(2);
  215.         x_list(i) = Sost(3);   y_list(i) = Sost(4);
  216.         m_list(i) = Sost(5);   t_list(i) = t;
  217.     end
  218. end
  219.  
  220. % Граничные параметры
  221. function [r, Theta] = Border_Params(Coordinates, Rm)
  222.     % Распаковка
  223.     Vx = Coordinates(end, 2);   Vy = Coordinates(end, 3);
  224.     x  = Coordinates(end, 4);   y  = Coordinates(end, 5);
  225.  
  226.     % Вычисление
  227.     V = sqrt(Vx^2 + Vy^2);
  228.     r = sqrt((Rm + y)^2 + x^2);
  229.     Theta = asin((Vx * x + Vy * (Rm + y)) / (r * V));
  230. end
  231.  
  232. % Функция расчета частной производной методом центральных разностей
  233. function [PD] = Partial_Derivative(f1, f2, delta)
  234.     PD = (f2 - f1) / (2 * delta);
  235. end
  236.  
  237. % Итерационная формула
  238. function [U_i_new, F_U] = Iteration_Formula(theta_dot, theta_2, r_current, Theta_current,...
  239.     delta_theta_dot, delta_theta_2, ...
  240.     r_f1_theta_dot, r_f2_theta_dot, r_f1_theta_2, r_f2_theta_2, ...
  241.     Theta_f1_theta_dot, Theta_f2_theta_dot, Theta_f1_theta_2, Theta_f2_theta_2,...
  242.     Rm, h_isl)
  243.  
  244.     U_i = [theta_dot; theta_2];
  245.    
  246.     % Расчет производных для Якобиана
  247.     dr_dtheta_dot = Partial_Derivative(r_f1_theta_dot, r_f2_theta_dot, delta_theta_dot);
  248.     dr_dtheta_2 = Partial_Derivative(r_f1_theta_2, r_f2_theta_2, delta_theta_2);
  249.  
  250.     dTheta_dtheta_dot = Partial_Derivative(Theta_f1_theta_dot, Theta_f2_theta_dot, delta_theta_dot);
  251.     dTheta_dtheta_2 = Partial_Derivative(Theta_f1_theta_2, Theta_f2_theta_2, delta_theta_2);
  252.    
  253.     % Якобиан
  254.     J = [dr_dtheta_dot       dr_dtheta_2;
  255.          dTheta_dtheta_dot   dTheta_dtheta_2];
  256.    
  257.     % Матрица невязок
  258.     F_U = -[r_current - (Rm + h_isl);
  259.             Theta_current];
  260.    
  261.     U_i_new = U_i + inv(J) * F_U;
  262. end
  263.  
  264. % Краевая задача
  265. function [U_i] = Border_Task(theta_dot, theta_2, P, W, dt, t_vert, t_1, t_2, ...
  266.     mu_m, Rm, m_0, m_fuel_k, V_k, h_isl)
  267.  
  268.     % Определим шаг для theta_dot и theta_2
  269.     delta_theta_dot = theta_dot / 1000;
  270.     delta_theta_2 = theta_2 / 1000;
  271.  
  272.     r_diff = 1;
  273.     Theta_diff = 1;
  274.  
  275.     U_i = [theta_dot; theta_2];
  276.  
  277.     while (abs(Theta_diff) > 10^(-6)) || (abs(r_diff) > 10^(-6))
  278.  
  279.         theta_dot = U_i(1, 1);
  280.         theta_2 = U_i(2, 1);
  281.  
  282.  
  283.         % Для текущих значений r_current, Theta_current
  284.         [Coordinates, ~] = Integration(P, W, dt, t_vert, t_1, t_2, theta_dot,...
  285.             theta_2, mu_m, Rm, m_0, m_fuel_k, V_k);
  286.         [r_current, Theta_current] = Border_Params(Coordinates, Rm);
  287.  
  288.         % Вычисление производных
  289.         [Coordinates, ~] = Integration(P, W, dt, t_vert, t_1, t_2,...
  290.             theta_dot - delta_theta_dot,...
  291.             theta_2, mu_m, Rm, m_0, m_fuel_k, V_k);
  292.         [r_f1_theta_dot, Theta_f1_theta_dot] = Border_Params(Coordinates, Rm);
  293.  
  294.         [Coordinates, ~] = Integration(P, W, dt, t_vert, t_1, t_2,...
  295.             theta_dot + delta_theta_dot,...
  296.             theta_2, mu_m, Rm, m_0, m_fuel_k, V_k);
  297.         [r_f2_theta_dot, Theta_f2_theta_dot] = Border_Params(Coordinates, Rm);
  298.  
  299.         [Coordinates, ~] = Integration(P, W, dt, t_vert, t_1, t_2, theta_dot,...
  300.             theta_2 - delta_theta_2, ...
  301.             mu_m, Rm, m_0, m_fuel_k, V_k);
  302.         [r_f1_theta_2, Theta_f1_theta_2] = Border_Params(Coordinates, Rm);
  303.  
  304.         [Coordinates, ~] = Integration(P, W, dt, t_vert, t_1, t_2, theta_dot,...
  305.             theta_2 + delta_theta_2, ...
  306.             mu_m, Rm, m_0, m_fuel_k, V_k);
  307.         [r_f2_theta_2, Theta_f2_theta_2] = Border_Params(Coordinates, Rm);
  308.  
  309.         [U_i, F_U] = Iteration_Formula(theta_dot, theta_2, r_current, Theta_current,...
  310.             delta_theta_dot, delta_theta_2, ...
  311.             r_f1_theta_dot, r_f2_theta_dot, r_f1_theta_2, r_f2_theta_2, ...
  312.             Theta_f1_theta_dot, Theta_f2_theta_dot, Theta_f1_theta_2, Theta_f2_theta_2,...
  313.             Rm, h_isl);
  314.  
  315.         r_diff = F_U(1, 1);
  316.         Theta_diff = F_U(2, 1);
  317.  
  318.         disp([F_U(1,1), F_U(2, 1)]);
  319.     end
  320. end
  321. %% Визуализация
  322.  
  323. function Plot_Trajectory(Rm, h_isl, x_list, y_list, x_special, y_special)
  324.     figure('Name', "Траектория");
  325.     hold on;
  326.  
  327.     % Луна
  328.     theta = linspace(deg2rad(70), deg2rad(100), 10^3);
  329.     x_moon = Rm * cos(theta);
  330.     y_moon = Rm * (sin(theta) - 1);
  331.     plot(x_moon, y_moon, 'k');
  332.  
  333.     % Орбита
  334.     x_orb = (Rm + h_isl) * cos(theta);
  335.     y_orb = (Rm + h_isl) * sin(theta) - Rm;
  336.     plot(x_orb, y_orb, 'k--');
  337.  
  338.     % Траектория
  339.     plot(x_list, y_list, 'b');
  340.  
  341.     % Критические точки
  342.     scatter(x_special, y_special, 'rs');
  343.  
  344.     % Настройка осей и сетки
  345.     grid on;
  346.     grid minor;
  347.     xline(0, 'k--');
  348.     yline(0, 'k--');
  349.     axis equal;
  350.     xlabel('x, [m]');
  351.     ylabel('y, [m]');
  352.     title('Траектория СВ');
  353.     legend('Луна', 'Орбита', 'Траектория СВ', 'Особые точки', 'Location', 'Northwest');
  354.  
  355.     hold off;
  356. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement