# function name = ppp_ex20 (ReturnName)
# ## usage: name = ppp_ex20 (ReturnName)
# ##
# ## PPP example -- a standard multivariable example
# ## $Id$
# ## Example name
# name = "Turbogenerator example: system TGEN from J.M Maciejowski: Multivariable Feedback Design";
# if nargin>0
# return
# endif
## System
[A,B,C,D] = airc;
[n_x,n_u,n_y] = abcddim(A,B,C,D)
## Controller
t = [9:0.1:10]; # Time horizon
A_w = zeros(n_y,1); # Setpoint
TC = 2*[1 1]; # Time constants for each input
# A_u = [];
# for tc=TC # Input
# A_u = [A_u;ppp_aug(laguerre_matrix(3,1/tc), 0)];
# endfor
A_u = ppp_aug(laguerre_matrix(5,1.0), 0);
Q = [1;1]; # Output weightings
## Constraints
Gamma = [];
gamma = [];
## Constraints - u
Tau_u = [0 0.1 0.5 1 1.5 2];
Tau_u = 0;
one = ones(size(Tau_u));
limit = 1.5;
Min_u = -limit*one;
Max_u = limit*one;
Order_u = 0*one;
## Constraints - y
Tau_y = [];
one = ones(size(Tau_y));
limit = 1.5;
Min_y = -limit*one;
Max_y = limit*one;
Order_y = 0*one;
## Simulation
W=[1;2;3];
x_0 = zeros(n_x,1);
## Constrained - open-loop
disp("Control design");
[k_x,k_w,K_x,K_w,Us0,J_uu,J_ux,J_uw] = ppp_lin (A,B,C,D,A_u,A_w,t); # Unconstrained design
[Gamma_u,gamma_u] = ppp_input_constraint (A_u,Tau_u,Min_u,Max_u);
Gamma = Gamma_u;
gamma = gamma_u;
disp("Open-loop simulations");
## Constrained OL simulation
[u,U] = ppp_qp (x_0,W,J_uu,J_ux,J_uw,Us0,Gamma,gamma);
T = [0:t(2)-t(1):t(length(t))];
[ys,us] = ppp_ystar (A,B,C,D,x_0,A_u,U,T);
## Unconstrained OL simulation
[uu,Uu] = ppp_qp (x_0,W,J_uu,J_ux,J_uw,Us0,[],[]);
[ysu,usu] = ppp_ystar (A,B,C,D,x_0,A_u,Uu,T);
title("Constrained and unconstrained y*");
xlabel("t");
grid;
plot(T,ys,T,ysu)
## Non-linear - closed-loop
disp("Closed-loop simulation");
[T1,y,u,J] = ppp_qp_sim (A,B,C,D,A_u,A_w,t,Q, \
Tau_u,Min_u,Max_u,Order_u, \
Tau_y,Min_y,Max_y,Order_y,W,x_0);
title("y,y*,u and u*");
xlabel("t");
grid;
plot(T1,y,T,ys,T1,u,T,us);
#endfunction