Index: mttroot/mtt/lib/control/PPP/ppp_lin_quad.m ================================================================== --- mttroot/mtt/lib/control/PPP/ppp_lin_quad.m +++ mttroot/mtt/lib/control/PPP/ppp_lin_quad.m @@ -1,7 +1,7 @@ function [k_x,k_w,K_x,K_w,Us0,J_uu,J_ux,J_uw,J_xx,J_xw,J_ww,A_u] = \ - ppp_lin_quad (A,B,C,D,tau,Q,R) + ppp_lin_quad (A,B,C,D,tau,Q,R,augment) ## usage:[k_x,k_w,K_x,K_w,Us0,J_uu,J_ux,J_uw,J_xx,J_xw,J_ww,A_u] = ## ppp_lin_quad (A,B,C,D,tau,Q,R) ## ## @@ -8,11 +8,16 @@ ## Steady-state Linear Quadratic solution ## using Algebraic Riccati equation (ARE) [P,A_u,A_w] = ppp_are (A,B,C,D,Q,R); + ## Augment with a constant term + if augment + A_u = ppp_aug(0,A_u); + endif + ## PPP solution [k_x,k_w,K_x,K_w,Us0,J_uu,J_ux,J_uw,J_xx,J_xw,J_ww] = \ ppp_lin(A,B,C,D,A_u,A_w,tau,Q,R,P); -A_u + endfunction Index: mttroot/mtt/lib/control/PPP/ppp_lin_run.m ================================================================== --- mttroot/mtt/lib/control/PPP/ppp_lin_run.m +++ mttroot/mtt/lib/control/PPP/ppp_lin_run.m @@ -56,10 +56,14 @@ endif if !struct_contains(p_c,"T") p_c.T = 10.0; # Last time point. endif + + if !struct_contains(p_c,"augment") + p_c.augment = 1; # Augment basis funs with contand + endif if !struct_contains(p_c,"Method") p_c.Method = "lq"; endif @@ -73,11 +77,14 @@ p_c.A_w = 0; endif if !struct_contains(p_c,"A_u") p_c.n_U = n_x; a_u = 2.0; - p_c.A_u = laguerre_matrix(p_c.n_U,a_u) + p_c.A_u = laguerre_matrix(p_c.n_U,a_u); + if p_c.augment # Put in constant term + A_u = ppp_aug(0,A_u); + endif endif else error(sprintf("Method %s not recognised", p_c.Method)); endif endif @@ -85,12 +92,12 @@ if !struct_contains(p_o,"x_0") p_o.x_0 = zeros(n_x,1); endif if !struct_contains(p_o,"method") - p_o.method = "continuous"; - ## p_o.method = "intermittent"; + ##p_o.method = "continuous"; + p_o.method = "intermittent"; endif ## Check w. [n_w,m_w] = size(w); @@ -116,14 +123,14 @@ I = ceil(p_c.T/p_c.delta_ol) # Number of large samples if strcmp(p_c.Method, "original") tau = [10:0.1:11]*(2/a_u); # Time horizons [k_x,k_w,K_x,K_w] = ppp_lin(A,B,C,D,p_c.A_u,p_c.A_w,tau); # Design elseif strcmp(p_c.Method, "lq") # LQ design - tau = [0:0.001:1.0]*5; # Time horizons + tau = [0:0.1:2.0]*1; # Time horizons [k_x,k_w,K_x,K_w,Us0,J_uu,J_ux,J_uw,J_xx,J_xw,J_ww,A_u] \ - = ppp_lin_quad (A,B,C,D,tau,p_c.Q,p_c.R); - p_c.A_u = A_u + = ppp_lin_quad (A,B,C,D,tau,p_c.Q,p_c.R,p_c.augment); + p_c.A_u = A_u; else error(sprintf("Control method %s not recognised", p_c.Method)); endif ##Sanity check A_u @@ -130,12 +137,11 @@ [p_c.n_U,M_u] = size(p_c.A_u); if (p_c.n_U!=M_u) error("A_u must be square"); endif - K_w,w - U = K_w*w # Initial control U + U = K_w*w; # Initial control U ## Checks [ol_zeros, ol_poles] = sys2zp(sys) cl_poles = eig(A - B*k_x) endif