SQLITE_NOTICE(283): recovered 5 frames from WAL file /data/mtt.fossil-wal
File mttroot/mtt/bin/trans/sm2smc_r artifact 78545ed4d4 part of check-in f660139eb3
#! /bin/sh ###################################### ##### Model Transformation Tools ##### ###################################### # Bourne shell script: sm2smc_r # state matrices to controller canonical form + related matrices # P.J.Gawthrop 12 Jan 1997 # Copyright (c) P.J.Gawthrop 1997 ############################################################### ## Version control history ############################################################### ## $Id$ ## $Log$ ## Revision 1.1 1998/01/22 13:17:37 peterg ## Initial revision ## ############################################################### Nu=`mtt_getsize $1 u` Ny=`mtt_getsize $1 y` if [ "$Nu" = "1" ]; then if [ "$Ny" = "1" ]; then blurb=' for this siso system' else blurb=" using first output of $Ny" fi else if [ "$Ny" = "1" ]; then blurb=" using first input of $Nu" else blurb=" using first input of $Nu and using first output of $Ny" fi fi # Inform user echo Creating $1_smc.r $blurb # Remove the old log file rm -f sm2smc_r.log # Use reduce to accomplish the transformation reduce >sm2smc_r.log << EOF in "$1_def.r"; in "$1_sm.r"; in "$1_tf.r"; %Read the formatting function in "$MTTPATH/trans/reduce_matrix.r"; OFF Echo; OFF Nat; % Find the controllability matrix MATRIX MTTCon(MTTNx,MTTNX); MTTAB := MTTB; FOR j := 1:MTTNx DO BEGIN FOR i := 1:MTTNx DO MTTCon(i,j) := MTTAB(i,1); MTTAB := MTTA*MTTAB; END; %Canonical forms: % This statement makes Gs a scalar transfer function Gs := MTTtf(1,1); % Numerator and denominator polynomials bs := num(gs); as := den(gs); % extract coeficients and divide by coeff of s^n % reverse operator puts list with highest oder coeffs first ai := reverse(coeff(as,s)); a0 := first(ai); MTTn := length(ai) - 1; % Normalised coeficients; ai := reverse(coeff(as/a0,s)); bi := reverse(coeff(bs/a0,s)); MTTm := length(bi)-1; % Zap the (unity) first element of ai list; ai := rest(ai); % System in controller form % MTTA_c matrix matrix MTTA_c(MTTn,MTTn); % First row is ai coefficients for i := 1:MTTn do MTTA_c(1,i) := -part(ai,i); % (MTTn-1)x(MTTn-1) unit matrix in lower left-land corner (if n>1) if MTTn>1 then for i := 1:MTTn-1 do MTTA_c(i+1,i) := 1; % B_c vector; matrix MTTB_c(MTTn,1); MTTB_c(1,1) := 1; % C_c vector; matrix MTTC_c(1,MTTn); for i := 1:MTTm+1 do MTTC_c(1,i+MTTn-MTTm-1) := part(bi,i); % D_c MTTD_c := MTTD; %Controllability matrix of controllable form MATRIX MTTCon_c(MTTNx,MTTNX); MTTAB := MTTB_c; FOR j := 1:MTTNx DO BEGIN FOR i := 1:MTTNx DO MTTCon_c(i,j) := MTTAB(i,1); MTTAB := MTTA_c*MTTAB; END; % Transformation matrix; MTTT_c := MTTCon_c*MTTCon^(-1); %Create the output file OUT "$1_smc.r"; %Write out the matrices. % Controllable form write "% - Controller form"; MTT_Matrix := MTTA_c$ MTT_Matrix_name := "MTTA_c"$ MTT_Matrix_n := MTTNx$ MTT_Matrix_m := MTTNx$ Reduce_Matrix()$ MTT_Matrix := MTTB_c$ MTT_Matrix_name := "MTTB_c"$ MTT_Matrix_n := MTTNx$ MTT_Matrix_m := 1$ Reduce_Matrix()$ MTT_Matrix := MTTC_c$ MTT_Matrix_name := "MTTC_c"$ MTT_Matrix_n := 1$ MTT_Matrix_m := MTTNx$ Reduce_Matrix()$ MTT_Matrix := MTTD_c$ MTT_Matrix_name := "MTTD_c"$ MTT_Matrix_n := 1$ MTT_Matrix_m := 1$ Reduce_Matrix()$ write "% - Controllability matrix"; MTT_Matrix := MTTCon$ MTT_Matrix_name := "MTTCon"$ MTT_Matrix_n := MTTNx$ MTT_Matrix_m := MTTNx$ Reduce_Matrix()$ write "% -Controllability matrix - controller form"; MTT_Matrix := MTTCon_c$ MTT_Matrix_name := "MTTCon_c"$ MTT_Matrix_n := MTTNx$ MTT_Matrix_m := MTTNx$ Reduce_Matrix()$ write "% - Transformation matrix - controller form"; MTT_Matrix := MTTT_c$ MTT_Matrix_name := "MTTT_c"$ MTT_Matrix_n := MTTNx$ MTT_Matrix_m := MTTNx$ Reduce_Matrix()$ write "END;"; SHUT "$1_smc.r"; quit; EOF # Now invoke the standard error handling. mtt_error_r sm2smc_r.log