Advertisement
Stan_

MPC_with_multiple_shooting

Dec 16th, 2018
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 4.71 KB | None | 0 0
  1. function Example5
  2. % очистить command window, workspace, закрыть графику
  3. clc, clear all, close all
  4. import casadi.*
  5.  
  6. % Горизонт управления
  7. T = 1.5;
  8. mu = 0.5;
  9.  
  10. % Количество интервалов и период дискретизации
  11. delta = 0.1;
  12. N = T / delta;
  13.  
  14. % Переменные модели
  15. x = MX.sym('x', 2);
  16. u = MX.sym('u', 1);
  17.  
  18. % Стоимость этапа: L(x,u)
  19. L = (x(1)^2 + x(2)^2) / 2 + u^2;
  20.  
  21. % Динамика системы: правая часть ДУ
  22. xdot = [x(2) + u * (mu + (1 - mu) * x(1));
  23.         x(1) + u * (mu - 4 * (1 - mu) * x(2))];
  24. % Начальное состояние
  25. x0 = [0.8; 0.12];    
  26.  
  27. % Создаем интегратор с помощью CVODES из SUNDIALS Suite
  28. % использование: x(delta | 0, x0, u) = F('x0', x0, 'p', u)
  29. ode = struct('x', x, 'p', u, 'ode', xdot, 'quad', L);
  30. F = integrator('F', 'cvodes', ode, struct('tf', delta));
  31.  
  32. % Количество итераций алгоритма MPC
  33. iter = 30;
  34. % Конечная траектория, управление и значение критерия оптимальности
  35. x_final = [];
  36. u_final = [];
  37. J_final = 0;
  38. for i = 1:iter
  39. % Собираем переменные и ограничения задачи
  40. u = MX.sym('u',N,1);
  41. x = MX.sym('x',N,2);
  42. % Формирование вектора cons, который в структуре NLP будет входить в
  43. % условия g. Этот вектор должен равняться нулю, так как траектория x
  44. % непрерывна
  45. cons = vec(x(1,:))-x0;
  46. J   = 0;
  47. for k = 1:(N-1)
  48.     res = F('x0', x(k,:), 'p', u(k));    % x(delta | 0, s, u(k))
  49.     cons = [cons; vec(x(k+1,:)) - res.xf];
  50.     J   = J + res.qf;
  51. end
  52. res = F('x0', x(N,:), 'p', u(N));
  53. % Терминальное слагаемое
  54. E = 16.5926*(res.xf(1)^2+res.xf(2)^2)+2*11.5926*res.xf(1)*res.xf(2);
  55. % Создаем NLP-solver
  56. % Теперь переменные оптимизации - u и x. Также добавляются новые условия
  57. % непрерывности cons
  58. nlp = struct('x', [u; x(:)], 'f', J + E, 'g', [cons; E]);
  59. solver = nlpsol('solver', 'ipopt', nlp);
  60. % Решаем задачу нелинейного программирования
  61. tic
  62. sol = solver('x0', zeros(3*N,1),...
  63.     'lbx', [repmat(-2,N,1); repmat(-Inf,2*N,1)],...
  64.     'ubx', [repmat(2,N,1); repmat(+Inf,2*N,1)],...
  65.     'lbg', [zeros(2*N,1); -Inf],...
  66.     'ubg', [zeros(2*N,1); 0.7]);
  67. t_Elapsed = toc;
  68. opt = full(sol.x);
  69.  
  70. % Первая фаза оптимальной траектории сохраняется как очередная фаза
  71. % окончательной, затем формируется новое начальное условие в переменной x0,
  72. % обновляются окончательное управление, критерий оптимальности
  73. x_final = [x_final [opt(N+1);opt(2*N+1)]];
  74. x0 = [opt(N+2);opt(2*N+2)];
  75. u_final = [u_final opt(1)];
  76. res = F('x0', [opt(N+1) opt(2*N+1)], 'p', opt(1));
  77. J_final = J_final + res.qf;
  78. end
  79. % Вывод окончательных результатов
  80. results(delta*(0:iter-1),x_final,u_final(1:iter-1));
  81. % -----------------------------------------------------------------
  82. % Вывод результатов
  83. % -----------------------------------------------------------------
  84. function results(T,X,U)
  85.     fprintf('   k  |      u(k)        x(1)        x(2)     \n');
  86.     fprintf('----------------------------------------------\n');
  87.     for k = 1:length(T)-1
  88.         fprintf(' %3.1f  | %+11.6f %+11.6f %+11.6f \n', T(k), U(k),...
  89.             X(1,k), X(2,k));
  90.     end
  91.     fprintf('Термин.состояние  = %+11.6f %+11.6f \n\n', X(1,end),...
  92.         X(2,end));
  93.     % Тут происходит ошибка, типа не может преобразовать из casadi.MX в
  94.     % double, поэтому следующая строка закомментирована
  95.     %fprintf('Оптим. значение   = %6.4f \n\n', J_final);
  96.     fprintf('Время решения     = %6.4f \n\n', t_Elapsed);
  97.  
  98.     fig = figure(1);
  99.     set(fig,'Position', [50    100   1000   400]);
  100.  
  101.     subplot(1,2,1); hold on; grid on;    
  102.     plot(X(1,:),X(2,:),'-k', 'Linewidth', 1);
  103.     xlabel('x1')
  104.     ylabel('x2')
  105.     title('фазовый портрет')
  106.    
  107.     subplot(1,2,2); hold on; grid on;
  108.     stairs(T,[U nan],'-k', 'Linewidth', 1);
  109.     plot(T, X(1,:), '-', 'Linewidth', 1)
  110.     plot(T, X(2,:), '--', 'Linewidth', 1)
  111.     xlabel('t')
  112.     legend('Location', 'southwest')
  113.     legend('u','x1','x2')
  114.     title('оптимальное управление, траектория')
  115. end
  116.  
  117. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement