@@ -15,7 +15,25 @@ class TestMargin(unittest.TestCase):
1515 """These are tests for the margin commands in margin.py."""
1616
1717 def setUp (self ):
18+ # system, gain margin, gm freq, phase margin, pm freq
19+ s = TransferFunction ([1 , 0 ], [1 ])
20+ self .tsys = (
21+ (TransferFunction ([1 , 2 ], [1 , 2 , 3 ]),
22+ [], [], [], []),
23+ (TransferFunction ([1 ], [1 , 2 , 3 , 4 ]),
24+ [2.001 ], [1.7321 ], [], []),
25+ (StateSpace ([[1. , 4. ], [3. , 2. ]], [[1. ], [- 4. ]],
26+ [[1. , 0. ]], [[0. ]]),
27+ [], [], [147.0743 ], [2.5483 ]),
28+ ((8.75 * (4 * s ** 2 + 0.4 * s + 1 ))/ ((100 * s + 1 )* (s ** 2 + 0.22 * s + 1 )) *
29+ 1. / (s ** 2 / (10. ** 2 )+ 2 * 0.04 * s / 10. + 1 ),
30+ [2.2716 ], [10.0053 ], [97.5941 , 360 - 157.7904 , 134.7359 ],
31+ [0.0850 , 0.9373 , 1.0919 ]))
32+
33+
1834 self .sys1 = TransferFunction ([1 , 2 ], [1 , 2 , 3 ])
35+ # alternative
36+ # sys1 = tf([1, 2], [1, 2, 3])
1937 self .sys2 = TransferFunction ([1 ], [1 , 2 , 3 , 4 ])
2038 self .sys3 = StateSpace ([[1. , 4. ], [3. , 2. ]], [[1. ], [- 4. ]],
2139 [[1. , 0. ]], [[0. ]])
@@ -24,17 +42,33 @@ def setUp(self):
2442 1. / (s ** 2 / (10. ** 2 )+ 2 * 0.04 * s / 10. + 1 )
2543
2644 def test_stability_margins (self ):
27- omega = np .logspace (- 2 , 2 , 200 )
28- for sys in (self .sys1 , self .sys2 , self .sys3 , self .sys4 ):
29- out = stability_margins (sys )
45+ omega = np .logspace (- 2 , 2 , 2000 )
46+ for sys ,rgm ,rwgm ,rpm ,rwpm in self .tsys :
47+ print (sys )
48+ out = np .array (stability_margins (sys ))
3049 gm , pm , sm , wg , wp , ws = out
31- outf = stability_margins (FRD (sys , omega ))
32- print (sys , out , outf )
33- np .testing .assert_array_almost_equal (out , outf , 3 )
50+ outf = np .array (stability_margins (FRD (sys , omega )))
51+ print (out ,'\n ' , outf )
52+ print (out != np .array (None ))
53+ np .testing .assert_array_almost_equal (
54+ out [out != np .array (None )],
55+ outf [outf != np .array (None )], 2 )
56+
3457 # final one with fixed values
3558 np .testing .assert_array_almost_equal (
3659 [gm , pm , sm , wg , wp , ws ],
37- [2.2716 , 97.5941 , 0.9633 , 10.0053 , 0.0850 , 0.4064 ], 3 )
60+ [2.2716 , 97.5941 , 0.5591 , 10.0053 , 0.0850 , 9.9918 ], 3 )
61+
62+ def test_stability_margins_all (self ):
63+ for sys ,rgm ,rwgm ,rpm ,rwpm in self .tsys :
64+ out = stability_margins (sys , returnall = True )
65+ gm , pm , sm , wg , wp , ws = out
66+ print (sys )
67+ for res ,comp in zip (out , (rgm ,rpm ,[],rwgm ,rwpm ,[])):
68+ if comp :
69+ print (res , '\n ' , comp )
70+ np .testing .assert_array_almost_equal (
71+ res , comp , 2 )
3872
3973 def test_phase_crossover_frequencies (self ):
4074 omega , gain = phase_crossover_frequencies (self .sys2 )
@@ -57,8 +91,9 @@ def test_mag_phase_omega(self):
5791 # test for bug reported in gh-58
5892 sys = TransferFunction (15 , [1 , 6 , 11 , 6 ])
5993 out = stability_margins (sys )
60- omega = np .logspace (- 1 , 1 , 100 )
94+ omega = np .logspace (- 2 , 2 , 1000 )
6195 mag , phase , omega = sys .freqresp (omega )
96+ #print( mag, phase, omega)
6297 out2 = stability_margins ((mag , phase * 180 / np .pi , omega ))
6398 ind = [0 ,1 ,3 ,4 ] # indices of gm, pm, wg, wp -- ignore sm
6499 marg1 = np .array (out )[ind ]
0 commit comments