Riccati Matrix Equation Solvers

Riccati Matrix Equation Solvers

MatrixEquations.arecFunction.
arec(A, R, Q) -> (X, EVALS)

Compute X, the hermitian/symmetric stabilizing solution of the continuous-time algebraic Riccati equation

 A'X + XA - XRX + Q = 0,

where Q and R are hermitian/symmetric matrices. EVALS is a vector containing the (stable) eigenvalues of A-RX.

Reference: Laub, A.J., A Schur Method for Solving Algebraic Riccati equations. IEEE Trans. Auto. Contr., AC-24, pp. 913-921, 1979.

Example

julia> using LinearAlgebra

julia> A = [-6. -2. 1.; 5. 1. -1; -4. -2. -1.]
3×3 Array{Float64,2}:
 -6.0  -2.0   1.0
  5.0   1.0  -1.0
 -4.0  -2.0  -1.0

julia> R = [1. 0. 0.; 0. 5. 0.; 0. 0. 10.]
3×3 Array{Float64,2}:
 1.0  0.0   0.0
 0.0  5.0   0.0
 0.0  0.0  10.0

julia> X, CLSEIG = arec(A,R,2I);

julia> X
3×3 Array{Float64,2}:
  0.459589   0.333603   -0.144406
  0.333603   0.65916    -0.0999216
 -0.144406  -0.0999216   0.340483

julia> A'*X+X*A-X*R*X+2I
3×3 Array{Float64,2}:
 -1.33227e-15  4.44089e-16  -2.22045e-15
  4.44089e-16  8.88178e-16   1.11022e-16
 -2.22045e-15  0.0          -1.77636e-15

julia> CLSEIG
3-element Array{Complex{Float64},1}:
 -4.411547592296008 + 2.4222082620381102im
 -4.411547592296008 - 2.4222082620381102im
 -4.337128244724371 + 0.0im

julia> eigvals(A-R*X)
3-element Array{Complex{Float64},1}:
 -4.411547592296008 - 2.4222082620381076im
 -4.411547592296008 + 2.4222082620381076im
 -4.337128244724376 + 0.0im
source
arec(A, B, R, Q, S) -> (X, EVALS, F)

Computes X, the hermitian/symmetric stabilizing solution of the continuous-time algebraic Riccati equation

 A'X + XA - (XB+S)R^(-1)(B'X+S') + Q = 0,

where Q and R are hermitian/symmetric matrices such that R is nonsingular. EVALS is a vector containing the (stable) eigenvalues of A-BF. F is the stabilizing gain matrix F = R^(-1)(B'X+S').

Reference: Laub, A.J., A Schur Method for Solving Algebraic Riccati equations. IEEE Trans. Auto. Contr., AC-24, pp. 913-921, 1979.

Example

julia> using LinearAlgebra

julia> A = [-6. -2. 1.; 5. 1. -1; -4. -2. -1.]
3×3 Array{Float64,2}:
 -6.0  -2.0   1.0
  5.0   1.0  -1.0
 -4.0  -2.0  -1.0

julia> B = [1. 2.; 2. 0.; 0. 1.]
3×2 Array{Float64,2}:
 1.0  2.0
 2.0  0.0
 0.0  1.0

julia> R = [1. 0.; 0. 5.]
2×2 Array{Float64,2}:
 1.0  0.0
 0.0  5.0

julia> X, CLSEIG, F = arec(A,B,R,2I);

julia> X
3×3 Array{Float64,2}:
  0.522588   0.303007  -0.327227
  0.303007   0.650895  -0.132608
 -0.327227  -0.132608   0.629825

julia> A'*X+X*A-X*B*inv(R)*B'*X+2I
3×3 Array{Float64,2}:
 -2.66454e-15  -1.55431e-15   1.11022e-15
 -1.55431e-15   1.9984e-15   -3.21965e-15
  1.22125e-15  -2.9976e-15    6.66134e-16

julia> CLSEIG
3-element Array{Complex{Float64},1}:
   -4.37703628399912 + 2.8107164873731247im
   -4.37703628399912 - 2.8107164873731247im
 -1.8663764577096091 + 0.0im

julia> eigvals(A-B*F)
3-element Array{Complex{Float64},1}:
  -4.377036283999118 - 2.8107164873731234im
  -4.377036283999118 + 2.8107164873731234im
 -1.8663764577096063 + 0.0im
source
MatrixEquations.garecFunction.
garec(A, E, B, R, Q, S) -> (X, EVALS, F)

Compute X, the hermitian/symmetric stabilizing solution of the generalized continuous-time algebraic Riccati equation

A'XE + E'XA - (E'XB+S)R^(-1)(B'XE+S') + Q = 0,

where Q and R are hermitian/symmetric matrices such that R is nonsingular, and E is a nonsingular matrix. EVALS is a vector containing the (stable) generalized eigenvalues of the pair (A-BF,E). F is the stabilizing gain matrix F = R^(-1)(B'XE+S').

Reference: W.F. Arnold, III and A.J. Laub, Generalized Eigenproblem Algorithms and Software for Algebraic Riccati Equations, Proc. IEEE, 72:1746-1754, 1984.

Example

julia> using LinearAlgebra

julia> A = [-6. -2. 1.; 5. 1. -1; -4. -2. -1.]
3×3 Array{Float64,2}:
 -6.0  -2.0   1.0
  5.0   1.0  -1.0
 -4.0  -2.0  -1.0

julia> E = [10. 3. 0.; 0. 5. -1.; 0. 0. 10.]
3×3 Array{Float64,2}:
 10.0  3.0   0.0
  0.0  5.0  -1.0
  0.0  0.0  10.0

julia> B = [1. 2.; 2. 0.; 0. 1.]
3×2 Array{Float64,2}:
 1.0  2.0
 2.0  0.0
 0.0  1.0

julia> R = [1. 0.; 0. 5.]
2×2 Array{Float64,2}:
 1.0  0.0
 0.0  5.0

julia> X, CLSEIG, F = garec(A,E,B,R,2I);

julia> X
3×3 Array{Float64,2}:
  0.0502214   0.0284089   -0.0303703
  0.0284089   0.111219    -0.00259162
 -0.0303703  -0.00259162   0.0618395

julia> A'*X*E+E'*X*A-E'*X*B*inv(R)*B'*X*E+2I
3×3 Array{Float64,2}:
  1.55431e-15  -1.9984e-15   -3.33067e-15
 -1.77636e-15   1.33227e-15  -3.33067e-15
 -2.88658e-15  -3.21965e-15   1.11022e-15

julia> CLSEIG
3-element Array{Complex{Float64},1}:
  -0.6184265391601464 + 0.2913286844595737im
  -0.6184265391601464 - 0.2913286844595737im
 -0.21613059964451786 + 0.0im

julia> eigvals(A-B*F,E)
3-element Array{Complex{Float64},1}:
 -0.6184265391601462 - 0.29132868445957383im
 -0.6184265391601462 + 0.2913286844595739im
  -0.216130599644518 + 0.0im
source
MatrixEquations.aredFunction.
ared(A, B, R, Q, S) -> (X, EVALS, F)

Computes X, the hermitian/symmetric stabilizing solution of the discrete-time algebraic Riccati equation

 A'XA - X - (A'XB+S)(R+B'XB)^(-1)(B'XA+S') + Q = 0,

where Q and R are hermitian/symmetric matrices. EVALS is a vector containing the (stable) eigenvalues of A-BF. F is the stabilizing gain matrix F = (R+B'XB)^(-1)(B'XA+S').

Reference: W.F. Arnold, III and A.J. Laub, Generalized Eigenproblem Algorithms and Software for Algebraic Riccati Equations, Proc. IEEE, 72:1746-1754, 1984.

Example

julia> using LinearAlgebra

julia> A = [-6. -2. 1.; 5. 1. -1; -4. -2. -1.]
3×3 Array{Float64,2}:
 -6.0  -2.0   1.0
  5.0   1.0  -1.0
 -4.0  -2.0  -1.0

julia> B = [1. 2.; 2. 0.; 0. 1.]
3×2 Array{Float64,2}:
 1.0  2.0
 2.0  0.0
 0.0  1.0

julia> R = [1. 0.; 0. 5.]
2×2 Array{Float64,2}:
 1.0  0.0
 0.0  5.0

julia> X, CLSEIG, F = ared(A,B,R,2I);

julia> X
3×3 Array{Float64,2}:
  109.316   -63.1658  -214.318
  -63.1658  184.047    426.081
 -214.318   426.081   1051.16

julia> A'*X*A-X-A'*X*B*inv(R+B'*X*B)*B'*X*A+2I
3×3 Array{Float64,2}:
 -2.50111e-11   4.16094e-11   1.06184e-10
  4.75211e-11  -8.11724e-11  -2.06228e-10
  1.11186e-10  -2.06455e-10  -5.15001e-10

julia> CLSEIG
3-element Array{Complex{Float64},1}:
 -0.04209841276282689 - 0.0497727979322874im
 -0.04209841276282689 + 0.0497727979322874im
  -0.5354826075405217 - 0.0im

julia> eigvals(A-B*F)
3-element Array{Complex{Float64},1}:
  -0.5354826075397419 + 0.0im
 -0.04209841276292829 - 0.049772797931966324im
 -0.04209841276292829 + 0.049772797931966324im
source
MatrixEquations.garedFunction.
gared(A, E, B, R, Q, S) -> (X, EVALS, F)

Compute X, the hermitian/symmetric stabilizing solution of the generalized discrete-time algebraic Riccati equation

A'XA - E'XE - (A'XB+S)(R+B'XB)^(-1)(B'XA+S') + Q = 0,

where Q and R are hermitian/symmetric matrices. EVALS is a vector containing the (stable) generalized eigenvalues of the pair (A-BF,E). F is the stabilizing gain matrix F = (R+B'XB)^(-1)(B'XA+S').

Reference: W.F. Arnold, III and A.J. Laub, Generalized Eigenproblem Algorithms and Software for Algebraic Riccati Equations, Proc. IEEE, 72:1746-1754, 1984.

Example

julia> using LinearAlgebra

julia> A = [-6. -2. 1.; 5. 1. -1; -4. -2. -1.]
3×3 Array{Float64,2}:
 -6.0  -2.0   1.0
  5.0   1.0  -1.0
 -4.0  -2.0  -1.0

julia> E = [10. 3. 0.; 0. 5. -1.; 0. 0. 10.]
3×3 Array{Float64,2}:
 10.0  3.0   0.0
  0.0  5.0  -1.0
  0.0  0.0  10.0

julia> B = [1. 2.; 2. 0.; 0. 1.]
3×2 Array{Float64,2}:
 1.0  2.0
 2.0  0.0
 0.0  1.0

julia> R = [1. 0.; 0. 5.]
2×2 Array{Float64,2}:
 1.0  0.0
 0.0  5.0

julia> X, CLSEIG, F = gared(A,E,B,R,2I);

julia> X
3×3 Array{Float64,2}:
  0.065865   -0.0147205  -0.0100407
 -0.0147205   0.0885939   0.0101422
 -0.0100407   0.0101422   0.0234425

julia> A'*X*A-E'*X*E-A'*X*B*inv(R+B'*X*B)*B'*X*A+2I
3×3 Array{Float64,2}:
 -1.33227e-15  -2.48412e-15   1.38778e-16
 -2.498e-15    -4.44089e-16  -6.50521e-16
  1.80411e-16  -5.91541e-16  -1.33227e-15

julia> CLSEIG
3-element Array{Complex{Float64},1}:
  -0.084235615751339 - 0.0im
  -0.190533552034239 - 0.0im
 -0.5238922629921539 - 0.0im

julia> eigvals(A-B*F,E)
3-element Array{Float64,1}:
 -0.5238922629921537
 -0.19053355203423877
 -0.08423561575133914
source