@@ -67,129 +67,105 @@ def test_td04ad_static(self):
6767# ===================================================
6868# Begin tb05ad tests
6969import numpy as np
70- from control import ss
7170
72- from scipy import linalg
7371from numpy .testing import assert_raises , assert_almost_equal
7472from numpy .testing import assert_array_almost_equal , dec
7573
7674CASES = {}
7775
78- CASES ['fail1' ] = ss ( np .array ([[- 0.5 , 0. , 0. , 0. ],
76+ CASES ['fail1' ] = { 'A' : np .array ([[- 0.5 , 0. , 0. , 0. ],
7977 [ 0. , - 1. , 0. , 0. ],
8078 [ 1. , 0. , - 0.5 , 0. ],
8179 [ 0. , 1. , 0. , - 1. ]]),
82- np .array ([[ 1. , 0. ],
80+ 'B' : np .array ([[ 1. , 0. ],
8381 [ 0. , 1. ],
8482 [ 0. , 0. ],
8583 [ 0. , 0. ]]),
86- np .array ([[ 0. , 1. , 1. , 0. ],
84+ 'C' : np .array ([[ 0. , 1. , 1. , 0. ],
8785 [ 0. , 1. , 0. , 1. ],
88- [ 0. , 1. , 1. , 1. ]]),
89- np .zeros ([3 ,2 ]) )
86+ [ 0. , 1. , 1. , 1. ]])}
9087
9188n = 20
9289p = 10
9390m = 14
9491np .random .seed (40 )
95- CASES ['pass1' ] = ss (np .random .rand (n , n ),
96- np .random .rand (n , m ),
97- np .random .rand (p , n ),
98- np .zeros ([p ,m ]))
92+
93+ CASES ['pass1' ] = {'A' : np .random .rand (n , n ),
94+ 'B' : np .random .rand (n , m ),
95+ 'C' : np .random .rand (p , n )}
96+
9997
10098class test_tb05ad (unittest .TestCase ):
10199
102100 def setUp (self ):
103101 pass
104102
105- CASES = {}
106-
107- CASES ['fail1' ] = ss (np .array ([[- 0.5 , 0. , 0. , 0. ],
108- [ 0. , - 1. , 0. , 0. ],
109- [ 1. , 0. , - 0.5 , 0. ],
110- [ 0. , 1. , 0. , - 1. ]]),
111- np .array ([[ 1. , 0. ],
112- [ 0. , 1. ],
113- [ 0. , 0. ],
114- [ 0. , 0. ]]),
115- np .array ([[ 0. , 1. , 1. , 0. ],
116- [ 0. , 1. , 0. , 1. ],
117- [ 0. , 1. , 1. , 1. ]]),
118- np .zeros ([3 ,2 ]) )
119-
120- n = 20
121- p = 10
122- m = 14
123- np .random .seed (40 )
124- CASES ['pass1' ] = ss (np .random .rand (n , n ),
125- np .random .rand (n , m ),
126- np .random .rand (p , n ),
127- np .zeros ([p ,m ]))
128-
129-
130103 def test_tb05ad_ng (self ):
131104 for key in CASES :
132105 sys = CASES [key ]
133106 self .check_tb05ad_AG_NG (sys , 10 * 1j , 'NG' )
134107
135-
136- @dec .knownfailureif
108+ @dec .knownfailureif (True )
137109 def test_tb05ad_ag_failure (self ):
138110 # Test the failure when we do balancing on certain A matrices.
139- self .check_tb05ad_AG_NG (CASES ['fail1' ], 'AG' )
140-
111+ self .check_tb05ad_AG_NG (CASES ['fail1' ], 10 * 1j , 'AG' )
141112
142113 def test_tb05ad_nh (self ):
143114 # Test the conversion to Hessenberg form and subsequent solution.
144115 jomega = 10 * 1j
145116 for key in CASES :
146117 sys = CASES [key ]
147- sys2 = self .check_tb05ad_AG_NG (sys , jomega , 'NG' )
148- self .check_tb05ad_NH (sys2 , sys , jomega )
149-
118+ sys_transformed = self .check_tb05ad_AG_NG (sys , jomega , 'NG' )
119+ self .check_tb05ad_NH (sys_transformed , sys , jomega )
150120
151121 # Check error handling.
152122 def test_tb05ad_errors (self ):
153123 self .check_tb05ad_errors (CASES ['pass1' ])
154124
155-
156125 def check_tb05ad_AG_NG (self , sys , jomega , job ):
157- result = transform .tb05ad (sys .states , sys .inputs , sys .outputs , jomega ,
158- sys .A , sys .B , sys .C , job = job )
126+ n , m = sys ['B' ].shape
127+ p = sys ['C' ].shape [0 ]
128+ result = transform .tb05ad (n , m , p , jomega ,
129+ sys ['A' ], sys ['B' ], sys ['C' ], job = job )
159130 g_i = result [3 ]
160- hinvb = linalg .solve (np .eye (sys . states ) * jomega - sys . A , sys . B )
161- g_i_solve = sys . C .dot (hinvb )
131+ hinvb = np . linalg .solve (np .eye (n ) * jomega - sys [ 'A' ] , sys [ 'B' ] )
132+ g_i_solve = sys [ 'C' ] .dot (hinvb )
162133 np .testing .assert_almost_equal (g_i_solve , g_i )
163- return ss ( result [0 ], result [1 ], result [2 ], sys . D )
164-
134+ sys_transformed = { 'A' : result [0 ], 'B' : result [1 ], 'C' : result [2 ]}
135+ return sys_transformed
165136
166137 def check_tb05ad_NH (self , sys_transformed , sys , jomega ):
167- # When input matrices are already Hessenberg, output format changes.
168- result = transform .tb05ad (sys_transformed .states , sys_transformed .inputs ,
169- sys_transformed .outputs , jomega ,
170- sys_transformed .A , sys_transformed .B ,
171- sys_transformed .C , job = 'NH' )
138+ # Check that computing frequency response on the transformed
139+ # system gives the same result as computing C(sI - A)^-1B with
140+ # the original system.
141+
142+ n , m = sys_transformed ['B' ].shape
143+ p = sys_transformed ['C' ].shape [0 ]
144+ result = transform .tb05ad (n , m , p , jomega , sys_transformed ['A' ],
145+ sys_transformed ['B' ], sys_transformed ['C' ],
146+ job = 'NH' )
172147 g_i = result [0 ]
173- hinvb = linalg .solve (np .eye (sys . states ) * jomega - sys . A , sys . B )
174- g_i_solve = sys . C .dot (hinvb )
148+ hinvb = np . linalg .solve (np .eye (n ) * jomega - sys [ 'A' ] , sys [ 'B' ] )
149+ g_i_solve = sys [ 'C' ] .dot (hinvb )
175150 np .testing .assert_almost_equal (g_i_solve , g_i )
176151
177-
178152 def check_tb05ad_errors (self , sys ):
153+ n , m = sys ['B' ].shape
154+ p = sys ['C' ].shape [0 ]
179155 jomega = 10 * 1j
180156 # test error handling
181157 # wrong size A
182- assert_raises (ValueError , transform .tb05ad , sys . states + 1 ,
183- sys . inputs , sys . outputs , jomega , sys . A , sys . B , sys . C , job = 'NH' )
158+ assert_raises (ValueError , transform .tb05ad , n + 1 , m , p ,
159+ jomega , sys [ 'A' ] , sys [ 'B' ] , sys [ 'C' ] , job = 'NH' )
184160 # wrong size B
185- assert_raises (ValueError , transform .tb05ad , sys . states ,
186- sys . inputs + 1 , sys . outputs , jomega , sys . A , sys . B , sys . C , job = 'NH' )
161+ assert_raises (ValueError , transform .tb05ad , n , m + 1 , p ,
162+ jomega , sys [ 'A' ] , sys [ 'B' ] , sys [ 'C' ] , job = 'NH' )
187163 # wrong size C
188- assert_raises (ValueError , transform .tb05ad ,sys . states ,
189- sys . inputs , sys . outputs + 1 , jomega , sys . A , sys . B , sys . C , job = 'NH' )
164+ assert_raises (ValueError , transform .tb05ad , n , m , p + 1 ,
165+ jomega , sys [ 'A' ] , sys [ 'B' ] , sys [ 'C' ] , job = 'NH' )
190166 # unrecognized job
191- assert_raises (ValueError , transform .tb05ad ,sys . states ,
192- sys . inputs , sys . outputs , jomega , sys . A , sys . B , sys . C , job = 'a' )
167+ assert_raises (ValueError , transform .tb05ad , n , m , p , jomega ,
168+ sys [ 'A' ] , sys [ 'B' ] , sys [ 'C' ] , job = 'a' )
193169
194170
195171
0 commit comments