4343"""
4444
4545import unittest
46- from numpy import matrix
47- from numpy .testing import assert_array_almost_equal , assert_array_less
46+ from numpy import array
47+ from numpy .testing import assert_array_almost_equal , assert_array_less , \
48+ assert_raises
4849# need scipy version of eigvals for generalized eigenvalue problem
4950from scipy .linalg import eigvals , solve
5051from scipy import zeros ,dot
@@ -56,183 +57,190 @@ class TestMatrixEquations(unittest.TestCase):
5657 """These are tests for the matrix equation solvers in mateqn.py"""
5758
5859 def test_lyap (self ):
59- A = matrix ([[- 1 , 1 ],[- 1 , 0 ]])
60- Q = matrix ([[1 ,0 ],[0 ,1 ]])
60+ A = array ([[- 1 , 1 ],[- 1 , 0 ]])
61+ Q = array ([[1 ,0 ],[0 ,1 ]])
6162 X = lyap (A ,Q )
6263 # print("The solution obtained is ", X)
63- assert_array_almost_equal (A * X + X * A .T + Q , zeros ((2 ,2 )))
64+ assert_array_almost_equal (A . dot ( X ) + X . dot ( A .T ) + Q , zeros ((2 ,2 )))
6465
65- A = matrix ([[1 , 2 ],[- 3 , - 4 ]])
66- Q = matrix ([[3 , 1 ],[1 , 1 ]])
66+ A = array ([[1 , 2 ],[- 3 , - 4 ]])
67+ Q = array ([[3 , 1 ],[1 , 1 ]])
6768 X = lyap (A ,Q )
6869 # print("The solution obtained is ", X)
69- assert_array_almost_equal (A * X + X * A .T + Q , zeros ((2 ,2 )))
70+ assert_array_almost_equal (A . dot ( X ) + X . dot ( A .T ) + Q , zeros ((2 ,2 )))
7071
7172 def test_lyap_sylvester (self ):
7273 A = 5
73- B = matrix ([[4 , 3 ], [4 , 3 ]])
74- C = matrix ([2 , 1 ])
74+ B = array ([[4 , 3 ], [4 , 3 ]])
75+ C = array ([2 , 1 ])
7576 X = lyap (A ,B ,C )
7677 # print("The solution obtained is ", X)
77- assert_array_almost_equal (A * X + X * B + C , zeros ((1 ,2 )))
78+ assert_array_almost_equal (A * X + X . dot ( B ) + C , zeros ((1 ,2 )))
7879
79- A = matrix ([[2 ,1 ],[1 ,2 ]])
80- B = matrix ([[1 ,2 ],[0.5 ,0.1 ]])
81- C = matrix ([[1 ,0 ],[0 ,1 ]])
80+ A = array ([[2 ,1 ],[1 ,2 ]])
81+ B = array ([[1 ,2 ],[0.5 ,0.1 ]])
82+ C = array ([[1 ,0 ],[0 ,1 ]])
8283 X = lyap (A ,B ,C )
8384 # print("The solution obtained is ", X)
84- assert_array_almost_equal (A * X + X * B + C , zeros ((2 ,2 )))
85+ assert_array_almost_equal (A . dot ( X ) + X . dot ( B ) + C , zeros ((2 ,2 )))
8586
8687 def test_lyap_g (self ):
87- A = matrix ([[- 1 , 2 ],[- 3 , - 4 ]])
88- Q = matrix ([[3 , 1 ],[1 , 1 ]])
89- E = matrix ([[1 ,2 ],[2 ,1 ]])
88+ A = array ([[- 1 , 2 ],[- 3 , - 4 ]])
89+ Q = array ([[3 , 1 ],[1 , 1 ]])
90+ E = array ([[1 ,2 ],[2 ,1 ]])
9091 X = lyap (A ,Q ,None ,E )
9192 # print("The solution obtained is ", X)
92- assert_array_almost_equal (A * X * E .T + E * X * A .T + Q , zeros ((2 ,2 )))
93+ assert_array_almost_equal (A . dot ( X ). dot ( E .T ) + E . dot ( X ). dot ( A .T ) + Q , zeros ((2 ,2 )))
9394
9495 def test_dlyap (self ):
95- A = matrix ([[- 0.6 , 0 ],[- 0.1 , - 0.4 ]])
96- Q = matrix ([[1 ,0 ],[0 ,1 ]])
96+ A = array ([[- 0.6 , 0 ],[- 0.1 , - 0.4 ]])
97+ Q = array ([[1 ,0 ],[0 ,1 ]])
9798 X = dlyap (A ,Q )
9899 # print("The solution obtained is ", X)
99- assert_array_almost_equal (A * X * A .T - X + Q , zeros ((2 ,2 )))
100+ assert_array_almost_equal (A . dot ( X ). dot ( A .T ) - X + Q , zeros ((2 ,2 )))
100101
101- A = matrix ([[- 0.6 , 0 ],[- 0.1 , - 0.4 ]])
102- Q = matrix ([[3 , 1 ],[1 , 1 ]])
102+ A = array ([[- 0.6 , 0 ],[- 0.1 , - 0.4 ]])
103+ Q = array ([[3 , 1 ],[1 , 1 ]])
103104 X = dlyap (A ,Q )
104105 # print("The solution obtained is ", X)
105- assert_array_almost_equal (A * X * A .T - X + Q , zeros ((2 ,2 )))
106+ assert_array_almost_equal (A . dot ( X ). dot ( A .T ) - X + Q , zeros ((2 ,2 )))
106107
107108 def test_dlyap_g (self ):
108- A = matrix ([[- 0.6 , 0 ],[- 0.1 , - 0.4 ]])
109- Q = matrix ([[3 , 1 ],[1 , 1 ]])
110- E = matrix ([[1 , 1 ],[2 , 1 ]])
109+ A = array ([[- 0.6 , 0 ],[- 0.1 , - 0.4 ]])
110+ Q = array ([[3 , 1 ],[1 , 1 ]])
111+ E = array ([[1 , 1 ],[2 , 1 ]])
111112 X = dlyap (A ,Q ,None ,E )
112113 # print("The solution obtained is ", X)
113- assert_array_almost_equal (A * X * A .T - E * X * E .T + Q , zeros ((2 ,2 )))
114+ assert_array_almost_equal (A . dot ( X ). dot ( A .T ) - E . dot ( X ). dot ( E .T ) + Q , zeros ((2 ,2 )))
114115
115116 def test_dlyap_sylvester (self ):
116117 A = 5
117- B = matrix ([[4 , 3 ], [4 , 3 ]])
118- C = matrix ([2 , 1 ])
118+ B = array ([[4 , 3 ], [4 , 3 ]])
119+ C = array ([2 , 1 ])
119120 X = dlyap (A ,B ,C )
120121 # print("The solution obtained is ", X)
121- assert_array_almost_equal (A * X * B .T - X + C , zeros ((1 ,2 )))
122+ assert_array_almost_equal (A * X . dot ( B .T ) - X + C , zeros ((1 ,2 )))
122123
123- A = matrix ([[2 ,1 ],[1 ,2 ]])
124- B = matrix ([[1 ,2 ],[0.5 ,0.1 ]])
125- C = matrix ([[1 ,0 ],[0 ,1 ]])
124+ A = array ([[2 ,1 ],[1 ,2 ]])
125+ B = array ([[1 ,2 ],[0.5 ,0.1 ]])
126+ C = array ([[1 ,0 ],[0 ,1 ]])
126127 X = dlyap (A ,B ,C )
127128 # print("The solution obtained is ", X)
128- assert_array_almost_equal (A * X * B .T - X + C , zeros ((2 ,2 )))
129+ assert_array_almost_equal (A . dot ( X ). dot ( B .T ) - X + C , zeros ((2 ,2 )))
129130
130131 def test_care (self ):
131- A = matrix ([[- 2 , - 1 ],[- 1 , - 1 ]])
132- Q = matrix ([[0 , 0 ],[0 , 1 ]])
133- B = matrix ([[1 , 0 ],[0 , 4 ]])
132+ A = array ([[- 2 , - 1 ],[- 1 , - 1 ]])
133+ Q = array ([[0 , 0 ],[0 , 1 ]])
134+ B = array ([[1 , 0 ],[0 , 4 ]])
134135
135136 X ,L ,G = care (A ,B ,Q )
136137 # print("The solution obtained is", X)
137- assert_array_almost_equal (A .T * X + X * A - X * B * B .T * X + Q ,
138+ assert_array_almost_equal (A .T . dot ( X ) + X . dot ( A ) - X . dot ( B ). dot ( B .T ). dot ( X ) + Q ,
138139 zeros ((2 ,2 )))
139- assert_array_almost_equal (B .T * X , G )
140+ assert_array_almost_equal (B .T . dot ( X ) , G )
140141
141142 def test_care_g (self ):
142- A = matrix ([[- 2 , - 1 ],[- 1 , - 1 ]])
143- Q = matrix ([[0 , 0 ],[0 , 1 ]])
144- B = matrix ([[1 , 0 ],[0 , 4 ]])
145- R = matrix ([[2 , 0 ],[0 , 1 ]])
146- S = matrix ([[0 , 0 ],[0 , 0 ]])
147- E = matrix ([[2 , 1 ],[1 , 2 ]])
143+ A = array ([[- 2 , - 1 ],[- 1 , - 1 ]])
144+ Q = array ([[0 , 0 ],[0 , 1 ]])
145+ B = array ([[1 , 0 ],[0 , 4 ]])
146+ R = array ([[2 , 0 ],[0 , 1 ]])
147+ S = array ([[0 , 0 ],[0 , 0 ]])
148+ E = array ([[2 , 1 ],[1 , 2 ]])
148149
149150 X ,L ,G = care (A ,B ,Q ,R ,S ,E )
150151 # print("The solution obtained is", X)
152+ Gref = solve (R , B .T .dot (X ).dot (E ) + S .T )
153+ assert_array_almost_equal (Gref , G )
151154 assert_array_almost_equal (
152- A .T * X * E + E .T * X * A -
153- (E .T * X * B + S ) * solve ( R , B . T * X * E + S . T ) + Q , zeros (( 2 , 2 )))
154- assert_array_almost_equal ( solve ( R , B . T * X * E + S . T ), G )
155+ A .T . dot ( X ). dot ( E ) + E .T . dot ( X ). dot ( A )
156+ - (E .T . dot ( X ). dot ( B ) + S ). dot ( Gref ) + Q ,
157+ zeros (( 2 , 2 )) )
155158
156- A = matrix ([[- 2 , - 1 ],[- 1 , - 1 ]])
157- Q = matrix ([[0 , 0 ],[0 , 1 ]])
158- B = matrix ([[1 ],[0 ]])
159+ A = array ([[- 2 , - 1 ],[- 1 , - 1 ]])
160+ Q = array ([[0 , 0 ],[0 , 1 ]])
161+ B = array ([[1 ],[0 ]])
159162 R = 1
160- S = matrix ([[1 ],[0 ]])
161- E = matrix ([[2 , 1 ],[1 , 2 ]])
163+ S = array ([[1 ],[0 ]])
164+ E = array ([[2 , 1 ],[1 , 2 ]])
162165
163166 X ,L ,G = care (A ,B ,Q ,R ,S ,E )
164167 # print("The solution obtained is", X)
168+ Gref = 1 / R * (B .T .dot (X ).dot (E ) + S .T )
165169 assert_array_almost_equal (
166- A .T * X * E + E .T * X * A -
167- (E .T * X * B + S ) / R * (B .T * X * E + S .T ) + Q , zeros ((2 ,2 )))
168- assert_array_almost_equal (dot ( 1 / R , dot (B .T ,dot (X ,E )) + S .T ) , G )
170+ A .T .dot (X ).dot (E ) + E .T .dot (X ).dot (A )
171+ - (E .T .dot (X ).dot (B ) + S ).dot (Gref ) + Q ,
172+ zeros ((2 ,2 )))
173+ assert_array_almost_equal (Gref , G )
169174
170175 def test_dare (self ):
171- A = matrix ([[- 0.6 , 0 ],[- 0.1 , - 0.4 ]])
172- Q = matrix ([[2 , 1 ],[1 , 0 ]])
173- B = matrix ([[2 , 1 ],[0 , 1 ]])
174- R = matrix ([[1 , 0 ],[0 , 1 ]])
176+ A = array ([[- 0.6 , 0 ],[- 0.1 , - 0.4 ]])
177+ Q = array ([[2 , 1 ],[1 , 0 ]])
178+ B = array ([[2 , 1 ],[0 , 1 ]])
179+ R = array ([[1 , 0 ],[0 , 1 ]])
175180
176181 X ,L ,G = dare (A ,B ,Q ,R )
177182 # print("The solution obtained is", X)
183+ Gref = solve (B .T .dot (X ).dot (B ) + R , B .T .dot (X ).dot (A ))
184+ assert_array_almost_equal (Gref , G )
178185 assert_array_almost_equal (
179- A .T * X * A - X -
180- A .T * X * B * solve ( B . T * X * B + R , B . T * X * A ) + Q , zeros (( 2 , 2 )))
181- assert_array_almost_equal ( solve ( B . T * X * B + R , B . T * X * A ), G )
186+ A .T . dot ( X ). dot ( A ) - X -
187+ A .T . dot ( X ). dot ( B ). dot ( Gref ) + Q ,
188+ zeros (( 2 , 2 )) )
182189 # check for stable closed loop
183- lam = eigvals (A - B * G )
190+ lam = eigvals (A - B . dot ( G ) )
184191 assert_array_less (abs (lam ), 1.0 )
185192
186- A = matrix ([[1 , 0 ],[- 1 , 1 ]])
187- Q = matrix ([[0 , 1 ],[1 , 1 ]])
188- B = matrix ([[1 ],[0 ]])
193+ A = array ([[1 , 0 ],[- 1 , 1 ]])
194+ Q = array ([[0 , 1 ],[1 , 1 ]])
195+ B = array ([[1 ],[0 ]])
189196 R = 2
190197
191198 X ,L ,G = dare (A ,B ,Q ,R )
192199 # print("The solution obtained is", X)
193200 assert_array_almost_equal (
194- A .T * X * A - X -
195- A .T * X * B * solve (B .T * X * B + R , B .T * X * A ) + Q , zeros ((2 ,2 )))
196- assert_array_almost_equal (B .T * X * A / (B .T * X * B + R ), G )
201+ A .T . dot ( X ). dot ( A ) - X -
202+ A .T . dot ( X ). dot ( B ) * solve (B .T . dot ( X ). dot ( B ) + R , B .T . dot ( X ). dot ( A ) ) + Q , zeros ((2 ,2 )))
203+ assert_array_almost_equal (B .T . dot ( X ). dot ( A ) / (B .T . dot ( X ). dot ( B ) + R ), G )
197204 # check for stable closed loop
198- lam = eigvals (A - B * G )
205+ lam = eigvals (A - B . dot ( G ) )
199206 assert_array_less (abs (lam ), 1.0 )
200207
201208 def test_dare_g (self ):
202- A = matrix ([[- 0.6 , 0 ],[- 0.1 , - 0.4 ]])
203- Q = matrix ([[2 , 1 ],[1 , 3 ]])
204- B = matrix ([[1 , 5 ],[2 , 4 ]])
205- R = matrix ([[1 , 0 ],[0 , 1 ]])
206- S = matrix ([[1 , 0 ],[2 , 0 ]])
207- E = matrix ([[2 , 1 ],[1 , 2 ]])
209+ A = array ([[- 0.6 , 0 ],[- 0.1 , - 0.4 ]])
210+ Q = array ([[2 , 1 ],[1 , 3 ]])
211+ B = array ([[1 , 5 ],[2 , 4 ]])
212+ R = array ([[1 , 0 ],[0 , 1 ]])
213+ S = array ([[1 , 0 ],[2 , 0 ]])
214+ E = array ([[2 , 1 ],[1 , 2 ]])
208215
209216 X ,L ,G = dare (A ,B ,Q ,R ,S ,E )
210217 # print("The solution obtained is", X)
218+ Gref = solve (B .T .dot (X ).dot (B ) + R , B .T .dot (X ).dot (A ) + S .T )
219+ assert_array_almost_equal (Gref ,G )
211220 assert_array_almost_equal (
212- A .T * X * A - E .T * X * E -
213- (A .T * X * B + S ) * solve ( B . T * X * B + R , B . T * X * A + S . T ) + Q ,
221+ A .T . dot ( X ). dot ( A ) - E .T . dot ( X ). dot ( E )
222+ - (A .T . dot ( X ). dot ( B ) + S ). dot ( Gref ) + Q ,
214223 zeros ((2 ,2 )) )
215- assert_array_almost_equal (solve (B .T * X * B + R , B .T * X * A + S .T ), G )
216224 # check for stable closed loop
217- lam = eigvals (A - B * G , E )
225+ lam = eigvals (A - B . dot ( G ) , E )
218226 assert_array_less (abs (lam ), 1.0 )
219227
220- A = matrix ([[- 0.6 , 0 ],[- 0.1 , - 0.4 ]])
221- Q = matrix ([[2 , 1 ],[1 , 3 ]])
222- B = matrix ([[1 ],[2 ]])
228+ A = array ([[- 0.6 , 0 ],[- 0.1 , - 0.4 ]])
229+ Q = array ([[2 , 1 ],[1 , 3 ]])
230+ B = array ([[1 ],[2 ]])
223231 R = 1
224- S = matrix ([[1 ],[2 ]])
225- E = matrix ([[2 , 1 ],[1 , 2 ]])
232+ S = array ([[1 ],[2 ]])
233+ E = array ([[2 , 1 ],[1 , 2 ]])
226234
227235 X ,L ,G = dare (A ,B ,Q ,R ,S ,E )
228236 # print("The solution obtained is", X)
229237 assert_array_almost_equal (
230- A .T * X * A - E .T * X * E -
231- (A .T * X * B + S ) * solve (B .T * X * B + R , B .T * X * A + S .T ) + Q ,
238+ A .T . dot ( X ). dot ( A ) - E .T . dot ( X ). dot ( E ) -
239+ (A .T . dot ( X ). dot ( B ) + S ). dot ( solve (B .T . dot ( X ). dot ( B ) + R , B .T . dot ( X ). dot ( A ) + S .T ) ) + Q ,
232240 zeros ((2 ,2 )) )
233- assert_array_almost_equal ((B .T * X * A + S .T ) / (B .T * X * B + R ), G )
241+ assert_array_almost_equal ((B .T . dot ( X ). dot ( A ) + S .T ) / (B .T . dot ( X ). dot ( B ) + R ), G )
234242 # check for stable closed loop
235- lam = eigvals (A - B * G , E )
243+ lam = eigvals (A - B . dot ( G ) , E )
236244 assert_array_less (abs (lam ), 1.0 )
237245
238246def suite ():
0 commit comments