def test_iosys_print(self): # Send the output to /dev/null import os f = open(os.devnull,"w") # Simple I/O system iosys = ct.ss2io(self.siso_linsys) print(iosys, file=f) # I/O system without ninputs, noutputs ios_unspecified = ios.NonlinearIOSystem(secord_update, secord_output) print(ios_unspecified, file=f) # I/O system with derived inputs and outputs ios_linearized = ios.linearize(ios_unspecified, [0, 0], [0]) print(ios_linearized, file=f) f.close()
def test_params(self): # Start with the default set of parameters ios_secord_default = ios.NonlinearIOSystem( secord_update, secord_output, inputs=1, outputs=1, states=2) lin_secord_default = ios.linearize(ios_secord_default, [0, 0], [0]) w_default, v_default = np.linalg.eig(lin_secord_default.A) # New copy, with modified parameters ios_secord_update = ios.NonlinearIOSystem( secord_update, secord_output, inputs=1, outputs=1, states=2, params={'omega0':2, 'zeta':0}) # Make sure the default parameters haven't changed lin_secord_check = ios.linearize(ios_secord_default, [0, 0], [0]) w, v = np.linalg.eig(lin_secord_check.A) np.testing.assert_array_almost_equal(np.sort(w), np.sort(w_default)) # Make sure updated system parameters got set correctly lin_secord_update = ios.linearize(ios_secord_update, [0, 0], [0]) w, v = np.linalg.eig(lin_secord_update.A) np.testing.assert_array_almost_equal(np.sort(w), np.sort([2j, -2j])) # Change the parameters of the default sys just for the linearization lin_secord_local = ios.linearize(ios_secord_default, [0, 0], [0], params={'zeta':0}) w, v = np.linalg.eig(lin_secord_local.A) np.testing.assert_array_almost_equal(np.sort(w), np.sort([1j, -1j])) # Change the parameters of the updated sys just for the linearization lin_secord_local = ios.linearize(ios_secord_update, [0, 0], [0], params={'zeta':0, 'omega0':3}) w, v = np.linalg.eig(lin_secord_local.A) np.testing.assert_array_almost_equal(np.sort(w), np.sort([3j, -3j])) # Make sure that changes propagate through interconnections ios_series_default_local = ios_secord_default * ios_secord_update lin_series_default_local = ios.linearize( ios_series_default_local, [0, 0, 0, 0], [0]) w, v = np.linalg.eig(lin_series_default_local.A) np.testing.assert_array_almost_equal( np.sort(w), np.sort(np.concatenate((w_default, [2j, -2j])))) # Show that we can change the parameters at linearization lin_series_override = ios.linearize( ios_series_default_local, [0, 0, 0, 0], [0], params={'zeta':0, 'omega0':4}) w, v = np.linalg.eig(lin_series_override.A) np.testing.assert_array_almost_equal(w, [4j, -4j, 4j, -4j]) # Check for warning if we try to set params for LinearIOSystem linsys = self.siso_linsys iosys = ios.LinearIOSystem(linsys) T, U, X0 = self.T, self.U, self.X0 lti_t, lti_y, lti_x = ct.forced_response(linsys, T, U, X0) with warnings.catch_warnings(record=True) as warnval: # Turn off deprecation warnings warnings.simplefilter("ignore", category=DeprecationWarning) warnings.simplefilter("ignore", category=PendingDeprecationWarning) # Trigger a warning ios_t, ios_y = ios.input_output_response( iosys, T, U, X0, params={'something':0}) # Verify that we got a warning self.assertEqual(len(warnval), 1) self.assertTrue(issubclass(warnval[-1].category, UserWarning)) self.assertTrue("LinearIOSystem" in str(warnval[-1].message)) self.assertTrue("ignored" in str(warnval[-1].message)) # Check to make sure results are OK np.testing.assert_array_almost_equal(lti_t, ios_t) np.testing.assert_array_almost_equal(lti_y, ios_y, decimal=3)