1
2
3
4
5
6
7
8
|
1
2
3
4
5
6
7
8
9
10
11
|
-
+
+
+
+
|
function [T,y,u,X,Iterations] = 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,Delta_ol,mu,movie)
function [T,y,u,X,Iterations] = 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,Delta_ol,mu,movie)
## usage: [T,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,movie)
## Needs documentation - see ppp_ex11 for example of use.
## OUTPUTS
## T: Time vector
## y,u,J output, input and cost
|
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
-
+
-
-
-
-
+
-
-
-
-
+
|
[n_x,n_u,n_y] = abcddim(A,B,C,D);
[n_x0,m_x0] = size(x_0);
if (n_x0 != n_x)||(m_x0 != 1)
error(sprintf("Initial state x_0 must be %ix1 not %ix%i",n_x,n_x0,m_x0));
endif
## Input constraints (assume same on all inputs)
## Input constraints
Gamma_u=[];
gamma_u=[];
for i=1:n_u
[Gamma_i,gamma_i] = ppp_input_constraint (A_u,Tau_u,Min_u,Max_u,Order_u,i,n_u);
[Gamma_u, gamma_u] = ppp_input_constraints(A_u,Tau_u,Min_u,Max_u);
Gamma_u = [Gamma_u; Gamma_i];
gamma_u = [gamma_u; gamma_i];
endfor
## Output constraints
[Gamma_y,gamma_y] = ppp_output_constraint (A,B,C,D,x_0,A_u,Tau_y,Min_y,Max_y,Order_y);
[Gamma_y,gamma_y] = ppp_output_constraints(A,B,C,D,x_0,A_u,Tau_y,Min_y,Max_y,Order_y);
## Composite constraints - t=0
Gamma = [Gamma_u; Gamma_y];
gamma = [gamma_u; gamma_y];
## Design the controller
## disp("Designing controller");
|
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
+
-
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
-
+
+
-
+
+
+
+
-
+
|
if Delta_ol>0 # Intermittent control
T_ol = 0:dt:Delta_ol; # Create the open-loop time vector
else
T_ol = [0,dt];
Delta_ol = dt;
endif
t_last = 2*t(length(t));
T_cl = 0:Delta_ol:t(length(t))-Delta_ol; # Closed-loop time vector
T_cl = 0:Delta_ol:t_last-Delta_ol; # Closed-loop time vector
T = 0:dt:t_last; # Overall time vector
## Lengths thereof
n_Tcl = length(T_cl);
n_ol = length(T_ol);
n_T = length(T);
## Expand W with constant last value or truncate
[n_W,m_W] = size(W);
if m_W>n_T
W = W(:,1:n_T);
else
W = [W W(:,m_W)*ones(1,n_T-m_W+1)];
endif
## Compute U*
Ustar_ol = ppp_ustar(A_u,n_u,T_ol); # U* in the open-loop interval
[n,m] = size(Ustar_ol);
n_U = m/length(T_ol); # Determine size of each Ustar
# ## Discrete-time system
# csys = ss2sys(A,B,C,D);
# dsys = c2d(csys,dt);
# [Ad, Bd] = sys2ss(dsys)
x = x_0; # Initialise state
## Initialise the saved variable arrays
X = [];
u = [];
Iterations = [];
du = [];
J = [];
tick= time;
i = 0;
## disp("Simulating ...");
for t=T_cl # Outer loop at Delta_ol
##disp(sprintf("Time %g", t));
## Output constraints
[Gamma_y,gamma_y] = ppp_output_constraint (A,B,C,D,x,A_u,Tau_y,Min_y,Max_y,Order_y);
[Gamma_y,gamma_y] = ppp_output_constraints (A,B,C,D,x,A_u,Tau_y,Min_y,Max_y,Order_y);
## Composite constraints
Gamma = [Gamma_u; Gamma_y];
gamma = [gamma_u; gamma_y];
## Current Setpoint value
w = W(:,floor(t/dt)+1);
## Compute U(t) via QP optimisation
[uu, U, iterations] = ppp_qp (x,W,J_uu,J_ux,J_uw,Us0,Gamma,gamma,mu); # Compute U
[uu, U, iterations] = ppp_qp (x,w,J_uu,J_ux,J_uw,Us0,Gamma,gamma,mu); # Compute U
## Compute the cost (not necessary but maybe interesting)
# [J_t] = ppp_cost (U,x,W,J_uu,J_ux,J_uw,J_xx,J_xw,J_ww); # cost
# J = [J J_t];
## OL Simulation (exact)
[ys,us,xs] = ppp_ystar (A,B,C,D,x,A_u,U,T_ol);
|