@@ -496,8 +496,57 @@ def test_freqresp_mimo(self):
496
496
np .testing .assert_array_equal (omega ,true_omega )
497
497
498
498
# Tests for TransferFunction.pole and TransferFunction.zero.
499
-
500
- @unittest .skipIf (not slycot_check (),"slycot not installed" )
499
+
500
+ def test_common_den (self ):
501
+ """ Test the helper function to compute common denomitators."""
502
+
503
+ # _common_den() computes the common denominator per input/column.
504
+ # The testing columns are:
505
+ # 0: no common poles
506
+ # 1: regular common poles
507
+ # 2: poles with multiplicity,
508
+ # 3: complex poles
509
+ # 4: complex poles below threshold
510
+
511
+ eps = np .finfo (float ).eps
512
+ tol_imag = np .sqrt (eps * 5 * 2 * 2 )* 0.9
513
+
514
+ numin = [[[1. ], [1. ], [1. ], [1. ], [1. ]],
515
+ [[1. ], [1. ], [1. ], [1. ], [1. ]]]
516
+ denin = [[[1. ,3. ,2. ],# 0: poles: [-1, -2]
517
+ [1. ,6. ,11. ,6. ],# 1: poles: [-1, -2, -3]
518
+ [1. ,6. ,11. ,6. ],# 2: poles: [-1, -2, -3]
519
+ [1. ,6. ,11. ,6. ],# 3: poles: [-1, -2, -3]
520
+ [1. ,6. ,11. ,6. ]],# 4: poles: [-1, -2, -3],
521
+ [[1. ,12. ,47. ,60. ],# 0: poles: [-3, -4, -5]
522
+ [1. ,9. ,26. ,24. ],# 1: poles: [-2, -3, -4]
523
+ [1. ,7. ,16. ,12. ],# 2: poles: [-2, -2, -3]
524
+ [1. ,7. ,17. ,15. ],# 3: poles: [-2+1J, -2-1J, -3],
525
+ np .poly ([- 2 + tol_imag * 1J ,- 2 - tol_imag * 1J ,- 3 ])]]
526
+ numref = np .array ([
527
+ [[0. ,0. ,1. ,12. ,47. ,60. ],
528
+ [0. ,0. ,0. ,1. ,4. ,0. ],
529
+ [0. ,0. ,0. ,1. ,2. ,0. ],
530
+ [0. ,0. ,0. ,1. ,4. ,5. ],
531
+ [0. ,0. ,0. ,1. ,2. ,0. ]],
532
+ [[0. ,0. ,0. ,1. ,3. ,2. ],
533
+ [0. ,0. ,0. ,1. ,1. ,0. ],
534
+ [0. ,0. ,0. ,1. ,1. ,0. ],
535
+ [0. ,0. ,0. ,1. ,3. ,2. ],
536
+ [0. ,0. ,0. ,1. ,1. ,0. ]]])
537
+ denref = np .array (
538
+ [[1. ,15. ,85. ,225. ,274. ,120. ],
539
+ [1. ,10. ,35. ,50. ,24. ,0. ],
540
+ [1. ,8. ,23. ,28. ,12. ,0. ],
541
+ [1. ,10. ,40. ,80. ,79. ,30. ],
542
+ [1. ,8. ,23. ,28. ,12. ,0. ]])
543
+ sys = TransferFunction (numin ,denin )
544
+ num ,den ,denorder = sys ._common_den ()
545
+ np .testing .assert_array_almost_equal (num [:2 , :, :],numref )
546
+ np .testing .assert_array_almost_equal (num [2 :, :, :],
547
+ np .zeros ((3 ,5 ,6 )))
548
+ np .testing .assert_array_almost_equal (den ,denref )
549
+
501
550
def test_pole_mimo (self ):
502
551
"""Test for correct MIMO poles."""
503
552
@@ -508,13 +557,12 @@ def test_pole_mimo(self):
508
557
509
558
np .testing .assert_array_almost_equal (p , [- 2. ,- 2. ,- 7. ,- 3. ,- 2. ])
510
559
511
- @unittest .skipIf (not slycot_check (),"slycot not installed" )
512
560
def test_double_cancelling_poles_siso (self ):
513
-
561
+
514
562
H = TransferFunction ([1 ,1 ], [1 ,2 ,1 ])
515
563
p = H .pole ()
516
564
np .testing .assert_array_almost_equal (p , [- 1 ,- 1 ])
517
-
565
+
518
566
# Tests for TransferFunction.feedback
519
567
def test_feedback_siso (self ):
520
568
"""Test for correct SISO transfer function feedback."""