Merge pull request #762 from bnavigator/slycot-balred-reorder · python-control/python-control@87a9c57
@@ -182,17 +182,33 @@ def testBalredTruncate(self, matarrayin):
182182B = matarrayin([[2.], [0.], [0.], [0.]])
183183C = matarrayin([[0.5, 0.6875, 0.7031, 0.5]])
184184D = matarrayin([[0.]])
185+185186sys = StateSpace(A, B, C, D)
186187orders = 2
187188rsys = balred(sys, orders, method='truncate')
189+Ar, Br, Cr, Dr = rsys.A, rsys.B, rsys.C, rsys.D
190+191+# Result from MATLAB
188192Artrue = np.array([[-1.958, -1.194], [-1.194, -0.8344]])
189193Brtrue = np.array([[0.9057], [0.4068]])
190194Crtrue = np.array([[0.9057, 0.4068]])
191195Drtrue = np.array([[0.]])
192-np.testing.assert_array_almost_equal(rsys.A, Artrue, decimal=2)
193-np.testing.assert_array_almost_equal(rsys.B, Brtrue, decimal=4)
194-np.testing.assert_array_almost_equal(rsys.C, Crtrue, decimal=4)
195-np.testing.assert_array_almost_equal(rsys.D, Drtrue, decimal=4)
196+197+# Look for possible changes in state in slycot
198+T1 = np.array([[1, 0], [0, -1]])
199+T2 = np.array([[-1, 0], [0, 1]])
200+T3 = np.array([[0, 1], [1, 0]])
201+for T in (T1, T2, T3):
202+if np.allclose(T @ Ar @ T, Artrue, atol=1e-2, rtol=1e-2):
203+# Apply a similarity transformation
204+Ar, Br, Cr = T @ Ar @ T, T @ Br, Cr @ T
205+break
206+207+# Make sure we got the correct answer
208+np.testing.assert_array_almost_equal(Ar, Artrue, decimal=2)
209+np.testing.assert_array_almost_equal(Br, Brtrue, decimal=4)
210+np.testing.assert_array_almost_equal(Cr, Crtrue, decimal=4)
211+np.testing.assert_array_almost_equal(Dr, Drtrue, decimal=4)
196212197213@slycotonly
198214def testBalredMatchDC(self, matarrayin):
@@ -207,16 +223,32 @@ def testBalredMatchDC(self, matarrayin):
207223B = matarrayin([[2.], [0.], [0.], [0.]])
208224C = matarrayin([[0.5, 0.6875, 0.7031, 0.5]])
209225D = matarrayin([[0.]])
226+210227sys = StateSpace(A, B, C, D)
211228orders = 2
212229rsys = balred(sys,orders,method='matchdc')
230+Ar, Br, Cr, Dr = rsys.A, rsys.B, rsys.C, rsys.D
231+232+# Result from MATLAB
213233Artrue = np.array(
214234 [[-4.43094773, -4.55232904],
215235 [-4.55232904, -5.36195206]])
216236Brtrue = np.array([[1.36235673], [1.03114388]])
217237Crtrue = np.array([[1.36235673, 1.03114388]])
218238Drtrue = np.array([[-0.08383902]])
219-np.testing.assert_array_almost_equal(rsys.A, Artrue, decimal=2)
220-np.testing.assert_array_almost_equal(rsys.B, Brtrue, decimal=4)
221-np.testing.assert_array_almost_equal(rsys.C, Crtrue, decimal=4)
222-np.testing.assert_array_almost_equal(rsys.D, Drtrue, decimal=4)
239+240+# Look for possible changes in state in slycot
241+T1 = np.array([[1, 0], [0, -1]])
242+T2 = np.array([[-1, 0], [0, 1]])
243+T3 = np.array([[0, 1], [1, 0]])
244+for T in (T1, T2, T3):
245+if np.allclose(T @ Ar @ T, Artrue, atol=1e-2, rtol=1e-2):
246+# Apply a similarity transformation
247+Ar, Br, Cr = T @ Ar @ T, T @ Br, Cr @ T
248+break
249+250+# Make sure we got the correct answer
251+np.testing.assert_array_almost_equal(Ar, Artrue, decimal=2)
252+np.testing.assert_array_almost_equal(Br, Brtrue, decimal=4)
253+np.testing.assert_array_almost_equal(Cr, Crtrue, decimal=4)
254+np.testing.assert_array_almost_equal(Dr, Drtrue, decimal=4)