bloc2ss — block-diagram to state-space conversion
[sl]=bloc2ss(blocd)
Given a block-diagram representation of a linear system
bloc2ss
converts this representation to a state-space
linear system.
The first element of the list blocd
must be the string 'blocd'
.
Each other element of this list is itself a list of one
the following types :
list('transfer','name_of_linear_system')
list('link','name_of_link', [number_of_upstream_box,upstream_box_port], [downstream_box_1,downstream_box_1_portnumber], [downstream_box_2,downstream_box_2_portnumber], ...)
The strings 'transfer'
and 'links'
are keywords which
indicate the type of element in the block diagram.
Case 1 : the second parameter of the list is a character string which
may refer (for a possible further evaluation)
to the Scilab name of a linear system given
in state-space representation (syslin
list) or in transfer
form (matrix of rationals).
To each transfer block is associated an integer. To each input and output of a transfer block is also associated its number, an integer (see examples)
Case 2 : the second kind of element in a block-diagram representation
is a link.
A link links one output of a block represented by the pair
[number_of_upstream_box,upstream_box_port]
, to different
inputs of other blocks. Each such input is represented by
the pair [downstream_box_i,downstream_box_i_portnumber]
.
The different elements of a block-diagram can be defined in an arbitrary order.
For example
[1] S1*S2
with unit feedback.
There are 3 transfers S1
(number n_s1=2
) , S2
(number n_s2=3
)
and an adder (number n_add=4
) with symbolic transfer
function ['1','1']
.
There are 4 links. The first one (named 'U'
) links the input
(port 0 of fictitious block -1, omitted) to port 1 of the adder.
The second and third one link respectively (output)port 1
of the adder to (input)port 1 of system S1
, and
(output)port 1 of S1
to (input)port 1 of S2
.
The fourth link (named 'Y'
) links (output)port 1 of S2
to
the output (port 0 of fictitious block -1, omitted) and to
(input)port 2 of the adder.
//Initialization syst=list('blocd'); l=1; // //Systems l=l+1;n_s1=l;syst(l)=list('transfer','S1'); //System 1 l=l+1;n_s2=l;syst(l)=list('transfer','S2'); //System 2 l=l+1;n_adder=l;syst(l)=list('transfer',['1','1']); //adder // //Links // Inputs -1 --> input 1 l=l+1;syst(l)=list('link','U1',[-1],[n_adder,1]); // Internal l=l+1;syst(l)=list('link',' ',[n_adder,1],[n_s1,1]); l=l+1;syst(l)=list('link',' ',[n_s1,1],[n_s2,1]); // Outputs // -1 -> output 1 l=l+1;syst(l)=list('link','Y',[n_s2,1],[-1],[n_adder,2]);
With s=poly(0,'s');S1=1/(s+1);S2=1/s;
the result of the evaluation call
sl=bloc2ss(syst);
is a state-space representation for
1/(s^2+s-1)
.
[2] LFT example
//Initialization syst=list('blocd'); l=1; // //System (2x2 blocks plant) l=l+1;n_s=l;syst(l)=list('transfer',['P11','P12';'P21','P22']); // //Controller l=l+1;n_k=l;syst(l)=list('transfer','k'); // //Links l=l+1;syst(l)=list('link','w',[-1],[n_s,1]); l=l+1;syst(l)=list('link','z',[n_s,1],[-1]); l=l+1;syst(l)=list('link','u',[n_k,1],[n_s,2]); l=l+1;syst(l)=list('link','y',[n_s,2],[n_k,1]);
With
P=syslin('c',A,B,C,D); P11=P(1,1); P12=P(1,2); P21=P(2,1); P22=P(2,2); K=syslin('c',Ak,Bk,Ck,Dk);
bloc2exp(syst)
returns the evaluation the lft of P
and K
.