function [K_x T] = ppp_open2closed (A_u,A_c,k_x,x_0); ## usage: [K_x T] = ppp_open2closed (A_u,A_c,k_x,x_0); ## K_x is the open-loop matrix as in U = K_w W - K_x x ## Note that K_x is a column vector of matrices - one matrix per input. ## T is the transformation matrix: x = T*Ustar; A_c = T*A_u*T^-1; U = (k_x*T)' ## A_u: The control basis-function matrix ## Us0: The initial value of Ustar ## A_c: closed-loop system matrix ## k_x: closed-loop feedback gain ## x_0: initial state ## Copyright (C) 1999 by Peter J. Gawthrop ## $Id$ ## Check sizes n_o = is_square(A_u); n_c = is_square(A_c); if (n_o==0)||(n_c==0)||(n_o<>n_c) error("A_u and A_c must be square and of the same dimension"); endif [n_u,n_x] = size(k_x); ## Defaults if nargin<4 x_0 = zeros(n_c,1); endif ## Create U*(0) ##Us0 = ppp_ustar(A_u,n_u); Us0 = ones(1,n_o); ## Decompose A_u and Us0 into two bits: if n_o==n_c A_w = []; u_0 = Us0(1:n_c)'; # Assume same Us0 on each input else A_w = A_u(n_c+1:n_o, n_c+1:n_o) A_u = A_u(1:n_c, 1:n_c) U_w = Us0(1,n_c+1:n_o)' u_0 = Us0(1:n_c)' endif if !is_controllable(A_u,u_0) error("The pair [A_u, u_0] must be controllable"); endif ## Controllability matrices C_o = u_0; C_c = x_0; for i=1:n_c-1 C_o = [C_o A_u^i*u_0]; C_c = [C_c A_c^i*x_0]; endfor ## Transformation matrix: x = T*Ustar; A_c = T*A_u*T^-1; U = (k_x*T)' iC_o = C_o^-1; T = C_c*iC_o; K_x = []; for j = 1:n_u ## K_j matrix K_j = []; for i=1:n_c; ## Create T_i = dT/dx_i T_i = zeros(n_c,1); T_i(i) = 1; for k=1:n_c-1; A_k = A_c^k; T_i = [T_i A_k(:,i)]; endfor T_i = T_i*iC_o; kj = k_x(j,:); # jth row of k_x K_ji = kj*T_i; # ith row of K_j K_j = [K_j; K_ji]; endfor K_x = [K_x; K_j']; endfor endfunction