def test_State_algebra_mul_rmul_mimo_siso(): sta_siso = State(5) sta_mimo = State(2.0 * np.eye(3)) dyn_siso = State(haroldcompanion([1, 3, 3, 1]), e_i(3, -1), e_i(3, 1).T) dyn_mimo = State(haroldcompanion([1, 3, 3, 1]), e_i(3, [1, 2]), np.eye(3)) dyn_mimo_sq = State(haroldcompanion([1, 3, 3, 1]), np.eye(3), np.eye(3)) G = dyn_siso * dyn_mimo J = np.array([[0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 1., 0., 1., 0., 0., 0., 0., 0., 0.], [-1., -3., -3., 0., 0., 0., 0., 1., 0., 0., 0.], [0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.], [0., 0., 0., -1., -3., -3., 0., 0., 0., 1., 0.], [0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.], [0., 0., 0., 0., 0., 0., -1., -3., -3., 0., 1.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.]]) assert_array_almost_equal(concatenate_state_matrices(G), J) G = dyn_mimo * dyn_siso assert_array_almost_equal(concatenate_state_matrices(G), J) G = dyn_mimo * sta_siso assert_array_almost_equal(G.b, 5 * dyn_mimo.b) assert_array_almost_equal(G.d, 5 * dyn_mimo.d) assert_raises(ValueError, sta_mimo.__add__, dyn_mimo) F = sta_mimo @ dyn_mimo J = np.array([[0., 1., 0., 0., 0.], [0., 0., 1., 1., 0.], [-1., -3., -3., 0., 1.], [2., 0., 0., 0., 0.], [0., 2., 0., 0., 0.], [0., 0., 2., 0., 0.]]) assert_array_almost_equal(concatenate_state_matrices(F), J) assert_almost_equal((dyn_mimo_sq + sta_mimo).d, 2 * np.eye(3))
def test_State_algebra_mimo_siso(): static_siso_state = State(5) static_mimo_state = State(2.0*np.eye(3)) dynamic_siso_state = State(haroldcompanion([1, 3, 3, 1]), e_i(3, -1), e_i(3, 1).T, 0) dynamic_mimo_state = State(haroldcompanion([1, 3, 3, 1]), e_i(3, [1, 2]), np.eye(3), np.zeros((3, 2))) dynamic_square_state = State(haroldcompanion([1, 3, 3, 1]), np.eye(3), np.eye(3), np.zeros((3, 3)) ) assert_raises(IndexError, dynamic_siso_state.__mul__, static_mimo_state) assert_raises(IndexError, dynamic_siso_state.__add__, static_mimo_state) assert_raises(IndexError, static_mimo_state.__add__, dynamic_mimo_state) assert_raises(IndexError, static_mimo_state.__add__, static_siso_state) assert_raises(IndexError, static_mimo_state.__mul__, static_siso_state) F = static_mimo_state @ dynamic_mimo_state assert_almost_equal(F.c, np.eye(3)*2.0) assert_almost_equal((dynamic_square_state + static_mimo_state).d, 2*np.eye(3))
def test_State_algebra_add_radd(): sta_siso = State(5) sta_mimo = State(2.0 * np.eye(3)) dyn_siso = State(haroldcompanion([1, 3, 3, 1]), e_i(3, -1), e_i(3, 1).T) dyn_mimo = State(haroldcompanion([1, 3, 3, 1]), e_i(3, [1, 2]), np.eye(3)) dyn_mimo_sq = State(haroldcompanion([1, 3, 3, 1]), np.eye(3), np.eye(3)) G = dyn_mimo + sta_siso assert_array_almost_equal(G.d, sta_siso.to_array() * np.ones(dyn_mimo.shape)) assert_raises(ValueError, dyn_mimo.__add__, sta_mimo) G = dyn_mimo_sq + sta_mimo assert_array_almost_equal(G.d, 2. * np.eye(3)) G = dyn_mimo + dyn_siso J = np.array([[0., 1., 0., 0., 0., 0., 0., 0.], [0., 0., 1., 0., 0., 0., 1., 0.], [-1., -3., -3., 0., 0., 0., 0., 1.], [0., 0., 0., 0., 1., 0., 0., 0.], [0., 0., 0., 0., 0., 1., 0., 0.], [0., 0., 0., -1., -3., -3., 1., 1.], [1., 0., 0., 0., 1., 0., 0., 0.], [0., 1., 0., 0., 1., 0., 0., 0.], [0., 0., 1., 0., 1., 0., 0., 0.]]) assert_array_almost_equal(concatenate_state_matrices(G), J) assert_raises(ValueError, dyn_mimo.__add__, dyn_mimo_sq) assert_raises(ValueError, dyn_mimo.__sub__, dyn_mimo_sq) assert_raises(ValueError, dyn_mimo.__radd__, dyn_mimo_sq) assert_raises(ValueError, dyn_mimo.__rsub__, dyn_mimo_sq)
def test_e_i(): assert_almost_equal(e_i(7, 5, output='r'), array([[0., 0., 0., 0., 0., 1., 0.]]) ) assert_almost_equal(e_i(5, [0, 4, 4, 4, 1]), array([[1., 0., 0., 0., 0.], [0., 0., 0., 0., 1.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 1., 1., 1., 0.]]) ) assert_almost_equal(e_i(5, s_[1:3]), array([[0., 0.], [1., 0.], [0., 1.], [0., 0.], [0., 0.]]) ) assert_almost_equal(e_i(5, slice(1, 5, 2), output='r'), array([[0., 1., 0., 0., 0.], [0., 0., 0., 1., 0.]]) )
def test_State_algebra_add_radd(): sta_siso = State(5) sta_mimo = State(2.0*np.eye(3)) dyn_siso = State(haroldcompanion([1, 3, 3, 1]), e_i(3, -1), e_i(3, 1).T) dyn_mimo = State(haroldcompanion([1, 3, 3, 1]), e_i(3, [1, 2]), np.eye(3)) dyn_mimo_sq = State(haroldcompanion([1, 3, 3, 1]), np.eye(3), np.eye(3)) G = dyn_mimo + sta_siso assert_array_almost_equal(G.d, sta_siso.to_array()*np.ones(dyn_mimo.shape)) assert_raises(ValueError, dyn_mimo.__add__, sta_mimo) G = dyn_mimo_sq + sta_mimo assert_array_almost_equal(G.d, 2.*np.eye(3)) G = dyn_mimo + dyn_siso J = np.array([[0., 1., 0., 0., 0., 0., 0., 0.], [0., 0., 1., 0., 0., 0., 1., 0.], [-1., -3., -3., 0., 0., 0., 0., 1.], [0., 0., 0., 0., 1., 0., 0., 0.], [0., 0., 0., 0., 0., 1., 0., 0.], [0., 0., 0., -1., -3., -3., 1., 1.], [1., 0., 0., 0., 1., 0., 0., 0.], [0., 1., 0., 0., 1., 0., 0., 0.], [0., 0., 1., 0., 1., 0., 0., 0.]]) assert_array_almost_equal(concatenate_state_matrices(G), J) assert_raises(ValueError, dyn_mimo.__add__, dyn_mimo_sq) assert_raises(ValueError, dyn_mimo.__sub__, dyn_mimo_sq) assert_raises(ValueError, dyn_mimo.__radd__, dyn_mimo_sq) assert_raises(ValueError, dyn_mimo.__rsub__, dyn_mimo_sq)
def test_e_i(): assert_almost_equal(e_i(7, 5, output='r'), array([[0., 0., 0., 0., 0., 1., 0.]])) assert_almost_equal( e_i(5, [0, 4, 4, 4, 1]), array([[1., 0., 0., 0., 0.], [0., 0., 0., 0., 1.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 1., 1., 1., 0.]])) assert_almost_equal( e_i(5, s_[1:3]), array([[0., 0.], [1., 0.], [0., 1.], [0., 0.], [0., 0.]])) assert_almost_equal(e_i(5, slice(1, 5, 2), output='r'), array([[0., 1., 0., 0., 0.], [0., 0., 0., 1., 0.]]))
def test_State_algebra_mul_rmul_mimo_siso(): sta_siso = State(5) sta_mimo = State(2.0*np.eye(3)) dyn_siso = State(haroldcompanion([1, 3, 3, 1]), e_i(3, -1), e_i(3, 1).T) dyn_mimo = State(haroldcompanion([1, 3, 3, 1]), e_i(3, [1, 2]), np.eye(3)) dyn_mimo_sq = State(haroldcompanion([1, 3, 3, 1]), np.eye(3), np.eye(3)) G = dyn_siso * dyn_mimo J = np.array([[0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 1., 0., 1., 0., 0., 0., 0., 0., 0.], [-1., -3., -3., 0., 0., 0., 0., 1., 0., 0., 0.], [0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.], [0., 0., 0., -1., -3., -3., 0., 0., 0., 1., 0.], [0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.], [0., 0., 0., 0., 0., 0., -1., -3., -3., 0., 1.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.]]) assert_array_almost_equal(concatenate_state_matrices(G), J) G = dyn_mimo * dyn_siso assert_array_almost_equal(concatenate_state_matrices(G), J) G = dyn_mimo * sta_siso assert_array_almost_equal(G.b, 5*dyn_mimo.b) assert_array_almost_equal(G.d, 5*dyn_mimo.d) assert_raises(ValueError, sta_mimo.__add__, dyn_mimo) F = sta_mimo @ dyn_mimo J = np.array([[0., 1., 0., 0., 0.], [0., 0., 1., 1., 0.], [-1., -3., -3., 0., 1.], [2., 0., 0., 0., 0.], [0., 2., 0., 0., 0.], [0., 0., 2., 0., 0.]]) assert_array_almost_equal(concatenate_state_matrices(F), J) assert_almost_equal((dyn_mimo_sq + sta_mimo).d, 2*np.eye(3))
def test_model_zeros(): # Test example A = np.array([ [-3.93, -0.00315, 0, 0, 0, 4.03E-5, 0, 0, 0], [368, -3.05, 3.03, 0, 0, -3.77E-3, 0, 0, 0], [27.4, 0.0787, -5.96E-2, 0, 0, -2.81E-4, 0, 0, 0], [-0.0647, -5.2E-5, 0, -0.255, -3.35E-6, 3.6e-7, 6.33E-5, 1.94E-4, 0], [3850, 17.3, -12.8, -12600, -2.91, -0.105, 12.7, 43.1, 0], [22400, 18, 0, -35.6, -1.04E-4, -0.414, 90, 56.9, 0], [0, 0, 2.34E-3, 0, 0, 2.22E-4, -0.203, 0, 0], [0, 0, 0, -1.27, -1.00E-3, 7.86E-5, 0, -7.17E-2, 0], [-2.2, -177e-5, 0, -8.44, -1.11E-4, 1.38E-5, 1.49E-3, 6.02E-3, -1E-10] ]) B = np.array([[0, 0], [0, 0], [1.56, 0], [0, -5.13E-6], [8.28, -1.55], [0, 1.78], [2.33, 0], [0, -2.45E-2], [0, 2.94E-5]]) C = e_i(9, [5, 8], output='r') D = np.zeros((2, 2)) zs = transmission_zeros(A, B, C, D) res = np.array([ -2.64128629e+01 - 0j, -2.93193619 - 0.419522621j, -9.52183370e-03 + 0j, -2.93193619 + 0.419522621j, 1.69789270e-01 - 0j, 5.46527700e-01 - 0j ]) # Sort is numerically too sensitive for imaginary parts. assert_almost_equal(np.sort(np.imag(zs)), np.sort(np.imag(res))) # 0.0 assert_almost_equal(np.sort(np.real(zs)), np.sort(np.real(res))) # 0.1 # An example found online (citation lost), please let me know A = np.array([[-6.5000, 0.5000, 6.5000, -6.5000], [-0.5000, -5.5000, -5.5000, 5.5000], [-0.5000, 0.5000, 0.5000, -6.5000], [-0.5000, 0.5000, -5.5000, -0.5000]]) B = np.array([[0., 1, 0], [2., 1, 2], [3., 4, 3], [3., 2, 3]]) C = np.array([[1, 1, 0, 0]]) D = np.zeros((1, 3)) zs = transmission_zeros(A, B, C, D) res = np.array([-7, -6]) assert_almost_equal(np.sort(res), np.sort(zs)) # 1 # Example from Reinschke, 1988 A = np.array([[0, 0, 1, 0, 0, 0], [2, 0, 0, 3, 4, 0], [0, 0, 5, 0, 0, 6], [0, 7, 0, 0, 0, 0], [0, 0, 0, 8, 9, 0], [0, 0, 0, 0, 0, 0]]) B = np.array([[0, 0, 0, 0, 10, 0], [0, 0, 0, 0, 0, 11]]).T C = np.array([[0, 12, 0, 0, 13, 0], [14, 0, 0, 0, 0, 0], [15, 0, 16, 0, 0, 0]]) D = np.zeros((3, 2)) zs = transmission_zeros(A, B, C, D) res = np.array([-6.78662791 + 0.j, 3.09432022 + 0.j]) assert_almost_equal(np.sort(zs), np.sort(res)) # 2
def test_model_zeros(): # Test example A = np.array( [[-3.93, -0.00315, 0, 0, 0, 4.03E-5, 0, 0, 0], [368, -3.05, 3.03, 0, 0, -3.77E-3, 0, 0, 0], [27.4, 0.0787, -5.96E-2, 0, 0, -2.81E-4, 0, 0, 0], [-0.0647, -5.2E-5, 0, -0.255, -3.35E-6, 3.6e-7, 6.33E-5, 1.94E-4, 0], [3850, 17.3, -12.8, -12600, -2.91, -0.105, 12.7, 43.1, 0], [22400, 18, 0, -35.6, -1.04E-4, -0.414, 90, 56.9, 0], [0, 0, 2.34E-3, 0, 0, 2.22E-4, -0.203, 0, 0], [0, 0, 0, -1.27, -1.00E-3, 7.86E-5, 0, -7.17E-2, 0], [-2.2, -177e-5, 0, -8.44, -1.11E-4, 1.38E-5, 1.49E-3, 6.02E-3, -1E-10] ]) B = np.array([[0, 0], [0, 0], [1.56, 0], [0, -5.13E-6], [8.28, -1.55], [0, 1.78], [2.33, 0], [0, -2.45E-2], [0, 2.94E-5] ]) C = e_i(9, [5, 8], output='r') D = np.zeros((2, 2)) zs = transmission_zeros(A, B, C, D) res = np.array([-2.64128629e+01 - 0j, -2.93193619 - 0.419522621j, -9.52183370e-03 + 0j, -2.93193619 + 0.419522621j, 1.69789270e-01 - 0j, 5.46527700e-01 - 0j]) # Sort is numerically too sensitive for imaginary parts. assert_almost_equal(np.sort(np.imag(zs)), np.sort(np.imag(res))) # 0.0 assert_almost_equal(np.sort(np.real(zs)), np.sort(np.real(res))) # 0.1 # An example found online (citation lost), please let me know A = np.array([[-6.5000, 0.5000, 6.5000, -6.5000], [-0.5000, -5.5000, -5.5000, 5.5000], [-0.5000, 0.5000, 0.5000, -6.5000], [-0.5000, 0.5000, -5.5000, -0.5000]]) B = np.array([[0., 1, 0], [2., 1, 2], [3., 4, 3], [3., 2, 3]]) C = np.array([[1, 1, 0, 0]]) D = np.zeros((1, 3)) zs = transmission_zeros(A, B, C, D) res = np.array([-7, -6]) assert_almost_equal(np.sort(res), np.sort(zs)) # 1 # Example from Reinschke, 1988 A = np.array([[0, 0, 1, 0, 0, 0], [2, 0, 0, 3, 4, 0], [0, 0, 5, 0, 0, 6], [0, 7, 0, 0, 0, 0], [0, 0, 0, 8, 9, 0], [0, 0, 0, 0, 0, 0]]) B = np.array([[0, 0, 0, 0, 10, 0], [0, 0, 0, 0, 0, 11]]).T C = np.array([[0, 12, 0, 0, 13, 0], [14, 0, 0, 0, 0, 0], [15, 0, 16, 0, 0, 0]]) D = np.zeros((3, 2)) zs = transmission_zeros(A, B, C, D) res = np.array([-6.78662791+0.j, 3.09432022+0.j]) assert_almost_equal(np.sort(zs), np.sort(res)) # 2