The Octave Control Systems Toolbox (OCST) was initially developed by Dr. A. Scottedward Hodel a.s.hodel@eng.auburn.edu with the assistance of his students
This development was supported in part by NASA's Marshall Space Flight
Center as part of an in-house CACSD environment. Additional important
contributions were made by Dr. Kai Mueller mueller@ifr.ing.tu-bs.de
and Jose Daniel Munoz Frias (place.m
).
An on-line menu-driven tutorial is available via section OCST demo program; beginning OCST users should start with this program.
octave:1> DEMOcontrol O C T A V E C O N T R O L S Y S T E M S T O O L B O X Octave Controls System Toolbox Demo [ 1] System representation [ 2] Block diagram manipulations [ 3] Frequency response functions [ 4] State space analysis functions [ 5] Root locus functions [ 6] LQG/H2/Hinfinity functions [ 7] End
Command examples are interactively run for users to observe the use of OCST functions.
The OCST stores all dynamic systems in a single data structure format that can represent continuous systems, discrete-systems, and mixed (hybrid) systems in state-space form, and can also represent purely continuous/discrete systems in either transfer function or pole-zero form. In order to provide more flexibility in treatment of discrete/hybrid systems, the OCST also keeps a record of which system outputs are sampled.
Octave structures are accessed with a syntax much like that used by the C programming language. For consistency in use of the data structure used in the OCST, it is recommended that the system structure access m-files be used (See section System Construction and Interface Functions). Some elements of the data structure are absent depending on the internal system representation(s) used. More than one system representation can be used for SISO systems; the OCST m-files ensure that all representations used are consistent with one another.
The data structure elements (and variable types) common to all system
representations are listed below; examples of the initialization
and use of the system data structures are given in subsequent sections and
in the online demo DEMOcontrol
.
tf2sys
or fir2sys
)
=1 for zp form (initialized with zp2sys
)
=2 for ss form (initialized with ss2sys
)
sysupdate
command.
The remaining variables of the system data structure are only present
if the corresponding entry of the sys
vector is true (=1).
tf
format variableszp
format variablesss
format variablesbode
, hinfsyn
)
will not accept systems with both discrete and continuous states/outputs
Construction and manipulations of the OCST system data structure (See section System Data Structure) requires attention to many details in order to ensure that data structure contents remain consistent. Users are strongly encouraged to use the system interface functions in this section. Functions for the formatted display in of system data structures are given in section System display functions.
Inputs:
Outputs sys (system data structure)
Example
octave:1> sys = fir2sys([1 -1 2 4],0.342,"A/D input","filter output"); octave:2> sysout(sys) Input(s) 1: A/D input Output(s): 1: filter output (discrete) Sampling interval: 0.342 transfer function form: 1*z^3 - 1*z^2 + 2*z^1 + 4 ------------------------- 1*z^3 + 0*z^2 + 0*z^1 + 0
Extract FIR data from system data structure; see section Finite impulse response system interface functions for parameter descriptions.
Inputs
rows
(a)}, @math{nz = 0}
rows
(a)}
see below for system partitioning
x_n
for continuous states,
xd_n
for discrete states
u_n
y_n
rows
(c)}
sys2ss
returns a vector yd where
yd(outlist) = 1; all other entries of yd are 0.
Outputs outsys = system data structure
System partitioning
Suppose for simplicity that outlist specified that the first several outputs were continuous and the remaining outputs were discrete. Then the system is partitioned as
x = [ xc ] (n x 1) [ xd ] (nz x 1 discrete states) a = [ acc acd ] b = [ bc ] [ adc add ] [ bd ] c = [ ccc ccd ] d = [ dc ] [ cdc cdd ] [ dd ] (cdc = c(outlist,1:n), etc.)
with dynamic equations: @math{ d/dt xc(t) = acc*xc(t) + acd*xd(k*tsam) + bc*u(t)}
@math{ xd((k+1)*tsam) = adc*xc(k*tsam) + add*xd(k*tsam) + bd*u(k*tsam)}
@math{ yc(t) = ccc*xc(t) + ccd*xd(k*tsam) + dc*u(t)}
@math{ yd(k*tsam) = cdc*xc(k*tsam) + cdd*xd(k*tsam) + dd*u(k*tsam)}
Signal partitions
| continuous | discrete | ---------------------------------------------------- states | stname(1:n,:) | stname((n+1):(n+nz),:) | ---------------------------------------------------- outputs | outname(cout,:) | outname(outlist,:) | ----------------------------------------------------
where @math{cout} is the list of in 1:rows
(p)
that are not contained in outlist. (Discrete/continuous outputs
may be entered in any order desired by the user.)
Example
octave:1> a = [1 2 3; 4 5 6; 7 8 10]; octave:2> b = [0 0 ; 0 1 ; 1 0]; octave:3> c = eye(3); octave:4> sys = ss2sys(a,b,c,[],0,3,0,list("volts","amps","joules")); octave:5> sysout(sys); Input(s) 1: u_1 2: u_2 Output(s): 1: y_1 2: y_2 3: y_3 state-space form: 3 continuous states, 0 discrete states State(s): 1: volts 2: amps 3: joules A matrix: 3 x 3 1 2 3 4 5 6 7 8 10 B matrix: 3 x 2 0 0 0 1 1 0 C matrix: 3 x 3 1 0 0 0 1 0 0 0 1 D matrix: 3 x 3 0 0 0 0 0 0
Notice that the D matrix is constructed by default to the correct dimensions. Default input and output signals names were assigned since none were given.
Inputs sys system data structure (See section System Data Structure)
Outputs
Example
octave:1> sys=tf2sys([1 2],[3 4 5]); octave:2> [a,b,c,d] = sys2ss(sys) a = 0.00000 1.00000 -1.66667 -1.33333 b = 0 1 c = 0.66667 0.33333 d = 0
Inputs
Outputs sys = system data structure
Example
octave:1> sys=tf2sys([2 1],[1 2 1],0.1); octave:2> sysout(sys) Input(s) 1: u_1 Output(s): 1: y_1 (discrete) Sampling interval: 0.1 transfer function form: 2*z^1 + 1 ----------------- 1*z^2 + 2*z^1 + 1
See section Transfer function system interface functions for parameter descriptions.
Example
octave:1> sys=ss2sys([1 -2; -1.1,-2.1],[0;1],[1 1]); octave:2> [num,den] = sys2tf(sys) num = 1.0000 -3.0000 den = 1.0000 1.1000 -4.3000
Inputs
Outputs sys: system data structure
Example
octave:1> sys=zp2sys([1 -1],[-2 -2 0],1); octave:2> sysout(sys) Input(s) 1: u_1 Output(s): 1: y_1 zero-pole form: 1 (s - 1) (s + 1) ----------------- s (s + 2) (s + 2)
See section Zero-pole system interface functions for parameter descriptions.
Example
octave:1> sys=ss2sys([1 -2; -1.1,-2.1],[0;1],[1 1]); octave:2> [zer,pol,k] = sys2zp(sys) zer = 3.0000 pol = -2.6953 1.5953 k = 1
syssetsignals
Inputs
"all"
"cst"
"dst"
"in"
"out"
Outputs
Inputs
"in"
"out"
"st"
"yd"
0
1
Outputs
sigid="in"
sigid="out"
sigid="st"
sigid="yd"
"in"
,
"out"
, or "st"
), or else the logical flag
indicating whether output(s) signum is(are) discrete (sigval=1)
or continuous (sigval=0).
Examples (From sysrepdemo
)
octave> sys=ss2sys(rand(4),rand(4,2),rand(3,4)); octave> [Ast,Ain,Aout,Ayd] = sysgetsignals(sys) i # get all signal names Ast = ( [1] = x_1 [2] = x_2 [3] = x_3 [4] = x_4 ) Ain = ( [1] = u_1 [2] = u_2 ) Aout = ( [1] = y_1 [2] = y_2 [3] = y_3 ) Ayd = 0 0 0 octave> Ain = sysgetsignals(sys,"in") # get only input signal names Ain = ( [1] = u_1 [2] = u_2 ) octave> Aout = sysgetsignals(sys,"out",2) # get name of output 2 (in list) Aout = ( [1] = y_2 ) octave> Aout = sysgetsignals(sys,"out",2,1) # get name of output 2 (as string) Aout = y_2
Inputs sys: system data structure
Outputs
systype: string indicating how the structure was initially
constructed:
values: "ss"
, "zp"
, or "tf"
Note FIR initialized systems return systype="tf"
.
"out"
"in"
"st"
"yd"
opt = "out", "in", or "st"
opt = "yd"
Outputs retsys=sys with appropriate signal names changed (or yd values, where appropriate)
Example
octave:1> sys=ss2sys([1 2; 3 4],[5;6],[7 8]); octave:2> sys = syssetsignals(sys,"st",str2mat("Posx","Velx")); octave:3> sysout(sys) Input(s) 1: u_1 Output(s): 1: y_1 state-space form: 2 continuous states, 0 discrete states State(s): 1: Posx 2: Velx A matrix: 2 x 2 1 2 3 4 B matrix: 2 x 1 5 6 C matrix: 1 x 2 7 8 D matrix: 1 x 1 0
Inputs
"tf"
"zp"
"ss"
"all"
Outputs retsys: contains union of data in sys and requested data. If requested data in sys is already up to date then retsys=sys.
Conversion to tf
or zp
exits with an error if the system is
mixed continuous/digital.
used internally, minimal argument checking
Example ioname = sysdefioname(5,"u",3)
returns the list:
ioname = ( [1] = u_3 [2] = u_4 [3] = u_5 )
used internally, minimal argument checking
[]
"ss"
"tf"
"zp"
"all"
c(x) = c(1) * x^n + ... + c(n) x + c(n+1)
to string y or to the screen (if y is omitted)
x defaults to the string "s"
"s"
"s"
Inputs
1:rows(lmat)
Outputs prints the list to the screen, numbering each string in order.
See section System Analysis-Time Domain
Unless otherwise noted, all parameters (input,output) are system data structures.
Contributed by Kai Mueller.
Form an arbitrary complex (open or closed loop) system in
state-space form from several systems. "buildssic
" can
easily (despite it's cryptic syntax) integrate transfer functions
from a complex block diagram into a single system with one call.
This function is especially useful for building open loop
interconnections for H_infinity and H2 designs or for closing
loops with these controllers.
Although this function is general purpose, the use of "sysgroup
"
"sysmult
", "sysconnect
" and the like is recommended for standard
operations since they can handle mixed discrete and continuous
systems and also the names of inputs, outputs, and states.
The parameters consist of 4 lists that describe the connections
outputs and inputs and up to 8 systems s1-s8.
Format of the lists:
[1 2 -1; 2 1 0]
==> new input 1 is old inpout 1
+ output 2 - output 1, new input 2 is old input 2
+ output 1. The order of rows is arbitrary.
Example: Very simple closed loop system.
w e +-----+ u +-----+ --->o--*-->| K |--*-->| G |--*---> y ^ | +-----+ | +-----+ | - | | | | | | +----------------> u | | | | +-------------------------|---> e | | +----------------------------+
The closed loop system GW can be optained by
GW = buildssic([1 2; 2 -1], [2], [1 2 3], [2], G, K);
Here is a real example:
+----+ -------------------->| W1 |---> v1 z | +----+ ----|-------------+ || GW || => min. | | vz infty | +---+ v +----+ *--->| G |--->O--*-->| W2 |---> v2 | +---+ | +----+ | | | v u y
The closed loop system GW from [z; u]' to [v1; v2; y]' can be obtained by (all SISO systems):
GW = buildssic([1 4;2 4;3 1],[3],[2 3 5],[3 4],G,W1,W2,One);
where "One" is a unity gain (auxillary) function with order 0.
(e.g. One = ugain(1);
)
see also: ord2
Contributed by Kai Mueller
Outputs outsys system data structure has representation with @math{w = 2 * pi * nfreq}:
/ \ | / -2w*damp -w \ / w \ | G = | | |, | |, [ 0 gain ], 0 | | \ w 0 / \ 0 / | \ /
See also jet707
(MIMO example, Boeing 707-321 aircraft model)
____________________ | ________ | u ----->|----> | Asys |--->|----> y1 | | -------- | | | ________ | |--->|----> | Bsys |--->|----> y2 | -------- | -------------------- Ksys
________ ----| Gsys |--- u | ---------- +| ----- (_)----> y | ________ +| ----| Hsys |--- --------
Inputs
Outputs sys
sys.b := [sys.b , b] sys.c := [sys.c ] [ c ] sys.d := [sys.d | D12 ] [D21 | D22 ]
where D12, D21, and D22 are the appropriate dimensioned blocks of the input parameter d.
zeros(1,rows(c))
ones(1,rows(c))
Inputs
0
1
Outputs sys: resulting closed loop system.
Method
sysconnect
internally permutes selected inputs, outputs as shown
below, closes the loop, and then permutes inputs and outputs back to their
original order
____________________ u_1 ----->| |----> y_1 | sys | old u_2 | | u_2* ---->(+)--->| |----->y_2 (in_idx) ^ -------------------| | (out_idx) | | -------------------------------
The input that has the summing junction added to it has an * added to the end of the input name.
Inputs sys is a system data structure
Outputs
Inputs sys is a system data structure.
Outputs
Inputs sys = system data structure
Outputs
Inputs
Outputs
retsys: resulting closed loop system:
duplicated i/o names are appended with a "+"
suffix.
Method
sysdup
creates copies of selected inputs and outputs as
shown below. u1/y1 is the set of original inputs/outputs, and
u2,y2 is the set of duplicated inputs/outputs in the order specified
in in_idx, out_idx, respectively
____________________ u1 ----->| |----> y1 | Asys | u2 ------>| |----->y2 (in_idx) -------------------| (out_idx)
Inputs Asys, Bsys: system data structures
Outputs @math{sys = block diag(Asys,Bsys)}
__________________ | ________ | u1 ----->|--> | Asys |--->|----> y1 | -------- | | ________ | u2 ----->|--> | Bsys |--->|----> y2 | -------- | ------------------ Ksys
The function also rearranges the internal state-space realization of sys so that the continuous states come first and the discrete states come last. If there are duplicate names, the second name has a unique suffix appended on to the end of the name.
u ---------- ---------- --->| Bsys |---->| Asys |---> ---------- ----------
A warning occurs if there is direct feed-through from an input of Bsys or a continuous state of Bsys through a discrete output of Bsys to a continuous state or output in Asys (system data structure does not recognize discrete inputs).
Inputs
Outputs retsys: resulting system
____________________ u1 ------->| |----> y1 (in_idx) | Asys | (out_idx) u2 ------->| |----| y2 (deleted)-------------------- (deleted)
Inputs
vlen=vector length, list= a subset of [1:vlen]
,
Outputs
pv: a permutation vector to order elements of [1:vlen]
in
list
to the end of a vector.
Used internally by sysconnect
to permute vector elements to their
desired locations.
Inputs sys: structured system outscale, inscale: constant matrices of appropriate dimension
Outputs sys: resulting open loop system:
----------- ------- ----------- u --->| inscale |--->| sys |--->| outscale |---> y ----------- ------- -----------
If the input names and output names (each a list of strings) are not given and the scaling matrices are not square, then default names will be given to the inputs and/or outputs.
A warning message is printed if outscale attempts to add continuous system outputs to discrete system outputs; otherwise yd is set appropriately in the returned value of sys.
Method: Gsys and Hsys are connected in parallel The input vector is connected to both systems; the outputs are subtracted. Returned system names are those of Gsys.
________ ----| Gsys |--- u | ---------- +| ----- (_)----> y | ________ -| ----| Hsys |--- --------
See also: hinfdemo (MIMO H_infinty example, Boeing 707-321 aircraft model)
Weighting function are needed by the H2/H_infinity design procedure. These function are part of thye augmented plant P (see hinfdemo for an applicattion example).
vl = Gain @ low frequencies
vh = Gain @ high frequencies
fc = Corner frequency (in Hz, *not* in rad/sec)
a' * x + x * a - x * b * x + c = 0
Inputs for identically dimensioned square matrices
"B"
):
String option passed to balance
prior to ordered Schur decomposition.
Outputs x: solution of the ARE.
Method Laub's Schur method (IEEE Transactions on Automatic Control, 1979) is applied to the appropriate Hamiltonian matrix.
Return the solution, x of the discrete-time algebraic Riccati equation
a' x a - x + a' x b (r + b' x b)^(-1) b' x a + c = 0
Inputs
"B"
):
String option passed to balance
prior to ordered QZ decomposition.
Outputs x solution of DARE.
Method Generalized eigenvalue approach (Van Dooren; SIAM J. Sci. Stat. Comput., Vol 2) applied to the appropriate symplectic pencil.
See also: Ran and Rodman, "Stable Hermitian Solutions of Discrete Algebraic Riccati Equations," Mathematics of Control, Signals and Systems, Vol 5, no 2 (1992) pp 165-194.
x(k+1) = a x(k) + b u(k)
Inputs
Outputs m (n by n) satisfies
a m a' - m + b*b' = 0
Inputs @table @var @item a n by n matrix @item b Matrix: n by n, n by m, or p by n. @end table
Outputs
x: matrix satisfying appropriate discrete time Lyapunov equation.
Options:
@itemize @bullet
@item b is square: solve a x a' - x + b = 0
@item b is not square: x satisfies either
@example
a x a' - x + b b' = 0
@end example
or
@example
a' x a - x + b' b = 0,
@end example
whichever is appropriate.
@end itemize
Method
Uses Schur decomposition method as in Kitagawa,
An Algorithm for Solving the Matrix Equation X =
FXF' + S,
International Journal of Control, Volume 25, Number 5, pages 745--753
(1977).
Column-by-column solution method as suggested in Hammarling, Numerical Solution of the Stable, Non-Negative Definite Lyapunov Equation, IMA Journal of Numerical Analysis, Volume 2, pages 303--323 (1982).
m satisfies @math{ a m + m a' + b b' = 0 }.
If a, b, and c are specified, then lyap
returns
the solution of the Sylvester equation
@iftex
@tex
$$ A X + X B + C = 0 $$
@end tex
@end iftex
@ifinfo
@example
a x + x b + c = 0
@end example
@end ifinfo
If only (a, b)
are specified, then lyap
returns the
solution of the Lyapunov equation
@iftex
@tex
$$ A^T X + X A + B = 0 $$
@end tex
@end iftex
@ifinfo
@example
a' x + x a + b = 0
@end example
@end ifinfo
If b is not square, then lyap
returns the solution of either
@iftex
@tex
$$ A^T X + X A + B^T B = 0 $$
@end tex
@end iftex
@ifinfo
@example
a' x + x a + b' b = 0
@end example
@end ifinfo
or
@iftex
@tex
$$ A X + X A^T + B B^T = 0 $$
@end tex
@end iftex
@ifinfo
@example
a x + x a' + b b' = 0
@end example
@end ifinfo
whichever is appropriate.
(A - lambda B).
A and B must be real matrices.
Note qzval
is obsolete; use qz
instead.
tzero
.
Minimal argument checking performed.
Details involving major subroutines:
zgpbal
zgpbal
computes a state/input/output
weighting that attempts to
reduced the range of the magnitudes of the nonzero elements of [a,b,c,d]
The weighting uses scalar multiplication by powers of 2, so no roundoff
will occur.
zgpbal
should be followed by zgpred
zgreduce
zgrownorm
zgscal
zgepbal
zgsgiv
zgshsr
e^(m)
(all ones) to
(column vector) y. Called by zgfslv
.
References:
dx/dt = a x + b u y = c x + d u
or a similar discrete-time system.
If the matrices are compatibly dimensioned, then abcddim
returns
Otherwise abcddim
returns n = m = p = -1.
Note: n = 0 (pure gain block) is returned without warning.
See also: is_abcd
Used internally in abcddim
. If x is a zero-size matrix,
both dimensions are set to 0 in y.
my and ny are the row and column dimensions of the result.
2 n-1 Qs = [ B AB A B ... A B ]
of a system data structure or the pair (A, B).
Note ctrb
forms the controllability matrix.
The numerical properties of is_controllable
are much better for controllability tests.
Reference: Doyle, Glover, Khargonekar, Francis, "State Space Solutions to Standard H2 and Hinf Control Problems", IEEE TAC August 1989
Inputs
Outputs
References: Doyle, Glover, Khargonekar, Francis, "State space solutions to standard H2 and Hinf control problems", IEEE TAC August 1989 Iglesias and Glover, "State-Space approach to discrete-time Hinf control," Int. J. Control, vol 54, #5, 1991 Zhou, Doyle, Glover, "Robust and Optimal Control," Prentice-Hall, 1996 $Revision: 1.9 $
| C | | CA | Qb = | CA^2 | | ... | | CA^(n-1) |
of a system data structure or the pair (A, C).
Note: obsv()
forms the observability matrix.
The numerical properties of is_observable() are much better for observability tests.
Outputs if omitted, the poles and zeros are plotted on the screen. otherwise, pol, zer are returned as the system poles and zeros. (see sys2zp for a preferable function call)
Inputs
10*eps
Outputs
Method Controllability is determined by applying Arnoldi iteration with complete re-orthogonalization to obtain an orthogonal basis of the Krylov subspace
span ([b,a*b,...,a^{n-1}*b]).
The Arnoldi iteration is executed with krylov
if the system has a single input; otherwise a block Arnoldi iteration is performed with krylovb
.
See also
is_observable
, is_stabilizable
, is_detectable
,
krylov
, krylovb
Returns 1 if the system a or the pair (a,c)is detectable, 0 if not.
See is_stabilizable
for detailed description of arguments and
computational method.
[dx/dt] = [A | Bw Bu ][w] [ z ] [Cz | Dzw Dzu ][u] [ y ] [Cy | Dyw Dyu ]
or similar discrete-time system. If necessary, orthogonal transformations Qw, Qz and nonsingular transformations Ru, Ry are applied to respective vectors w, z, u, y in order to satisfy DGKF assumptions. Loop shifting is used if Dyu block is nonzero.
Inputs
Outputs
is_dgkf
results. Entries:
is_dgkf
exits with an error if the system is mixed discrete/continuous
References
is_controllable
for detailed description of arguments
and default values.
is_controllable
for description of inputs, outputs.
Test for stabilizability is performed via an ordered Schur decomposition
that reveals the unstable subspace of the system A matrix.
dflg != 0
dflg == 0
Inputs
"ex"
"bi"
2(z-1) s = ----- T(z+1)FIXME: This option exits with an error if sys is not purely continuous. (The
ex
option can handle mixed systems.)
c2d
assumes that
the 2nd argument is T and performs appropriate argument checks.
Outputs dsys discrete time equivalent via zero-order hold, sample each T sec.
converts the system data structure describing
. x = Ac x + Bc u
into a discrete time equivalent model
x[n+1] = Ad x[n] + Bd u[n]
via the matrix exponential or bilinear transform
Note This function adds the suffix _d
to the names of the new discrete states.
sysgettsam(sys)
Inputs
"log"
option (see below)
"log"
d2c
(sys,tol), tol=positive scalar,
the "log"
option is used. The default value for tol is
1e-8
.
"bi"
sysgettsam
).
FIXME: bilinear option exits with an error if sys is not purely discrete
Outputs csys continuous time system (same dimensions and signal names as in sys).
sysgettsam(sys)
.
Inputs
dmr2d
exits with an error if sys is not discrete
sysgettsam(sys)
(may be empty)
sysgettsam(sys)
(may be empty)
sysgettsam(sys)
Outputs
WARNING Not thoroughly tested yet; especially when cuflg == 0.
See also: eig
impulse
produces a plot or the step response data for system sys.
Inputs
Outputs y, t: impulse response
impulse
.
impulse
, step
.
Demonstration/tutorial script
Inputs
exp
(jwT)), where
sysgettsam(sys)
(the system sampling time) and
exp
(jwT)}=1) and select the frequency
range based on the breakpoint locations of the frequencies.
sysprune
.
Outputs
exp
(jwT))} at the selected frequency values.
Notes
bode(sys);bode plots the results to the screen. Descriptive labels are automatically placed. Failure to include a concluding semicolon will yield some garbage being printed to the screen (
ans = []
).
exp
(jwT))||}
and phase information is not computed.
Used internally in freqresp (bode
, nyquist
)
Inputs
Outputs
Note bodquist could easily be incorporated into a Nichols plot function; this is in a "to do" list.
freqresp
to check that input frequency vector w is legal.
Returns boolean value.
bode
, nyquist
.
minimal argument checking; "do not attempt to do this at home"
Inputs
freqchkw
Outputs
Outputs out
-1 G(s) = (jw I-A) B
for complex frequencies @math{s = jw}.
Arguments are identical to bode
with exceptions as noted below:
Inputs (pass as empty to get default values)
Outputs
If no output arguments are given, nyquist plots the results to the screen. If atol != 0 and asymptotes are detected then the user is asked interactively if they wish to zoom in (remove asymptotes) Descriptive labels are automatically placed.
Note: if the requested plot is for an MIMO system, a warning message is presented; the returned information is of the magnitude ||G(jw)|| or ||G(exp(jwT))|| only; phase information is not computed.
. x = Ax + Bu y = Cx + Du
or discrete
x(k+1) = A x(k) + B u(k) y(k) = C x(k) + D u(k)
system. Outputs
References
bal = balancing option (see balance); default is "B".
Needs to incorporate mvzero
algorithm to isolate finite zeros; use
tzero
instead.
H_infinity optimal controller for the jet707 plant; Linearized state space model of a Boeing 707-321 aircraft at v=80m/s. (M = 0.26, Ga0 = -3 deg, alpha0 = 4 deg, kappa = 50 deg) inputs: (1) thrust and (2) elevator angle outputs: (1) airspeed and (2) pitch angle
The optimal controller minimizes the H_infinity norm of the augmented plant P (mixed-sensitivity problem):
w 1 -----------+ | +----+ +---------------------->| W1 |----> z1 w | | +----+ 2 ------------------------+ | | | | v +----+ v +----+ +--*-->o-->| G |-->o--*-->| W2 |---> z2 | +----+ | +----+ | | ^ v u (from y (to K) controller K) + + + + | z | | w | | 1 | | 1 | | z | = [ P ] * | w | | 2 | | 2 | | y | | u | + + + +
x[k+1] = A x[k] + B u[k] + G w[k] y[k] = C x[k] + D u[k] + w[k]
where w, v are zero-mean gaussian noise processes with
respective intensities sigw = cov (w, w)
and
sigv = cov (v, v)
.
If specified, z is cov (w, v)
. Otherwise
cov (w, v) = 0
.
The observer structure is
z[k+1] = A z[k] + B u[k] + k (y[k] - C z[k] - D u[k])
The following values are returned:
x[k+1] = A x[k] + B u[k]
to minimize the cost functional
J = Sum (x' Q x + u' R u)
z omitted or
J = Sum (x' Q x + u' R u + 2 x' Z u)
z included.
The following values are returned:
References
Inputs input system is passed as either
Outputs
hinfsyn
to compute the H_inf optimal controller.
Inputs
is_dgkf
Outputs controller K (system data structure)
Do not attempt to use this at home; no argument checking performed.
Inputs input system is passed as either
c2d
, d2c
)
Outputs
WARNING Argument checking not performed.
Inputs
Outputs
Solution method: Either Laub's schur method or Symplectic GEP approach; uses Van Dooren's code to re-order qz decompostion (www.netlib.com - toms/590)
See also: Ran and Rodman, "Stable Hermitian Solutions of Discrete Algebraic Riccati Equations," Mathematics of Control, Signals and Systems, Vol 5, no 2 (1992) pp 165-194.
hinfsyn
to see if gain g satisfies conditions in
Theorem 3 of
Doyle, Glover, Khargonekar, Francis, "State Space Solutions to Standard
H2 and Hinf Control Problems", IEEE TAC August 1989
Warning Do not attempt to use this at home; no argument checking performed.
Inputs as returned by is_dgkf
, except for:
hinfsyn
Outputs: retval: = 1 if g exceeds optimal Hinf closed loop gain, else 0 Pc: solution of "regulator" H-inf ARE Pf: solution of "filter" H-inf ARE
dx -- = a x + b u dt y = c x + d u
where w and v are zero-mean gaussian noise processes with respective intensities
sigw = cov (w, w) sigv = cov (v, v)
The optional argument z is the cross-covariance
cov (w, v)
. If it is omitted,
cov (w, v) = 0
is assumed.
Observer structure is dz/dt = A z + B u + k (y - C z - D u)
The following values are returned:
dx/dt = A x + B u + G w [w]=N(0,[Sigw 0 ]) y = C x + v [v] ( 0 Sigv ])
or
x(k+1) = A x(k) + B u(k) + G w(k) [w]=N(0,[Sigw 0 ]) y(k) = C x(k) + v(k) [v] ( 0 Sigv ])
Inputs
Outputs
sys2ss
, sys2tf
, or sys2zp
as appropriate)
dx -- = A x + B u dt
to minimize the cost functional
infinity / J = | x' Q x + u' R u / t=0
z omitted or
infinity / J = | x' Q x + u' R u + 2 x' Z u / t=0
z included.
The following values are returned:
Produces a plot for the output of the system, sys.
U is an array that contains the system's inputs. Each column in u corresponds to a different time step. Each row in u corresponds to a different input. T is an array that contains the time index of the system. T should be regularly spaced. If initial conditions are required on the system, the x0 vector should be added to the argument list.
When the lsim function is invoked with output parameters: [y,x] = lsim(sys,u,t,[x0]) a plot is not displayed, however, the data is returned in y = system output and x = system states.
Version: Beta (May-1997): If you have any comments, please let me know. (see the file place.m for my address)
Written by: Jose Daniel Munoz Frias.
Inputs axdata nx2 matrix of data [x,y]
Outputs axvec vector of axis limits appropriate for call to axis() function
$Revision: 1.9 $
Octave Controls toolbox demo: Model Manipulations demo Written by David Clem August 15, 1994
function prompt([str]) Prompt user to continue str: input string. Default value: "\n ---- Press a key to continue ---" Written by David Clem August 15, 1994 Modified A. S. Hodel June 1995
[rldata, k] = rlocus(sys[,increment,min_k,max_k]) Displays root locus plot of the specified SISO system. ----- -- -------- --->| + |---|k|---->| SISO |-----------> ----- -- -------- | - ^ | |_____________________________| inputs: sys = system data structure min_k, max_k,increment: minimum, maximum values of k and the increment used in computing gain values Outputs: plots the root locus to the screen. rldata: Data points plotted column 1: real values, column 2: imaginary values) k: gains for real axis break points.
[yy,idx] = sortcom(xx[,opt]): sort a complex vector xx: complex vector opt: sorting option: "re": real part (default) "mag": by magnitude "im": by imaginary part if opt != "im" then complex conjugate pairs are grouped together, a - jb followed by a + jb. yy: sorted values idx: permutation vector: yy = xx(idx)
[num,den] = ss2tf(a,b,c,d) Conversion from tranfer function to state-space. The state space system . x = Ax + Bu y = Cx + Du is converted to a transfer function num(s) G(s)=------- den(s) used internally in system data structure format manipulations
Converts a state space representation to a set of poles and zeros. [pol,zer,k] = ss2zp(a,b,c,d) returns the poles and zeros of the state space system (a,b,c,d). K is a gain associated with the zeros. used internally in system data structure format manipulations
[sys] = starp(P, K, ny, nu) Redheffer star product or upper/lower LFT, respectively. +-------+ --------->| |---------> | P | +--->| |---+ ny | +-------+ | +-------------------+ | | +----------------+ | | | | +-------+ | +--->| |------+ nu | K | --------->| |---------> +-------+ If ny and nu "consume" all inputs and outputs of K then the result is a lower fractional transformation. If ny and nu "consume" all inputs and outputs of P then the result is an upper fractional transformation. ny and/or nu may be negative (= negative feedback)
[a1,b1] = swap(a,b) interchange a and b
function B = swapcols(A) permute columns of A into reverse order
function B = swaprows(A) permute rows of A into reverse order
Conversion from tranfer function to state-space. The state space system . x = Ax + Bu y = Cx + Du is obtained from a transfer function num(s) G(s)=------- den(s) via the function call [a,b,c,d] = tf2ss(num,den). The vector 'den' must contain only one row, whereas the vector 'num' may contain as many rows as there are outputs of the system 'y'. The state space system matrices obtained from this function will be in controllable canonical form as described in "Modern Control Theory", [Brogan, 1991].
Converts transfer functions to poles / zeros. [zer,pol,k] = tf2zp(num,den) returns the zeros and poles of the SISO system defined by num/den. K is a gain associated with the system zeros.
. x = Ax + Bu y = Cx + Du
is obtained from a vector of zeros and a vector of poles via the
function call [a,b,c,d] = zp2ss(zer,pol,k)
.
The vectors `zer' and
`pol' may either be row or column vectors. Each zero and pole that
has an imaginary part must have a conjugate in the list.
The number of zeros must not exceed the number of poles.
`k' is zp
-form leading coefficient.
zp2ss
Extract 2 values from rvals (if possible) and construct
a polynomial with those roots.
[num,den] = zp2tf(zer,pol,k)
forms the transfer function
num/den
from the vectors of poles and zeros.
Go to the first, previous, next, last section, table of contents.