Advertisement
MI5TONER

Untitled

Dec 8th, 2023
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 11.41 KB | None | 0 0
  1. %% Задача оптимизации
  2. function [X_new, U_i_new] = Optimization(theta_dot, theta_2, P, W, dt, t_vert, t_1, t_2, ...
  3.     mu_m, Rm, m_0, m_fuel_k, V_k, h_isl)
  4.    
  5.     alpha_0 = 0.0001;
  6.     Iteration_Count = 0;
  7.  
  8.     % C_1, C_2
  9.     C_1 = 0.5;
  10.     C_2 = 1 / C_1;
  11.  
  12.     % alpha
  13.     alpha_i = alpha_0;
  14.  
  15.     % Точность
  16.     epsilon = 0.01;
  17.    
  18.     % Шаг по времени
  19.     delta_t = 0.01;
  20.  
  21.     % Считаем краевую задачу и функцию g(X) без оптимизации
  22.     [g_new, U_i_new] = Help_Optimization_Fun( ...
  23.                            theta_dot, theta_2, ...
  24.                            P, W, dt, t_vert,...
  25.                            t_1, t_2, ...
  26.                            mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  27.  
  28.     %__________________частная_производная_________________
  29.  
  30.     % t1 - delta_t
  31.     [g_grad_11, ~] = Help_Optimization_Fun( ...
  32.                         theta_dot, theta_2, ...
  33.                         P, W, dt, t_vert,...
  34.                         t_1 - delta_t, t_2, ...
  35.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  36.  
  37.     % t1 + delta_t
  38.     [g_grad_12, ~] = Help_Optimization_Fun( ...
  39.                         theta_dot, theta_2, ...
  40.                         P, W, dt, t_vert,...
  41.                         t_1 + delta_t, t_2, ...
  42.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  43.  
  44.     % t2 - delta_t
  45.     [g_grad_21, ~] = Help_Optimization_Fun( ...
  46.                         theta_dot, theta_2, ...
  47.                         P, W, dt, t_vert,...
  48.                         t_1, t_2 - delta_t, ...
  49.                          mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  50.  
  51.     % t2 + delta_t
  52.     [g_grad_22, ~] = Help_Optimization_Fun( ...
  53.                         theta_dot, theta_2, ...
  54.                         P, W, dt, t_vert,...
  55.                         t_1, t_2 + delta_t, ...
  56.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  57.    
  58.     % Считаем частную производную по t1, t2
  59.     g_grad_t1 = Partial_Derivative(g_grad_11, g_grad_12, delta_t);
  60.     g_grad_t2 = Partial_Derivative(g_grad_21, g_grad_22, delta_t);
  61.  
  62.     %_____________________________________________________
  63.  
  64.     % Вектор-столбец градиента
  65.     grad_g = [g_grad_t1; g_grad_t2];
  66.    
  67.     disp(["g_new = " num2str(g_new)]);
  68.     disp(["grad_g = " mat2str(grad_g)]);
  69.  
  70.     % Вектор-столбец решений
  71.     X_new = [t_1; t_2];
  72.     disp(["t_1, t_2 = " mat2str(X_new)]);
  73.    
  74.     % База
  75.     while (abs(sqrt(grad_g(1, 1)^2 + grad_g(2, 1)^2)) >= epsilon)
  76.        
  77.         t_1 = X_new(1, 1);   t_2 = X_new(2, 1);
  78.         g = g_new;
  79.  
  80.         %_____________смешанная_частная_производная_____________
  81.        
  82.         % Точка 1 (t_1 - delta_t, t_2 - 2 * delta_t)
  83.         [g_1, ~] = Help_Optimization_Fun( ...
  84.                        U_i_new(1, 1), U_i_new(2, 1), ...
  85.                        P, W, dt, t_vert,...
  86.                        t_1 - delta_t, t_2 - 2 * delta_t, ...
  87.                        mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  88.  
  89.         % Точка 2 (t_1 - delta_t, t_2 + 2 * delta_t)
  90.         [g_2, ~] = Help_Optimization_Fun( ...
  91.                        U_i_new(1, 1), U_i_new(2, 1), ...
  92.                        P, W, dt, t_vert,...
  93.                        t_1 - delta_t, t_2 + 2 * delta_t, ...
  94.                        mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  95.  
  96.         % Точка 3 (t_1 + delta_t, t_2 - 2 * delta_t)
  97.         [g_3, ~] = Help_Optimization_Fun( ...
  98.                        U_i_new(1, 1), U_i_new(2, 1), ...
  99.                        P, W, dt, t_vert,...
  100.                        t_1 + delta_t, t_2 - 2 * delta_t, ...
  101.                        mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  102.  
  103.         % Точка 4 (t_1 + delta_t, t_2 + 2 * delta_t)
  104.         [g_4, ~] = Help_Optimization_Fun( ...
  105.                        U_i_new(1, 1), U_i_new(2, 1), ...
  106.                        P, W, dt, t_vert,...
  107.                        t_1 + delta_t, t_2 + 2 * delta_t, ...
  108.                        mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  109.  
  110.         % Считаем частную производную по dt1 dt2
  111.         f1_dt1 = Partial_Derivative(g_1, g_3, delta_t);
  112.         f2_dt1 = Partial_Derivative(g_2, g_4, delta_t);
  113.         Derivative_t12 = Partial_Derivative(f1_dt1, f2_dt1, 2 * delta_t);
  114.  
  115.         %______________полная_частная_производная_для_t1______________
  116.  
  117.         % Точка 1 (t_1 - 2 * delta_t, t_2)
  118.         [g_11, ~] = Help_Optimization_Fun( ...
  119.                         U_i_new(1, 1), U_i_new(2, 1), ...
  120.                         P, W, dt, t_vert,...
  121.                         t_1 - 2 * delta_t, t_2, ...
  122.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  123.  
  124.         % Точка 2 (t_1, t_2)
  125.         [g_12, ~] = Help_Optimization_Fun( ...
  126.                         U_i_new(1, 1), U_i_new(2, 1), ...
  127.                         P, W, dt, t_vert,...
  128.                         t_1, t_2, ...
  129.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  130.  
  131.         % Точка 3 (t_1, t_2)
  132.         [g_13, ~] = Help_Optimization_Fun( ...
  133.                         U_i_new(1, 1), U_i_new(2, 1), ...
  134.                         P, W, dt, t_vert,...
  135.                         t_1, t_2, ...
  136.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  137.  
  138.         % Точка 4 (t_1 + 2 * delta_t, t_2)
  139.         [g_14, ~] = Help_Optimization_Fun( ...
  140.                         U_i_new(1, 1), U_i_new(2, 1), ...
  141.                         P, W, dt, t_vert,...
  142.                         t_1 + 2 * delta_t, t_2, ...
  143.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  144.  
  145.         % Считаем частную производную по dt1 dt1
  146.         f11_dt1 = Partial_Derivative(g_12, g_11, delta_t);
  147.         f12_dt1 = Partial_Derivative(g_14, g_13, delta_t);
  148.         Derivative_t11 = Partial_Derivative(f12_dt1, f11_dt1, delta_t);
  149.  
  150.         %______________полная_частная_производная_для_t2______________
  151.  
  152.         % Точка 1 (t_1, t_2 - 2 * delta_t)
  153.         [g_21, ~] = Help_Optimization_Fun( ...
  154.                         U_i_new(1, 1), U_i_new(2, 1), ...
  155.                         P, W, dt, t_vert,...
  156.                         t_1, t_2 - 2 * delta_t, ...
  157.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  158.  
  159.         % Точка 2 (t_1, t_2)
  160.         [g_22, ~] = Help_Optimization_Fun( ...
  161.                         U_i_new(1, 1), U_i_new(2, 1), ...
  162.                         P, W, dt, t_vert,...
  163.                         t_1, t_2, ...
  164.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  165.  
  166.         % Точка 3 (t_1, t_2)
  167.         [g_23, ~] = Help_Optimization_Fun( ...
  168.                         U_i_new(1, 1), U_i_new(2, 1), ...
  169.                         P, W, dt, t_vert,...
  170.                         t_1, t_2, ...
  171.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  172.  
  173.         % Точка 4 (t_1, t_2 + 2 * delta_t)
  174.         [g_24, ~] = Help_Optimization_Fun( ...
  175.                         U_i_new(1, 1), U_i_new(2, 1), ...
  176.                         P, W, dt, t_vert,...
  177.                         t_1, t_2 + 2 * delta_t, ...
  178.                         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  179.  
  180.         % Считаем частную производную по dt2 dt2
  181.         f21_dt2 = Partial_Derivative(g_22, g_21, delta_t);
  182.         f22_dt2 = Partial_Derivative(g_24, g_23, delta_t);
  183.         Derivative_t22 = Partial_Derivative(f22_dt2, f21_dt2, delta_t);
  184.  
  185.         %_____________________________________________________________
  186.  
  187.         % Матрица Гессе
  188.         H_i = [Derivative_t11 Derivative_t12;
  189.                Derivative_t12 Derivative_t22];
  190.         disp(["H_i = ", mat2str(H_i)]);
  191.  
  192.  
  193.         % Интегрируем, подставляя X_new
  194.  
  195.         C_2_flag = false;
  196.         while g_new >= g
  197.  
  198.             X = X_new;
  199.  
  200.             % Обновляем вектор-столбец результатов
  201.             X_new = Iteration_Formula_LM(X_new, H_i, alpha_i, grad_g);
  202.            
  203.             [g_new, U_i_new] = Help_Optimization_Fun( ...
  204.                 U_i_new(1, 1), U_i_new(2, 1), ...
  205.                 P, W, dt, t_vert,...
  206.                 X_new(1, 1), X_new(2, 1), ...
  207.                 mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  208.  
  209.             if g_new < g
  210.                 if C_2_flag == false
  211.                     alpha_i = alpha_i * C_1;
  212.                 end
  213.                 disp(["1", num2str(alpha_i)]);
  214.                 break
  215.             end
  216.  
  217.             alpha_i = alpha_i * C_2;
  218.             X_new = X;
  219.             disp(["2", num2str(alpha_i)]);
  220.             C_2_flag = true;
  221.         end
  222.  
  223.         % Вывод
  224.         disp(["X_new = ", mat2str(X_new)]);
  225.         disp(["U_i_new = ", mat2str(U_i_new)]);
  226.         disp(["g_new = ", num2str(g_new)]);
  227.  
  228.         % Пересчет вектора градиента
  229.         % t_1
  230.         % Точка 1.1. (X_new(1, 1) - delta_t, X_new(2, 1))
  231.         [g_recalc_grad_11, ~] = Help_Optimization_Fun( ...
  232.             U_i_new(1, 1), U_i_new(2, 1), ...
  233.             P, W, dt, t_vert,...
  234.             X_new(1, 1) - delta_t, X_new(2, 1), ...
  235.             mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  236.  
  237.         % Точка 1.2. (X_new(1, 1) + delta_t, X_new(2, 1))
  238.         [g_recalc_grad_12, ~] = Help_Optimization_Fun( ...
  239.             U_i_new(1, 1), U_i_new(2, 1), ...
  240.             P, W, dt, t_vert,...
  241.             X_new(1, 1) + delta_t, X_new(2, 1), ...
  242.             mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  243.  
  244.         % Точка 2.1. (X_new(1, 1), X_new(2, 1) - delta_t)
  245.         [g_recalc_grad_21, ~] = Help_Optimization_Fun( ...
  246.             U_i_new(1, 1), U_i_new(2, 1), ...
  247.             P, W, dt, t_vert,...
  248.             X_new(1, 1), X_new(2, 1) - delta_t, ...
  249.             mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  250.  
  251.         % Точка 2.2. (X_new(1, 1), X_new(2, 1) + delta_t)
  252.         [g_recalc_grad_22, ~] = Help_Optimization_Fun( ...
  253.             U_i_new(1, 1), U_i_new(2, 1), ...
  254.             P, W, dt, t_vert,...
  255.             X_new(1, 1), X_new(2, 1) + delta_t, ...
  256.             mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  257.  
  258.         % Считаем производные
  259.         g_recalc_t1 = Partial_Derivative(g_recalc_grad_11, g_recalc_grad_12, delta_t);
  260.         g_recalc_t2 = Partial_Derivative(g_recalc_grad_21, g_recalc_grad_22, delta_t);
  261.        
  262.         grad_g = [g_recalc_t1; g_recalc_t2];
  263.         disp(["grad_g = ", mat2str(grad_g)]);
  264.         disp(["abs(grad_g) = ", num2str(abs(sqrt(grad_g(1, 1)^2 + grad_g(2, 1)^2)))]);
  265.        
  266.         Iteration_Count = Iteration_Count + 1;
  267.  
  268.         disp(["Iteration_Count", num2str(Iteration_Count)]);
  269.     end
  270.  
  271.     % Вспомогательные функции
  272.     function [g, U_i] = Help_Optimization_Fun( ...
  273.         theta_dot, theta_2, ...
  274.         P, W, dt, t_vert,...
  275.         t_1, t_2, ...
  276.         mu_m, Rm, m_0, m_fuel_k, V_k, h_isl)
  277.  
  278.         U_i = Border_Task(theta_dot, theta_2, P, W, dt, t_vert,...
  279.             t_1, t_2, ...
  280.             mu_m, Rm, m_0, m_fuel_k, V_k, h_isl);
  281.  
  282.         [Coordinates, ~] = Integration(P, W, dt, t_vert, ...
  283.             t_1, t_2, ...
  284.             U_i(1, 1), U_i(2, 1), ...
  285.             mu_m, Rm, m_0, m_fuel_k, V_k);
  286.  
  287.         g = m_0 - Coordinates(end, 6);
  288.     end
  289.  
  290.     % Итерационная формула
  291.     function [X_new] = Iteration_Formula_LM(X_i, H_i, alpha_i, grad_g)
  292.         X_new = X_i - inv(H_i + alpha_i .* eye(2, 2)) * grad_g;
  293.     end
  294. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement