|
1 | 1 | #!/usr/bin/env python |
2 | 2 |
|
3 | | -#### THIS MUST BE MADE INTO A UNITTEST TO BE PART OF THE TESTING FUNCTIONS!!!! |
4 | | - |
5 | 3 |
|
6 | 4 | import numpy as np |
7 | 5 | from slycot import tb04ad, td04ad |
8 | 6 | import matlab |
| 7 | +import unittest |
9 | 8 |
|
10 | | -numTests = 1 |
11 | | -maxStates = 3 |
12 | | -maxIO = 3 |
13 | | - |
14 | | -for states in range(1, maxStates): |
15 | | - for inputs in range(1, maxIO): |
16 | | - for outputs in range(1, maxIO): |
17 | | - sys1 = matlab.rss(states, inputs, outputs) |
18 | | - print "sys1" |
19 | | - print sys1 |
20 | | - |
21 | | - sys2 = tb04ad(states,inputs,outputs,sys1.A,sys1.B,sys1.C,sys1.D,outputs,outputs,inputs) |
22 | | - print "sys2" |
23 | | - print sys2 |
24 | | - |
25 | | - ldwork = 100*max(1,states+max(states,max(3*inputs,3*outputs))) |
26 | | - dwork = np.zeros(ldwork) |
27 | | - sys3 = td04ad(inputs,outputs,sys2[4],sys2[5],sys2[6]) |
28 | | - #sys3 = td04ad(inputs,outputs,sys2[4],sys2[5],sys2[6],ldwork) |
29 | | - print "sys3" |
30 | | - print sys3 |
31 | 9 |
|
32 | | - sys4 = tb04ad(states,inputs,outputs,sys3[1][0:states,0:states],sys3[2][0:states,0:inputs],sys3[3][0:outputs,0:states],sys3[4],outputs,outputs,inputs) |
33 | | - print "sys4" |
34 | | - print sys4 |
| 10 | +class TestSlycot(unittest.TestCase): |
| 11 | + def setUp(self): |
| 12 | + """Define some test parameters.""" |
| 13 | + self.numTests = 1 |
| 14 | + self.maxStates = 10 #seems to fail rarely with 4, sometimes with 5, frequently with 6. Could it be a problem with the subsystems? |
| 15 | + self.maxIO = 10 |
| 16 | + |
| 17 | + def testTF(self): |
| 18 | + """ Directly tests the functions tb04ad and td04ad through direct comparison of transfer function coefficients. |
| 19 | + Similar to TestConvert, but tests at a lower level. |
| 20 | + """ |
| 21 | + for states in range(1, self.maxStates): |
| 22 | + for inputs in range(1, self.maxIO+1): |
| 23 | + for outputs in range(1, self.maxIO+1): |
| 24 | + for testNum in range(self.numTests): |
| 25 | + |
| 26 | + ssOriginal = matlab.rss(states, inputs, outputs) |
| 27 | + |
| 28 | + print '====== Original SS ==========' |
| 29 | + print ssOriginal |
| 30 | + print 'states=',states |
| 31 | + print 'inputs=',inputs |
| 32 | + print 'outputs=',outputs |
| 33 | + |
| 34 | + |
| 35 | + tfOriginal_Actrb, tfOriginal_Bctrb, tfOriginal_Cctrb, tfOrigingal_nctrb, tfOriginal_index,\ |
| 36 | + tfOriginal_dcoeff, tfOriginal_ucoeff = tb04ad('R',states,inputs,outputs,\ |
| 37 | + ssOriginal.A,ssOriginal.B,ssOriginal.C,ssOriginal.D,tol1=1e-10) |
| 38 | + |
| 39 | + ssTransformed_nr, ssTransformed_A, ssTransformed_B, ssTransformed_C, ssTransformed_D\ |
| 40 | + = td04ad('R',inputs,outputs,tfOriginal_index,tfOriginal_dcoeff,tfOriginal_ucoeff,tol=1e-8) |
| 41 | + |
| 42 | + tfTransformed_Actrb, tfTransformed_Bctrb, tfTransformed_Cctrb, tfTransformed_nctrb,\ |
| 43 | + tfTransformed_index, tfTransformed_dcoeff, tfTransformed_ucoeff = tb04ad('R',\ |
| 44 | + ssTransformed_nr,inputs,outputs,ssTransformed_A, ssTransformed_B, ssTransformed_C,\ |
| 45 | + ssTransformed_D,tol1=1e-10) |
| 46 | + print 'size(Trans_A)=',ssTransformed_A.shape |
| 47 | + print 'Trans_nr=',ssTransformed_nr |
| 48 | + print 'tfOrig_index=',tfOriginal_index |
| 49 | + print 'tfOrig_ucoeff=',tfOriginal_ucoeff |
| 50 | + print 'tfOrig_dcoeff=',tfOriginal_dcoeff |
| 51 | + print 'tfTrans_index=',tfTransformed_index |
| 52 | + print 'tfTrans_ucoeff=',tfTransformed_ucoeff |
| 53 | + print 'tfTrans_dcoeff=',tfTransformed_dcoeff |
| 54 | + #Compare the TF directly, must match |
| 55 | + #numerators |
| 56 | + np.testing.assert_array_almost_equal(tfOriginal_ucoeff,tfTransformed_ucoeff,decimal=3) |
| 57 | + #denominators |
| 58 | + np.testing.assert_array_almost_equal(tfOriginal_dcoeff,tfTransformed_dcoeff,decimal=3) |
| 59 | + |
| 60 | + def testFreqResp(self): |
| 61 | + """Compare the bode reponses of the SS systems and TF systems to the original SS |
| 62 | + They generally are different realizations but have same freq resp. |
| 63 | + Currently this test may only be applied to SISO systems. |
| 64 | + |
| 65 | + for states in range(1,self.maxStates): |
| 66 | + for testNum in range(self.numTests): |
| 67 | + for inputs in range(1,self.maxIO+1): |
| 68 | + for outputs in range(1,self.maxIO+1): |
| 69 | + ssOriginal = matlab.rss(states, inputs, outputs) |
| 70 | + |
| 71 | + tfOriginal_Actrb, tfOriginal_Bctrb, tfOriginal_Cctrb, tfOrigingal_nctrb, tfOriginal_index,\ |
| 72 | + tfOriginal_dcoeff, tfOriginal_ucoeff = tb04ad('R',states,inputs,outputs,\ |
| 73 | + ssOriginal.A,ssOriginal.B,ssOriginal.C,ssOriginal.D,tol1=1e-10) |
| 74 | + |
| 75 | + ssTransformed_nr, ssTransformed_A, ssTransformed_B, ssTransformed_C, ssTransformed_D\ |
| 76 | + = td04ad('R',inputs,outputs,tfOriginal_index,tfOriginal_dcoeff,tfOriginal_ucoeff,tol=1e-8) |
| 77 | + |
| 78 | + tfTransformed_Actrb, tfTransformed_Bctrb, tfTransformed_Cctrb, tfTransformed_nctrb,\ |
| 79 | + tfTransformed_index, tfTransformed_dcoeff, tfTransformed_ucoeff = tb04ad('R',\ |
| 80 | + ssTransformed_nr,inputs,outputs,ssTransformed_A, ssTransformed_B, ssTransformed_C,\ |
| 81 | + ssTransformed_D,tol1=1e-10) |
35 | 82 |
|
| 83 | + numTransformed = np.array(tfTransformed_ucoeff) |
| 84 | + denTransformed = np.array(tfTransformed_dcoeff) |
| 85 | + numOriginal = np.array(tfOriginal_ucoeff) |
| 86 | + denOriginal = np.array(tfOriginal_dcoeff) |
| 87 | + |
| 88 | + ssTransformed = matlab.ss(ssTransformed_A,ssTransformed_B,ssTransformed_C,ssTransformed_D) |
| 89 | + for inputNum in range(inputs): |
| 90 | + for outputNum in range(outputs): |
| 91 | + #[ssOriginalMag,ssOriginalPhase,freq] = matlab.bode(ssOriginal,Plot=False) |
| 92 | + [tfOriginalMag,tfOriginalPhase,freq] = matlab.bode(matlab.tf(numOriginal[outputNum][inputNum],denOriginal[outputNum]),Plot=False) |
| 93 | + #[ssTransformedMag,ssTransformedPhase,freq] = matlab.bode(ssTransformed,freq,Plot=False) |
| 94 | + [tfTransformedMag,tfTransformedPhase,freq] = matlab.bode(matlab.tf(numTransformed[outputNum][inputNum],denTransformed[outputNum]),freq,Plot=False) |
| 95 | + print 'numOrig=',numOriginal[outputNum][inputNum] |
| 96 | + print 'denOrig=',denOriginal[outputNum] |
| 97 | + print 'numTrans=',numTransformed[outputNum][inputNum] |
| 98 | + print 'denTrans=',denTransformed[outputNum] |
| 99 | + #np.testing.assert_array_almost_equal(ssOriginalMag,tfOriginalMag,decimal=3) |
| 100 | + #np.testing.assert_array_almost_equal(ssOriginalPhase,tfOriginalPhase,decimal=3) |
| 101 | + #np.testing.assert_array_almost_equal(ssOriginalMag,ssTransformedMag,decimal=3) |
| 102 | + #np.testing.assert_array_almost_equal(ssOriginalPhase,ssTransformedPhase,decimal=3) |
| 103 | + #np.testing.assert_array_almost_equal(tfOriginalMag,tfTransformedMag,decimal=3) |
| 104 | + np.testing.assert_array_almost_equal(tfOriginalPhase,tfTransformedPhase,decimal=2) |
| 105 | + """ |
36 | 106 | #These are here for once the above is made into a unittest. |
37 | 107 | def suite(): |
38 | | - return unittest.TestLoader().loadTestsFromTestCase(TestSlycot) |
| 108 | + return unittest.TestLoader().loadTestsFromTestCase(TestSlycot) |
39 | 109 |
|
40 | 110 | if __name__=='__main__': |
41 | | - unittest.main() |
| 111 | + unittest.main() |
42 | 112 |
|
0 commit comments