|
From: <kk...@us...> - 2011-02-08 22:20:04
|
Revision: 123
http://python-control.svn.sourceforge.net/python-control/?rev=123&view=rev
Author: kkchen
Date: 2011-02-08 22:19:58 +0000 (Tue, 08 Feb 2011)
Log Message:
-----------
Separated tests in TestSlycot.py
Lauren Padilla <lpa...@pr...>
Modified Paths:
--------------
branches/control-0.4a/src/TestSlycot.py
Modified: branches/control-0.4a/src/TestSlycot.py
===================================================================
--- branches/control-0.4a/src/TestSlycot.py 2011-02-08 22:19:52 UTC (rev 122)
+++ branches/control-0.4a/src/TestSlycot.py 2011-02-08 22:19:58 UTC (rev 123)
@@ -1,42 +1,112 @@
#!/usr/bin/env python
-#### THIS MUST BE MADE INTO A UNITTEST TO BE PART OF THE TESTING FUNCTIONS!!!!
-
import numpy as np
from slycot import tb04ad, td04ad
import matlab
+import unittest
-numTests = 1
-maxStates = 3
-maxIO = 3
-for states in range(1, maxStates):
- for inputs in range(1, maxIO):
- for outputs in range(1, maxIO):
- sys1 = matlab.rss(states, inputs, outputs)
- print "sys1"
- print sys1
+class TestSlycot(unittest.TestCase):
+ def setUp(self):
+ """Define some test parameters."""
+ self.numTests = 1
+ self.maxStates = 10 #seems to fail rarely with 4, sometimes with 5, frequently with 6. Could it be a problem with the subsystems?
+ self.maxIO = 10
+
+ def testTF(self):
+ """ Directly tests the functions tb04ad and td04ad through direct comparison of transfer function coefficients.
+ Similar to TestConvert, but tests at a lower level.
+ """
+ for states in range(1, self.maxStates):
+ for inputs in range(1, self.maxIO+1):
+ for outputs in range(1, self.maxIO+1):
+ for testNum in range(self.numTests):
+
+ ssOriginal = matlab.rss(states, inputs, outputs)
+
+ print '====== Original SS =========='
+ print ssOriginal
+ print 'states=',states
+ print 'inputs=',inputs
+ print 'outputs=',outputs
+
+
+ tfOriginal_Actrb, tfOriginal_Bctrb, tfOriginal_Cctrb, tfOrigingal_nctrb, tfOriginal_index,\
+ tfOriginal_dcoeff, tfOriginal_ucoeff = tb04ad('R',states,inputs,outputs,\
+ ssOriginal.A,ssOriginal.B,ssOriginal.C,ssOriginal.D,tol1=1e-10)
+
+ ssTransformed_nr, ssTransformed_A, ssTransformed_B, ssTransformed_C, ssTransformed_D\
+ = td04ad('R',inputs,outputs,tfOriginal_index,tfOriginal_dcoeff,tfOriginal_ucoeff,tol=1e-8)
+
+ tfTransformed_Actrb, tfTransformed_Bctrb, tfTransformed_Cctrb, tfTransformed_nctrb,\
+ tfTransformed_index, tfTransformed_dcoeff, tfTransformed_ucoeff = tb04ad('R',\
+ ssTransformed_nr,inputs,outputs,ssTransformed_A, ssTransformed_B, ssTransformed_C,\
+ ssTransformed_D,tol1=1e-10)
+ print 'size(Trans_A)=',ssTransformed_A.shape
+ print 'Trans_nr=',ssTransformed_nr
+ print 'tfOrig_index=',tfOriginal_index
+ print 'tfOrig_ucoeff=',tfOriginal_ucoeff
+ print 'tfOrig_dcoeff=',tfOriginal_dcoeff
+ print 'tfTrans_index=',tfTransformed_index
+ print 'tfTrans_ucoeff=',tfTransformed_ucoeff
+ print 'tfTrans_dcoeff=',tfTransformed_dcoeff
+ #Compare the TF directly, must match
+ #numerators
+ np.testing.assert_array_almost_equal(tfOriginal_ucoeff,tfTransformed_ucoeff,decimal=3)
+ #denominators
+ np.testing.assert_array_almost_equal(tfOriginal_dcoeff,tfTransformed_dcoeff,decimal=3)
+
+ def testFreqResp(self):
+ """Compare the bode reponses of the SS systems and TF systems to the original SS
+ They generally are different realizations but have same freq resp.
+ Currently this test may only be applied to SISO systems.
+
+ for states in range(1,self.maxStates):
+ for testNum in range(self.numTests):
+ for inputs in range(1,self.maxIO+1):
+ for outputs in range(1,self.maxIO+1):
+ ssOriginal = matlab.rss(states, inputs, outputs)
+
+ tfOriginal_Actrb, tfOriginal_Bctrb, tfOriginal_Cctrb, tfOrigingal_nctrb, tfOriginal_index,\
+ tfOriginal_dcoeff, tfOriginal_ucoeff = tb04ad('R',states,inputs,outputs,\
+ ssOriginal.A,ssOriginal.B,ssOriginal.C,ssOriginal.D,tol1=1e-10)
+
+ ssTransformed_nr, ssTransformed_A, ssTransformed_B, ssTransformed_C, ssTransformed_D\
+ = td04ad('R',inputs,outputs,tfOriginal_index,tfOriginal_dcoeff,tfOriginal_ucoeff,tol=1e-8)
+
+ tfTransformed_Actrb, tfTransformed_Bctrb, tfTransformed_Cctrb, tfTransformed_nctrb,\
+ tfTransformed_index, tfTransformed_dcoeff, tfTransformed_ucoeff = tb04ad('R',\
+ ssTransformed_nr,inputs,outputs,ssTransformed_A, ssTransformed_B, ssTransformed_C,\
+ ssTransformed_D,tol1=1e-10)
- sys2 = tb04ad(states,inputs,outputs,sys1.A,sys1.B,sys1.C,sys1.D,outputs,outputs,inputs)
- print "sys2"
- print sys2
-
- ldwork = 100*max(1,states+max(states,max(3*inputs,3*outputs)))
- dwork = np.zeros(ldwork)
- sys3 = td04ad(inputs,outputs,sys2[4],sys2[5],sys2[6])
- #sys3 = td04ad(inputs,outputs,sys2[4],sys2[5],sys2[6],ldwork)
- print "sys3"
- print sys3
-
- 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)
- print "sys4"
- print sys4
-
+ numTransformed = np.array(tfTransformed_ucoeff)
+ denTransformed = np.array(tfTransformed_dcoeff)
+ numOriginal = np.array(tfOriginal_ucoeff)
+ denOriginal = np.array(tfOriginal_dcoeff)
+
+ ssTransformed = matlab.ss(ssTransformed_A,ssTransformed_B,ssTransformed_C,ssTransformed_D)
+ for inputNum in range(inputs):
+ for outputNum in range(outputs):
+ #[ssOriginalMag,ssOriginalPhase,freq] = matlab.bode(ssOriginal,Plot=False)
+ [tfOriginalMag,tfOriginalPhase,freq] = matlab.bode(matlab.tf(numOriginal[outputNum][inputNum],denOriginal[outputNum]),Plot=False)
+ #[ssTransformedMag,ssTransformedPhase,freq] = matlab.bode(ssTransformed,freq,Plot=False)
+ [tfTransformedMag,tfTransformedPhase,freq] = matlab.bode(matlab.tf(numTransformed[outputNum][inputNum],denTransformed[outputNum]),freq,Plot=False)
+ print 'numOrig=',numOriginal[outputNum][inputNum]
+ print 'denOrig=',denOriginal[outputNum]
+ print 'numTrans=',numTransformed[outputNum][inputNum]
+ print 'denTrans=',denTransformed[outputNum]
+ #np.testing.assert_array_almost_equal(ssOriginalMag,tfOriginalMag,decimal=3)
+ #np.testing.assert_array_almost_equal(ssOriginalPhase,tfOriginalPhase,decimal=3)
+ #np.testing.assert_array_almost_equal(ssOriginalMag,ssTransformedMag,decimal=3)
+ #np.testing.assert_array_almost_equal(ssOriginalPhase,ssTransformedPhase,decimal=3)
+ #np.testing.assert_array_almost_equal(tfOriginalMag,tfTransformedMag,decimal=3)
+ np.testing.assert_array_almost_equal(tfOriginalPhase,tfTransformedPhase,decimal=2)
+ """
#These are here for once the above is made into a unittest.
def suite():
- return unittest.TestLoader().loadTestsFromTestCase(TestSlycot)
+ return unittest.TestLoader().loadTestsFromTestCase(TestSlycot)
if __name__=='__main__':
- unittest.main()
+ unittest.main()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|