#! /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$
###############################################################
# Inform user
echo Creating $1_smc.r -- NOTE this is for SISO systems only.
# 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 := MTTNu$
Reduce_Matrix()$
MTT_Matrix := MTTC_c$
MTT_Matrix_name := "MTTC_c"$
MTT_Matrix_n := MTTNy$
MTT_Matrix_m := MTTNx$
Reduce_Matrix()$
MTT_Matrix := MTTD_c$
MTT_Matrix_name := "MTTD_c"$
MTT_Matrix_n := MTTNy$
MTT_Matrix_m := MTTNu$
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