Riccati Matrix Equation Solvers
MatrixEquations.arec
— Function.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
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
MatrixEquations.garec
— Function.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
MatrixEquations.ared
— Function.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
MatrixEquations.gared
— Function.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