|
11 | 11 | from __future__ import print_function |
12 | 12 | import unittest |
13 | 13 | import numpy as np |
| 14 | +from scipy.linalg import eigvals |
14 | 15 | import scipy as sp |
15 | 16 | from control.matlab import * |
16 | 17 | from control.frdata import FRD |
@@ -440,7 +441,34 @@ def testFRD(self): |
440 | 441 | assert isinstance(frd1, FRD) |
441 | 442 | frd2 = frd(frd1.fresp[0,0,:], omega) |
442 | 443 | assert isinstance(frd2, FRD) |
443 | | - |
| 444 | + |
| 445 | + def testMinreal(self, verbose=False): |
| 446 | + """Test a minreal model reduction""" |
| 447 | + #A = [-2, 0.5, 0; 0.5, -0.3, 0; 0, 0, -0.1] |
| 448 | + A = [[-2, 0.5, 0], [0.5, -0.3, 0], [0, 0, -0.1]] |
| 449 | + #B = [0.3, -1.3; 0.1, 0; 1, 0] |
| 450 | + B = [[0.3, -1.3], [0.1, 0.], [1.0, 0.0]] |
| 451 | + #C = [0, 0.1, 0; -0.3, -0.2, 0] |
| 452 | + C = [[0., 0.1, 0.0], [-0.3, -0.2, 0.0]] |
| 453 | + #D = [0 -0.8; -0.3 0] |
| 454 | + D = [[0., -0.8], [-0.3, 0.]] |
| 455 | + # sys = ss(A, B, C, D) |
| 456 | + |
| 457 | + sys = ss(A, B, C, D) |
| 458 | + sysr = minreal(sys) |
| 459 | + self.assertEqual(sysr.states, 2) |
| 460 | + self.assertEqual(sysr.inputs, sys.inputs) |
| 461 | + self.assertEqual(sysr.outputs, sys.outputs) |
| 462 | + np.testing.assert_array_almost_equal( |
| 463 | + eigvals(sysr.A), [-2.136154, -0.1638459]) |
| 464 | + |
| 465 | + s = tf([1, 0], [1]) |
| 466 | + h = (s+1)*(s+2.00000000001)/(s+2)/(s**2+s+1) |
| 467 | + hm = minreal(h) |
| 468 | + hr = (s+1)/(s**2+s+1) |
| 469 | + np.testing.assert_array_almost_equal(hm.num[0][0], hr.num[0][0]) |
| 470 | + np.testing.assert_array_almost_equal(hm.den[0][0], hr.den[0][0]) |
| 471 | + |
444 | 472 |
|
445 | 473 | #! TODO: not yet implemented |
446 | 474 | # def testMIMOtfdata(self): |
|
0 commit comments