% Основная программа для решения краевой задачи варианта 14
% 1. Задание начального приближения
% Функция bvpinit задает сетку на отрезке [t0, tk] = [1, 3] из 100 точек
% и начальное приближение для вектора y = [x1, x2, psi1, psi2]
solinit = bvpinit(linspace(1, 3, 100), [0 0 0 0]);
% 2. Решение краевой задачи
% Вызов решателя bvp4c с передачей функций системы и краевых условий
sol = bvp4c(@fourode14, @res_fourode14, solinit);
% 3. Вычисление оптимального управления
% В массиве sol.y строки соответствуют переменным:
% 1 -> x1, 2 -> x2, 3 -> psi1, 4 -> psi2.
% Формула управления: u(t) = 0.5*psi_2 - psi_1 - 0.1
u_opt = 0.5*sol.y(4,:) - sol.y(3,:) - 0.1;
% 4. Построение графиков оптимальных траекторий
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)');
% 5. Построение графика оптимального управления
figure;
plot(sol.x, u_opt, '-k', 'LineWidth', 1.5);
grid on;
title('Оптимальное управляющее воздействие');
xlabel('t, с');
ylabel('u(t)');
% 6. Построение фазовой траектории
figure;
plot(sol.y(1,:), sol.y(2,:), '-g', 'LineWidth', 1.5);
grid on;
title('Оптимальная траектория в фазовой плоскости');
xlabel('x_1');
ylabel('x_2');
% ================= Локальные функции =================
% Функция системы дифференциальных уравнений 1-го порядка (по примеру[cite: 2])
function dydt = fourode14(t, y)
% y(1) - x1, y(2) - x2, y(3) - psi1, y(4) - psi2
dydt = zeros(4,1);
dydt(1) = -17*y(1) - 50*y(2) + 2*y(3) - y(4) + 0.2;
dydt(2) = 3*y(1) + 8*y(2) - y(3) + 0.5*y(4) - 0.1;
dydt(3) = 0.6*y(1) + 17*y(3) - 3*y(4);
dydt(4) = 2.4*y(2) + 50*y(3) - 8*y(4);
end
% Функция задания граничных условий (по примеру[cite: 2])
function res = res_fourode14(ya, yb)
% ya - значения переменных в начальный момент времени t0 = 1
% yb - значения переменных в конечный момент времени tk = 3
% Условия: x1(1)=0, x2(1)=2, x1(3)=-2, x2(3)=1
res = [ ya(1) - 0; % x1(1) = 0
ya(2) - 2; % x2(1) = 2
yb(1) - (-2); % x1(3) = -2 (переносим: yb(1) + 2 = 0)
yb(2) - 1 ]; % x2(3) = 1
end