Skip to content

Commit e753d29

Browse files
author
Kevin Chen
committed
Separated tests in TestSlycot.py
Lauren Padilla <lpadilla@princeton.edu>
1 parent d833c95 commit e753d29

1 file changed

Lines changed: 98 additions & 28 deletions

File tree

src/TestSlycot.py

Lines changed: 98 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,112 @@
11
#!/usr/bin/env python
22

3-
#### THIS MUST BE MADE INTO A UNITTEST TO BE PART OF THE TESTING FUNCTIONS!!!!
4-
53

64
import numpy as np
75
from slycot import tb04ad, td04ad
86
import matlab
7+
import unittest
98

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
319

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)
3582
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+
"""
36106
#These are here for once the above is made into a unittest.
37107
def suite():
38-
return unittest.TestLoader().loadTestsFromTestCase(TestSlycot)
108+
return unittest.TestLoader().loadTestsFromTestCase(TestSlycot)
39109

40110
if __name__=='__main__':
41-
unittest.main()
111+
unittest.main()
42112

0 commit comments

Comments
 (0)