Загрузка данных


% Основная программа для решения краевой задачи варианта 12
% Задание начального приближения на отрезке [t0, tk] = [0, 5] из 100 точек
solinit = bvpinit(linspace(0, 5, 100), [0 0 0 0]); 

% Решение краевой задачи
sol = bvp4c(@fourode12, @res_fourode12, solinit);

% Вычисление оптимального управления: u(t) = 0.5*psi_2 - 0.1
u_opt = 0.5*sol.y(4,:) - 0.1;

% Построение графика переменных состояния
figure;
plot(sol.x, sol.y(1,:), '-b', 'LineWidth', 1.5);
hold on;
plot(sol.x, sol.y(2,:), '-r', 'LineWidth', 1.5);
grid on;
title('Оптимальная траектория переменных состояния');
xlabel('t, с');
ylabel('x_1(t), x_2(t)');
legend('x_1(t)', 'x_2(t)');

% Построение графика оптимального управления
figure;
plot(sol.x, u_opt, '-k', 'LineWidth', 1.5);
grid on;
title('Оптимальное управляющее воздействие');
xlabel('t, с');
ylabel('u(t)');

% Построение фазовой траектории
figure;
plot(sol.y(1,:), sol.y(2,:), '-g', 'LineWidth', 1.5);
grid on;
title('Оптимальная траектория в фазовой плоскости');
xlabel('x_1');
ylabel('x_2');




function dydt = fourode12(t, y)
    % y(1) - x1, y(2) - x2, y(3) - psi1, y(4) - psi2
    dydt = zeros(4,1); 
    
    dydt(1) = -11*y(1) - 30*y(2);
    dydt(2) = 4*y(1)  + 9*y(2)  + 0.5*y(4) - 0.1;
    dydt(3) = 3*y(1)  + 11*y(3) - 4*y(4);
    dydt(4) = 2*y(2)  + 30*y(3) - 9*y(4);
end





function res = res_fourode12(ya, yb)
    % ya - значения в t0 = 0, yb - значения в tk = 5
    % Условия: x1(0)=0, x2(0)=3, x1(5)=-3, x2(5)=0
    res = [ ya(1) - 0;      % x1(0) = 0
            ya(2) - 3;      % x2(0) = 3
            yb(1) + 3;      % x1(5) = -3 (переносим: yb(1) + 3 = 0)
            yb(2) - 0 ];    % x2(5) = 0
end