Advertisement
MI5TONER

Untitled

Dec 8th, 2023
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 25.26 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.541; % 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. [X_new, U_i_new] = Optimization(theta_dot, theta_2, P(1), W, dt, t_vert, t_1, t_2, ...
  41.     mu_m, Rm, m_0, m_fuel_k, V_k, h_isl(1,1));
  42.  
  43. [Coordinates, Sost_list] = Integration(P(1), W, dt, t_vert, ...
  44.     X_new(1, 1), X_new(2, 1), ...
  45.     U_i_new(1, 1), U_i_new(2, 1), ...
  46.     mu_m, Rm, m_0, m_fuel_k, V_k);
  47.  
  48. Plot_Trajectory(Rm, h_isl(1,1), Coordinates(:, 4), Coordinates(:, 5), Sost_list(:, 4), Sost_list(:, 5));
  49.  
  50.  
  51.  
  52. %% Функции
  53.  
  54. % Введем вектор состояния, который будет описывать всю ММ
  55. % Sost = [V_x, V_y, x, y, m] ---> Sost(1) = V_x, ...
  56.  
  57. %% ММ движения СВ
  58.  
  59. function Mathmodel = MM(t, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  60.     theta_2, P, W)
  61.  
  62.     % Проекции гравитационного ускорения Луны
  63.     g_x = - (mu_m * Sost(3)) / (Sost(3)^2 + (Rm + Sost(4))^2)^(3 / 2);
  64.     g_y = - (mu_m * (Rm + Sost(4))) / (Sost(3)^2 + (Rm + Sost(4))^2)^(3 /2);
  65.  
  66.     % Изменение угла тангажа
  67.     if t <= t_vert
  68.         theta = pi / 2;
  69.     elseif ((t > t_vert) && (t <= t_1))
  70.         theta = pi / 2 + theta_dot * (t - t_vert);
  71.     elseif t >= t_2
  72.         theta = theta_2;
  73.     else
  74.         theta = 0;
  75.     end
  76.  
  77.     % Система уравнений
  78.     Vx_Dot = P / Sost(5) * cos(theta) + g_x;
  79.     Vy_Dot = P / Sost(5) * sin(theta) + g_y;
  80.     x_Dot = Sost(1);
  81.     y_Dot = Sost(2);
  82.     m_Dot = - P / W;
  83.  
  84.     % Свернем все в один вектор (вуктор-строка)
  85.     Mathmodel = [Vx_Dot Vy_Dot x_Dot y_Dot m_Dot];
  86. end
  87.  
  88. %% Ф-ия Рунге-Кутта 4-го порядка
  89.  
  90. function Sost = RK4(t, dt, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  91.     theta_2, P, W)
  92.  
  93.     K1 = dt * MM(t, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  94.         theta_2, P, W);
  95.     K2 = dt * MM(t + dt / 2, Sost + K1/2, mu_m, Rm, t_vert, t_1, t_2, ...
  96.         theta_dot, theta_2, P, W);
  97.     K3 = dt * MM(t + dt / 2, Sost + K2/2, mu_m, Rm, t_vert, t_1, t_2, ...
  98.         theta_dot, theta_2, P, W);
  99.     K4 = dt * MM(t + dt, Sost + K3, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  100.         theta_2, P, W);
  101.  
  102.     % Обновляем результаты
  103.     Sost = Sost + (K1 + 2 * K2 + 2 * K3 + K4) / 6;
  104. end
  105.  
  106. %% Интегрирование
  107.  
  108. function [Coordinates, Sost_list] = Integration(P, W, dt, t_vert, t_1, t_2, theta_dot,...
  109.     theta_2, mu_m, Rm, m_0, m_fuel_k, V_k)
  110.  
  111.     t = 0; x = 0; y = 0; V_x = 0; V_y = 0; m = m_0;  % Начальные условия при t = 0
  112.     Sost = [V_x V_y x y m];                          % Вектор состояния с начальными данными
  113.     Sost_list = zeros(1, 6);                         % "Хранилище" (Вектор строка, образованная из t и Sost)
  114.    
  115.     % Создадим пустые строки для записи координат и времени
  116.     Vx_list = zeros();     Vy_list = zeros();
  117.     x_list = zeros();      y_list = zeros();
  118.     m_list = zeros();      t_list = zeros();
  119.  
  120.     i = 1;
  121.    
  122.     % Точка t_vert
  123.     while t < t_vert
  124.         Sost = RK4(t, dt, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  125.             theta_2, P, W);
  126.         t = t + dt;
  127.  
  128.         [Vx_list, Vy_list, x_list, y_list, m_list, t_list] = Record(Sost, t, i, ...
  129.             Vx_list, Vy_list, x_list, y_list, m_list, t_list);
  130.         i = i + 1;
  131.         if round(t, 1) == t_vert
  132.             Sost_list = cat(2, t, Sost);
  133.         end
  134.     end
  135.  
  136.     % Точка t_1
  137.     while t < t_1
  138.         if round(t, 1) == round(t_1 - mod(t_1, dt), 1) % 360.3
  139.             dt_local = t_1 - t;                        %   0.023
  140.             Sost = RK4(t, dt_local, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  141.                 theta_2, P, W);
  142.             Sost_list = cat(1, Sost_list, cat(2, t_1, Sost));
  143.  
  144.             % Выключаем тягу P = 0 и доделываем шаг до 360.4
  145.             Sost = RK4(t_1, dt - dt_local, Sost, mu_m, Rm, t_vert, t_1, t_2, ...
  146.                 theta_dot, theta_2, 0, W);
  147.             t = t + dt;
  148.            
  149.             [Vx_list, Vy_list, x_list, y_list, m_list, t_list] = Record(Sost, t, i, ...
  150.                 Vx_list, Vy_list, x_list, y_list, m_list, t_list);
  151.             i = i + 1;
  152.         else
  153.             Sost = RK4(t, dt, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  154.                 theta_2, P, W);
  155.             t = t + dt;
  156.            
  157.             [Vx_list, Vy_list, x_list, y_list, m_list, t_list] = Record(Sost, t, i, ...
  158.                 Vx_list, Vy_list, x_list, y_list, m_list, t_list);
  159.             i = i + 1;
  160.         end
  161.     end
  162.  
  163.     % Точка t_2
  164.     while t < t_2
  165.         if round(t, 1) == round(t_2 - mod(t_2, dt), 1) % 600.2
  166.             dt_local = t_2 - t;                        %   0.041
  167.             Sost = RK4(t, dt_local, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  168.                 theta_2, 0, W);
  169.             Sost_list = cat(1, Sost_list, cat(2, t_2, Sost));
  170.  
  171.             % Включаем тягу и доделываем шаг до 600.3
  172.             Sost = RK4(t_2, dt - dt_local, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  173.                 theta_2, P, W);
  174.             t = t + dt;
  175.            
  176.             [Vx_list, Vy_list, x_list, y_list, m_list, t_list] = Record(Sost, t, i, ...
  177.                 Vx_list, Vy_list, x_list, y_list, m_list, t_list);
  178.             i = i + 1;
  179.         else
  180.             Sost = RK4(t, dt, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  181.                 theta_2, 0, W);
  182.             t = t + dt;
  183.  
  184.             [Vx_list, Vy_list, x_list, y_list, m_list, t_list] = Record(Sost, t, i, ...
  185.                 Vx_list, Vy_list, x_list, y_list, m_list, t_list);
  186.             i = i + 1;
  187.         end
  188.     end
  189.  
  190.     % Интегрирование по скорости
  191.     while abs(sqrt(Sost(1)^2 + Sost(2)^2) - sqrt(V_k)) > 10^(-10)
  192.         % Сохраняем вектор состояния в момент времени t = 600.3
  193.         Sost_previous = Sost;
  194.        
  195.         Sost = RK4(t, dt, Sost, mu_m, Rm, t_vert, t_1, t_2, theta_dot,...
  196.                 theta_2, P, W);
  197.  
  198.         if (Sost(1)^2 + Sost(2)^2) > V_k
  199.             Sost = Sost_previous;
  200.             dt = dt / 10;
  201.         else
  202.             t = t + dt;
  203.             [Vx_list, Vy_list, x_list, y_list, m_list, t_list] = Record(Sost, t, i, ...
  204.                 Vx_list, Vy_list, x_list, y_list, m_list, t_list);
  205.             i = i + 1;
  206.         end
  207.        
  208.         % Условие на массу СВ
  209.         % if round(Sost(5), 8) < (m_0 - m_fuel_k)
  210.         %     Sost = Sost_previous;
  211.         %     t = t - dt;
  212.         %     disp('Карамба!');
  213.         %     break
  214.         % end
  215.     end
  216.  
  217.     % Таблица [t_list' Vx_list' Vy_list' x_list', y_list' m_list']
  218.     Coordinates = cat(2, t_list', Vx_list', Vy_list', x_list', y_list', m_list');
  219.  
  220.     % Вложенная вспомогательная функция записи координат и времени
  221.     function [Vx_list, Vy_list, x_list, y_list, m_list, t_list] = Record(Sost, t, i, ...
  222.                 Vx_list, Vy_list, x_list, y_list, m_list, t_list)
  223.         Vx_list(i) = Sost(1);  Vy_list(i) = Sost(2);
  224.         x_list(i) = Sost(3);   y_list(i) = Sost(4);
  225.         m_list(i) = Sost(5);   t_list(i) = t;
  226.     end
  227. end
  228.  
  229. % Граничные параметры
  230. function [r, Theta] = Border_Params(Coordinates, Rm)
  231.     % Распаковка
  232.     Vx = Coordinates(end, 2);   Vy = Coordinates(end, 3);
  233.     x  = Coordinates(end, 4);   y  = Coordinates(end, 5);
  234.  
  235.     % Вычисление
  236.     V = sqrt(Vx^2 + Vy^2);
  237.     r = sqrt((Rm + y)^2 + x^2);
  238.     Theta = asin((Vx * x + Vy * (Rm + y)) / (r * V));
  239. end
  240.  
  241. % Функция расчета частной производной методом центральных разностей
  242. function [PD] = Partial_Derivative(f1, f2, delta)
  243.     PD = (f2 - f1) / (2 * delta);
  244. end
  245.  
  246. % Итерационная формула
  247. function [U_i_new, F_U] = Iteration_Formula(theta_dot, theta_2, r_current, Theta_current,...
  248.     delta_theta_dot, delta_theta_2, ...
  249.     r_f1_theta_dot, r_f2_theta_dot, r_f1_theta_2, r_f2_theta_2, ...
  250.     Theta_f1_theta_dot, Theta_f2_theta_dot, Theta_f1_theta_2, Theta_f2_theta_2,...
  251.     Rm, h_isl)
  252.  
  253.     U_i = [theta_dot; theta_2];
  254.    
  255.     % Расчет производных для Якобиана
  256.     dr_dtheta_dot = Partial_Derivative(r_f1_theta_dot, r_f2_theta_dot, delta_theta_dot);
  257.     dr_dtheta_2 = Partial_Derivative(r_f1_theta_2, r_f2_theta_2, delta_theta_2);
  258.  
  259.     dTheta_dtheta_dot = Partial_Derivative(Theta_f1_theta_dot, Theta_f2_theta_dot, delta_theta_dot);
  260.     dTheta_dtheta_2 = Partial_Derivative(Theta_f1_theta_2, Theta_f2_theta_2, delta_theta_2);
  261.    
  262.     % Якобиан
  263.     J = [dr_dtheta_dot       dr_dtheta_2;
  264.          dTheta_dtheta_dot   dTheta_dtheta_2];
  265.    
  266.     % Матрица невязок
  267.     F_U = -[r_current - (Rm + h_isl);
  268.             Theta_current];
  269.    
  270.     U_i_new = U_i + inv(J) * F_U;
  271. end
  272.  
  273. % Краевая задача
  274. function [U_i] = Border_Task(theta_dot, theta_2, P, W, dt, t_vert, t_1, t_2, ...
  275.     mu_m, Rm, m_0, m_fuel_k, V_k, h_isl)
  276.  
  277.     % Определим шаг для theta_dot и theta_2
  278.     delta_theta_dot = theta_dot / 1000;
  279.     delta_theta_2 = theta_2 / 1000;
  280.  
  281.     r_diff = 1;
  282.     Theta_diff = 1;
  283.  
  284.     U_i = [theta_dot; theta_2];
  285.  
  286.     while (abs(Theta_diff) > 10^(-6)) || (abs(r_diff) > 10^(-6))
  287.  
  288.         theta_dot = U_i(1, 1);
  289.         theta_2 = U_i(2, 1);
  290.  
  291.  
  292.         % Для текущих значений r_current, Theta_current
  293.         [Coordinates, ~] = Integration(P, W, dt, t_vert, t_1, t_2, theta_dot,...
  294.             theta_2, mu_m, Rm, m_0, m_fuel_k, V_k);
  295.         [r_current, Theta_current] = Border_Params(Coordinates, Rm);
  296.  
  297.         % Вычисление производных
  298.         [Coordinates, ~] = Integration(P, W, dt, t_vert, t_1, t_2,...
  299.             theta_dot - delta_theta_dot,...
  300.             theta_2, mu_m, Rm, m_0, m_fuel_k, V_k);
  301.         [r_f1_theta_dot, Theta_f1_theta_dot] = Border_Params(Coordinates, Rm);
  302.  
  303.         [Coordinates, ~] = Integration(P, W, dt, t_vert, t_1, t_2,...
  304.             theta_dot + delta_theta_dot,...
  305.             theta_2, mu_m, Rm, m_0, m_fuel_k, V_k);
  306.         [r_f2_theta_dot, Theta_f2_theta_dot] = Border_Params(Coordinates, Rm);
  307.  
  308.         [Coordinates, ~] = Integration(P, W, dt, t_vert, t_1, t_2, theta_dot,...
  309.             theta_2 - delta_theta_2, ...
  310.             mu_m, Rm, m_0, m_fuel_k, V_k);
  311.         [r_f1_theta_2, Theta_f1_theta_2] = Border_Params(Coordinates, Rm);
  312.  
  313.         [Coordinates, ~] = Integration(P, W, dt, t_vert, t_1, t_2, theta_dot,...
  314.             theta_2 + delta_theta_2, ...
  315.             mu_m, Rm, m_0, m_fuel_k, V_k);
  316.         [r_f2_theta_2, Theta_f2_theta_2] = Border_Params(Coordinates, Rm);
  317.  
  318.         [U_i, F_U] = Iteration_Formula(theta_dot, theta_2, r_current, Theta_current,...
  319.             delta_theta_dot, delta_theta_2, ...
  320.             r_f1_theta_dot, r_f2_theta_dot, r_f1_theta_2, r_f2_theta_2, ...
  321.             Theta_f1_theta_dot, Theta_f2_theta_dot, Theta_f1_theta_2, Theta_f2_theta_2,...
  322.             Rm, h_isl);
  323.  
  324.         r_diff = F_U(1, 1);
  325.         Theta_diff = F_U(2, 1);
  326.  
  327.         % disp([F_U(1,1), F_U(2, 1)]);
  328.     end
  329. end
  330.  
  331. %% Задача оптимизации
  332. function [X_new, U_i_new] = Optimization(theta_dot, theta_2, P, W, dt, t_vert, t_1, t_2, ...
  333.     mu_m, Rm, m_0, m_fuel_k, V_k, h_isl)
  334.    
  335.     alpha_0 = 0.0001;
  336.     Iteration_Count = 0;
  337.  
  338.     % C_1, C_2
  339.     C_1 = 0.5;
  340.     C_2 = 1 / C_1;
  341.  
  342.     % alpha
  343.     alpha_i = alpha_0;
  344.  
  345.     % Точность
  346.     epsilon = 0.01;
  347.    
  348.     % Шаг по времени
  349.     delta_t = 0.01;
  350.  
  351.     % Считаем краевую задачу и функцию g(X) без оптимизации
  352.     [g_new, U_i_new] = Help_Optimization_Fun( ...
  353.                            theta_dot, theta_2, ...
  354.                            P, W, dt, t_vert,...
  355.                            t_1, t_2, ...
  356.                            mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  357.  
  358.     %__________________частная_производная_________________
  359.  
  360.     % t1 - delta_t
  361.     [g_grad_11, ~] = Help_Optimization_Fun( ...
  362.                         theta_dot, theta_2, ...
  363.                         P, W, dt, t_vert,...
  364.                         t_1 - delta_t, t_2, ...
  365.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  366.  
  367.     % t1 + delta_t
  368.     [g_grad_12, ~] = Help_Optimization_Fun( ...
  369.                         theta_dot, theta_2, ...
  370.                         P, W, dt, t_vert,...
  371.                         t_1 + delta_t, t_2, ...
  372.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  373.  
  374.     % t2 - delta_t
  375.     [g_grad_21, ~] = Help_Optimization_Fun( ...
  376.                         theta_dot, theta_2, ...
  377.                         P, W, dt, t_vert,...
  378.                         t_1, t_2 - delta_t, ...
  379.                          mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  380.  
  381.     % t2 + delta_t
  382.     [g_grad_22, ~] = Help_Optimization_Fun( ...
  383.                         theta_dot, theta_2, ...
  384.                         P, W, dt, t_vert,...
  385.                         t_1, t_2 + delta_t, ...
  386.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  387.    
  388.     % Считаем частную производную по t1, t2
  389.     g_grad_t1 = Partial_Derivative(g_grad_11, g_grad_12, delta_t);
  390.     g_grad_t2 = Partial_Derivative(g_grad_21, g_grad_22, delta_t);
  391.  
  392.     %_____________________________________________________
  393.  
  394.     % Вектор-столбец градиента
  395.     grad_g = [g_grad_t1; g_grad_t2];
  396.    
  397.     disp(["g_new = " num2str(g_new)]);
  398.     disp(["grad_g = " mat2str(grad_g)]);
  399.  
  400.     % Вектор-столбец решений
  401.     X_new = [t_1; t_2];
  402.     disp(["t_1, t_2 = " mat2str(X_new)]);
  403.    
  404.     % База
  405.     while (abs(sqrt(grad_g(1, 1)^2 + grad_g(2, 1)^2)) >= epsilon)
  406.        
  407.         t_1 = X_new(1, 1);   t_2 = X_new(2, 1);
  408.         g = g_new;
  409.  
  410.         %_____________смешанная_частная_производная_____________
  411.        
  412.         % Точка 1 (t_1 - delta_t, t_2 - 2 * delta_t)
  413.         [g_1, ~] = Help_Optimization_Fun( ...
  414.                        U_i_new(1, 1), U_i_new(2, 1), ...
  415.                        P, W, dt, t_vert,...
  416.                        t_1 - delta_t, t_2 - 2 * delta_t, ...
  417.                        mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  418.  
  419.         % Точка 2 (t_1 - delta_t, t_2 + 2 * delta_t)
  420.         [g_2, ~] = Help_Optimization_Fun( ...
  421.                        U_i_new(1, 1), U_i_new(2, 1), ...
  422.                        P, W, dt, t_vert,...
  423.                        t_1 - delta_t, t_2 + 2 * delta_t, ...
  424.                        mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  425.  
  426.         % Точка 3 (t_1 + delta_t, t_2 - 2 * delta_t)
  427.         [g_3, ~] = Help_Optimization_Fun( ...
  428.                        U_i_new(1, 1), U_i_new(2, 1), ...
  429.                        P, W, dt, t_vert,...
  430.                        t_1 + delta_t, t_2 - 2 * delta_t, ...
  431.                        mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  432.  
  433.         % Точка 4 (t_1 + delta_t, t_2 + 2 * delta_t)
  434.         [g_4, ~] = Help_Optimization_Fun( ...
  435.                        U_i_new(1, 1), U_i_new(2, 1), ...
  436.                        P, W, dt, t_vert,...
  437.                        t_1 + delta_t, t_2 + 2 * delta_t, ...
  438.                        mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  439.  
  440.         % Считаем частную производную по dt1 dt2
  441.         f1_dt1 = Partial_Derivative(g_1, g_3, delta_t);
  442.         f2_dt1 = Partial_Derivative(g_2, g_4, delta_t);
  443.         Derivative_t12 = Partial_Derivative(f1_dt1, f2_dt1, 2 * delta_t);
  444.  
  445.         %______________полная_частная_производная_для_t1______________
  446.  
  447.         % Точка 1 (t_1 - 2 * delta_t, t_2)
  448.         [g_11, ~] = Help_Optimization_Fun( ...
  449.                         U_i_new(1, 1), U_i_new(2, 1), ...
  450.                         P, W, dt, t_vert,...
  451.                         t_1 - 2 * delta_t, t_2, ...
  452.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  453.  
  454.         % Точка 2 (t_1, t_2)
  455.         [g_12, ~] = Help_Optimization_Fun( ...
  456.                         U_i_new(1, 1), U_i_new(2, 1), ...
  457.                         P, W, dt, t_vert,...
  458.                         t_1, t_2, ...
  459.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  460.  
  461.         % Точка 3 (t_1, t_2)
  462.         [g_13, ~] = Help_Optimization_Fun( ...
  463.                         U_i_new(1, 1), U_i_new(2, 1), ...
  464.                         P, W, dt, t_vert,...
  465.                         t_1, t_2, ...
  466.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  467.  
  468.         % Точка 4 (t_1 + 2 * delta_t, t_2)
  469.         [g_14, ~] = Help_Optimization_Fun( ...
  470.                         U_i_new(1, 1), U_i_new(2, 1), ...
  471.                         P, W, dt, t_vert,...
  472.                         t_1 + 2 * delta_t, t_2, ...
  473.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  474.  
  475.         % Считаем частную производную по dt1 dt1
  476.         f11_dt1 = Partial_Derivative(g_12, g_11, delta_t);
  477.         f12_dt1 = Partial_Derivative(g_14, g_13, delta_t);
  478.         Derivative_t11 = Partial_Derivative(f12_dt1, f11_dt1, delta_t);
  479.  
  480.         %______________полная_частная_производная_для_t2______________
  481.  
  482.         % Точка 1 (t_1, t_2 - 2 * delta_t)
  483.         [g_21, ~] = Help_Optimization_Fun( ...
  484.                         U_i_new(1, 1), U_i_new(2, 1), ...
  485.                         P, W, dt, t_vert,...
  486.                         t_1, t_2 - 2 * delta_t, ...
  487.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  488.  
  489.         % Точка 2 (t_1, t_2)
  490.         [g_22, ~] = Help_Optimization_Fun( ...
  491.                         U_i_new(1, 1), U_i_new(2, 1), ...
  492.                         P, W, dt, t_vert,...
  493.                         t_1, t_2, ...
  494.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  495.  
  496.         % Точка 3 (t_1, t_2)
  497.         [g_23, ~] = Help_Optimization_Fun( ...
  498.                         U_i_new(1, 1), U_i_new(2, 1), ...
  499.                         P, W, dt, t_vert,...
  500.                         t_1, t_2, ...
  501.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  502.  
  503.         % Точка 4 (t_1, t_2 + 2 * delta_t)
  504.         [g_24, ~] = Help_Optimization_Fun( ...
  505.                         U_i_new(1, 1), U_i_new(2, 1), ...
  506.                         P, W, dt, t_vert,...
  507.                         t_1, t_2 + 2 * delta_t, ...
  508.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  509.  
  510.         % Считаем частную производную по dt2 dt2
  511.         f21_dt2 = Partial_Derivative(g_22, g_21, delta_t);
  512.         f22_dt2 = Partial_Derivative(g_24, g_23, delta_t);
  513.         Derivative_t22 = Partial_Derivative(f22_dt2, f21_dt2, delta_t);
  514.  
  515.         %_____________________________________________________________
  516.  
  517.         % Матрица Гессе
  518.         H_i = [Derivative_t11 Derivative_t12;
  519.                Derivative_t12 Derivative_t22];
  520.         disp(["H_i = ", mat2str(H_i)]);
  521.  
  522.  
  523.         % Интегрируем, подставляя X_new
  524.  
  525.         C_2_flag = false;
  526.         while g_new >= g
  527.  
  528.             X = X_new;
  529.  
  530.             % Обновляем вектор-столбец результатов
  531.             X_new = Iteration_Formula_LM(X_new, H_i, alpha_i, grad_g);
  532.            
  533.             [g_new, U_i_new] = Help_Optimization_Fun( ...
  534.                 U_i_new(1, 1), U_i_new(2, 1), ...
  535.                 P, W, dt, t_vert,...
  536.                 X_new(1, 1), X_new(2, 1), ...
  537.                 mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  538.  
  539.             if g_new < g
  540.                 if C_2_flag == false
  541.                     alpha_i = alpha_i * C_1;
  542.                 end
  543.                 disp(["1", num2str(alpha_i)]);
  544.                 break
  545.             end
  546.  
  547.             alpha_i = alpha_i * C_2;
  548.             X_new = X;
  549.             disp(["2", num2str(alpha_i)]);
  550.             C_2_flag = true;
  551.         end
  552.  
  553.         % Вывод
  554.         disp(["X_new = ", mat2str(X_new)]);
  555.         disp(["U_i_new = ", mat2str(U_i_new)]);
  556.         disp(["g_new = ", num2str(g_new)]);
  557.  
  558.         % Пересчет вектора градиента
  559.         % t_1
  560.         % Точка 1.1. (X_new(1, 1) - delta_t, X_new(2, 1))
  561.         [g_recalc_grad_11, ~] = Help_Optimization_Fun( ...
  562.             U_i_new(1, 1), U_i_new(2, 1), ...
  563.             P, W, dt, t_vert,...
  564.             X_new(1, 1) - delta_t, X_new(2, 1), ...
  565.             mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  566.  
  567.         % Точка 1.2. (X_new(1, 1) + delta_t, X_new(2, 1))
  568.         [g_recalc_grad_12, ~] = Help_Optimization_Fun( ...
  569.             U_i_new(1, 1), U_i_new(2, 1), ...
  570.             P, W, dt, t_vert,...
  571.             X_new(1, 1) + delta_t, X_new(2, 1), ...
  572.             mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  573.  
  574.         % Точка 2.1. (X_new(1, 1), X_new(2, 1) - delta_t)
  575.         [g_recalc_grad_21, ~] = Help_Optimization_Fun( ...
  576.             U_i_new(1, 1), U_i_new(2, 1), ...
  577.             P, W, dt, t_vert,...
  578.             X_new(1, 1), X_new(2, 1) - delta_t, ...
  579.             mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  580.  
  581.         % Точка 2.2. (X_new(1, 1), X_new(2, 1) + delta_t)
  582.         [g_recalc_grad_22, ~] = Help_Optimization_Fun( ...
  583.             U_i_new(1, 1), U_i_new(2, 1), ...
  584.             P, W, dt, t_vert,...
  585.             X_new(1, 1), X_new(2, 1) + delta_t, ...
  586.             mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  587.  
  588.         % Считаем производные
  589.         g_recalc_t1 = Partial_Derivative(g_recalc_grad_11, g_recalc_grad_12, delta_t);
  590.         g_recalc_t2 = Partial_Derivative(g_recalc_grad_21, g_recalc_grad_22, delta_t);
  591.        
  592.         grad_g = [g_recalc_t1; g_recalc_t2];
  593.         disp(["grad_g = ", mat2str(grad_g)]);
  594.         disp(["abs(grad_g) = ", num2str(abs(sqrt(grad_g(1, 1)^2 + grad_g(2, 1)^2)))]);
  595.        
  596.         Iteration_Count = Iteration_Count + 1;
  597.  
  598.         disp(["Iteration_Count", num2str(Iteration_Count)]);
  599.     end
  600.  
  601.     % Вспомогательные функции
  602.     function [g, U_i] = Help_Optimization_Fun( ...
  603.         theta_dot, theta_2, ...
  604.         P, W, dt, t_vert,...
  605.         t_1, t_2, ...
  606.         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl)
  607.  
  608.         U_i = Border_Task(theta_dot, theta_2, P, W, dt, t_vert,...
  609.             t_1, t_2, ...
  610.             mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  611.  
  612.         [Coordinates, ~] = Integration(P, W, dt, t_vert, ...
  613.             t_1, t_2, ...
  614.             U_i(1, 1), U_i(2, 1), ...
  615.             mu_m, Rm, m_0, m_fuel_k, V_k);
  616.  
  617.         g = m_0 - Coordinates(end, 6);
  618.     end
  619.  
  620.     % Итерационная формула
  621.     function [X_new] = Iteration_Formula_LM(X_i, H_i, alpha_i, grad_g)
  622.         X_new = X_i - inv(H_i + alpha_i .* eye(2, 2)) * grad_g;
  623.     end
  624. end
  625. %% Визуализация
  626.  
  627. function Plot_Trajectory(Rm, h_isl, x_list, y_list, x_special, y_special)
  628.     figure('Name', "Траектория");
  629.     hold on;
  630.  
  631.     % Луна
  632.     theta = linspace(deg2rad(40), deg2rad(100), 10^3);
  633.     x_moon = Rm * cos(theta);
  634.     y_moon = Rm * (sin(theta) - 1);
  635.     plot(x_moon, y_moon, 'k');
  636.  
  637.     % Орбита
  638.     x_orb = (Rm + h_isl) * cos(theta);
  639.     y_orb = (Rm + h_isl) * sin(theta) - Rm;
  640.     plot(x_orb, y_orb, 'k--');
  641.  
  642.     % Траектория
  643.     plot(x_list, y_list, 'b');
  644.  
  645.     % Критические точки
  646.     scatter(x_special, y_special, 'rs');
  647.  
  648.     % Настройка осей и сетки
  649.     grid on;
  650.     grid minor;
  651.     xline(0, 'k--');
  652.     yline(0, 'k--');
  653.     axis equal;
  654.     xlabel('x, [m]');
  655.     ylabel('y, [m]');
  656.     title('Траектория СВ');
  657.     legend('Луна', 'Орбита', 'Траектория СВ', 'Особые точки', 'Location', 'Northwest');
  658.  
  659.     hold off;
  660. end
  661.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement