File: lqr.cat

package info (click to toggle)
scilab 2.4-1
  • links: PTS
  • area: non-free
  • in suites: potato, slink
  • size: 55,196 kB
  • ctags: 38,019
  • sloc: ansic: 231,970; fortran: 148,976; tcl: 7,099; makefile: 4,585; sh: 2,978; csh: 154; cpp: 101; asm: 39; sed: 5
file content (65 lines) | stat: -rw-r--r-- 2,276 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

lqr(1)                         Scilab Function                         lqr(1)
NAME
  lqr - LQ compensator (full state)

CALLING SEQUENCE
  [K,X]=lqr(P12)

PARAMETERS

  P12       : syslin list (state-space linear system)

  K,X       : two real matrices

DESCRIPTION
  lqr  computes the linear optimal LQ full-state gain for the plant
  P12=[A,B2,C1,D12] in continuous or discrete time.

  P12 is a syslin list (e.g. P12=syslin('c',A,B2,C1,D12)).

  The cost function is l2-norm of z'*z with z=C1 x + D12 u i.e. [x,u]' * BigQ
  * [x;u] where
        [C1' ]               [Q  S]
  BigQ= [    ]  * [C1 D12] = [    ]
        [D12']               [S' R]
  The gain K is such that A + B2*K is stable.

  X is the stabilizing solution of the Riccati equation.

  For a continuous plant:
  (A-B2*inv(R)*S')'*X+X*(A-B2*inv(R)*S')-X*B2*inv(R)*B2'*X+Q-S*inv(R)*S'=0
  K=-inv(R)*(B2'*X+S)

  For a discrete plant:
  X=A'*X*A-(A'*X*B2+C1'*D12)*pinv(B2'*X*B2+D12'*D12)*(B2'*X*A+D12'*C1)+C1'*C1;
  K=-pinv(B2'*X*B2+D12'*D12)*(B2'*X*A+D12'*C1)
  An equivalent form for X is
  X=Abar'*inv(inv(X)+B2*inv(r)*B2')*Abar+Qbar
  with Abar=A-B2*inv(R)*S' and Qbar=Q-S*inv(R)*S'
  The 3-blocks matrix pencils associated with these Riccati equations are:
                 discrete                           continuous
     |I   0    0|   | A    0    B2|         |I   0   0|   | A    0    B2|
    z|0   A'   0| - |-Q    I    -S|        s|0   I   0| - |-Q   -A'   -S|
     |0   B2'  0|   | S'   0     R|         |0   0   0|   | S'  -B2'   R|
  Caution: It is assumed that matrix R is non singular. In particular, the
  plant must be tall (number of outputs >= number of inputs).
EXAMPLE
  A=rand(2,2);B=rand(2,1);   //two states, one input
  Q=diag([2,5]);R=2;     //Usual notations x'Qx + u'Ru
  Big=sysdiag(Q,R);    //Now we calculate C1 and D12
  [w,wp]=fullrf(Big);C1=w(:,1:2);D12=w(:,3);   //[C1,D12]'*[C1,D12]=Big
  P=syslin('c',A,B,C1,D12);    //The plant (continuous-time)
  [K,X]=lqr(P)
  spec(A+B*K)    //check stability
  norm(A'*X+X*A-X*B*inv(R)*B'*X+Q,1)  //Riccati check
  P=syslin('d',A,B,C1,D12);    // Discrete time plant
  [K,X]=lqr(P)
  spec(A+B*K)   //check stability
  norm(A'*X*A-(A'*X*B)*pinv(B'*X*B+R)*(B'*X*A)+Q-X,1) //Riccati check

SEE ALSO
  lqe, gcare, leqr

AUTHOR
  F.D.