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_matmul_rmatmul_ndarray(): H = State([[-5, -2], [1, 0]], [[2], [0]], [3, 1], 1) J1 = np.array([[-5., -2., 0., 0., 0., 0., 2., 4., 6., 8.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., -5., -2., 0., 0., 10., 12., 14., 16.], [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., -5., -2., 18., 20., 22., 24.], [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.], [3., 1., 0., 0., 0., 0., 1., 2., 3., 4.], [0., 0., 3., 1., 0., 0., 5., 6., 7., 8.], [0., 0., 0., 0., 3., 1., 9., 10., 11., 12.]]) J2 = np.array([[-5., -2., 0., 0., 0., 0., 2., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., -5., -2., 0., 0., 0., 2., 0.], [0., 0., 1., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., -5., -2., 0., 0., 2.], [0., 0., 0., 0., 1., 0., 0., 0., 0.], [3., 1., 6., 2., 9., 3., 1., 2., 3.], [12., 4., 15., 5., 18., 6., 4., 5., 6.], [21., 7., 24., 8., 27., 9., 7., 8., 9.], [30., 10., 33., 11., 36., 12., 10., 11., 12.]]) mat = np.arange(1, 13).reshape(3, 4) Fm = concatenate_state_matrices(mat @ H) assert_array_almost_equal(J1, Fm) Fm = concatenate_state_matrices(H @ mat) assert_array_almost_equal(J1, Fm) mat = np.arange(1, 13).reshape(4, 3) Fm = concatenate_state_matrices(mat @ H) assert_array_almost_equal(J2, Fm) Fm = concatenate_state_matrices(H @ mat) assert_array_almost_equal(J2, Fm)
def test_State_slicing(): F = State(1, 2, 3, 4) F0 = F[0, 0] assert_equal(concatenate_state_matrices(F), concatenate_state_matrices(F0)) F = State(np.random.rand(4, 4)) H = State(F.d, np.random.rand(4, 3), np.random.rand(5, 4)) Hind = [(1, 3), (5, 1), (5, 3), (1, 1), (2, 3), (5, 2), (2, 3), (5, 2), (1, 2), (2, 1), (3, 3), (5, 2)] Find = [(1, 4), (4, 1), (4, 4), (1, 1), (2, 4), (4, 2), (2, 4), (4, 2), (1, 2), (2, 1), (2, 4), (4, 2)] for s, sind in ((H, Hind), (F, Find)): for ind, x in enumerate([s[1, :], s[:, 1], s[:, :], s[0, 0], s[1:3, :], s[:, 1:3], s[[1, 2], :], s[:, [1, 2]], s[2, [1, 2]], s[[1, 2], 2], s[::2, :], s[:, ::2]]): assert_equal(x.shape, sind[ind]) assert_raises(ValueError, H.__setitem__)
def test_transfer_to_state(): # Models with static column/row num, den = [[1, -1], [[1, -1], 0]], [[[1, 2], 1], [[1, 2], 1]] den2, num2 = [list(i) for i in zip(*den)], [list(i) for i in zip(*num)] G = Transfer(num, den) H = Transfer(num2, den2) Gs = transfer_to_state(G) Hs = transfer_to_state(H) Gm = concatenate_state_matrices(Gs) Hm = concatenate_state_matrices(Hs) assert_array_almost_equal(Gm, np.array([[-2, 1, 0], [1, 0, -1], [-3, 1, 0]])) assert_array_almost_equal( Hm, np.array([[-2., 0., 1., 0.], [0., -2., 0., 1.], [1., -3., 0., 1.], [0., 0., -1., 0.]])) # Example from Kalman 1963 num = [[3 * np.poly([-3, -5]), [6, 6], [2, 7], [2, 5]], [2, 1, [2, 10], [8, 16]], [[2, 14, 36], [-2, 0], 1, 2 * np.convolve([5, 17], [1, 2])]] den = [[np.poly([-1, -2, -4]), [1, 6, 8], [1, 7, 12], [1, 5, 6]], [[1, 8, 15], [1, 3], np.poly([-1, -2, -3]), np.poly([-1, -3, -5])], [np.poly([-1, -3, -5]), [1, 4, 3], [1, 3], np.poly([-1, -3, -5])]] G = Transfer(num, den) H = transfer_to_state(G) p = H.poles p.sort() assert_array_almost_equal( p, np.array([ -5. + 0.j, -5. + 0.j, -4. + 0.j, -3. + 0.j, -3. + 0.j, -3. + 0.j, -2. + 0.j, -2. + 0.j, -1. + 0.j, -1. + 0.j, -1. + 0.j ])) # Reported in gh-#42 G = Transfer([[[87.8, 8.78], [-103.68, -8.64]], [[129.84, 10.82], [-109.6, -10.96]]], [562.5, 82.5, 1]) Gss = transfer_to_state(G) assert_array_almost_equal( Gss.a, np.kron(np.eye(2), [[0., 1.], [-2 / 1125, -11 / 75]])) assert_array_almost_equal(Gss.b, [[0, 0], [1, 0], [0, 0], [0, 1]]) des_c = np.array([[ 0.01560888888888889, 0.1560888888888889, -0.015360000000000002, -0.18432 ], [ 0.019235555555555558, 0.23082666666666668, -0.019484444444444447, -0.19484444444444443 ]]) assert_array_almost_equal(Gss.c, des_c) assert_array_almost_equal(Gss.d, np.zeros([2, 2]))
def test_State_algebra_mul_rmul_scalar_array(): G = State(np.diag([-1, -2]), [[1, 2], [3, 4]], np.eye(2)) F = G * np.eye(2) Fm = G @ np.eye(2) assert_equal(concatenate_state_matrices(F), concatenate_state_matrices(Fm)) F = np.eye(2) * G Fm = np.eye(2) @ G assert_equal(concatenate_state_matrices(F), concatenate_state_matrices(Fm)) H = 1 / 2 * G assert_equal(H.c, 0.5 * G.c)
def test_State_algebra_mul_rmul_scalar_array(): G = State(np.diag([-1, -2]), [[1, 2], [3, 4]], np.eye(2)) F = G*np.eye(2) Fm = [email protected](2) assert_equal(concatenate_state_matrices(F), concatenate_state_matrices(Fm)) F = np.eye(2)*G Fm = np.eye(2)@G assert_equal(concatenate_state_matrices(F), concatenate_state_matrices(Fm)) H = 1/2*G assert_equal(H.c, 0.5*G.c)
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_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_transfer_to_state(): # Models with static column/row num, den = [[1, -1], [[1, -1], 0]], [[[1, 2], 1], [[1, 2], 1]] den2, num2 = [list(i) for i in zip(*den)], [list(i) for i in zip(*num)] G = Transfer(num, den) H = Transfer(num2, den2) Gs = transfer_to_state(G) Hs = transfer_to_state(H) Gm = concatenate_state_matrices(Gs) Hm = concatenate_state_matrices(Hs) assert_array_almost_equal(Gm, np.array([[-2, 1, 0], [1, 0, -1], [-3, 1, 0]])) assert_array_almost_equal( Hm, np.array([[-2., 0., 1., 0.], [0., -2., 0., 1.], [1., -3., 0., 1.], [0., 0., -1., 0.]])) # Example from Kalman 1963 num = [[3 * np.poly([-3, -5]), [6, 6], [2, 7], [2, 5]], [2, 1, [2, 10], [8, 16]], [[2, 14, 36], [-2, 0], 1, 2 * np.convolve([5, 17], [1, 2])]] den = [[np.poly([-1, -2, -4]), [1, 6, 8], [1, 7, 12], [1, 5, 6]], [[1, 8, 15], [1, 3], np.poly([-1, -2, -3]), np.poly([-1, -3, -5])], [np.poly([-1, -3, -5]), [1, 4, 3], [1, 3], np.poly([-1, -3, -5])]] G = Transfer(num, den) H = transfer_to_state(G) p = H.poles p.sort() assert_array_almost_equal( p, np.array([ -5. + 0.j, -5. + 0.j, -4. + 0.j, -3. + 0.j, -3. + 0.j, -3. + 0.j, -2. + 0.j, -2. + 0.j, -1. + 0.j, -1. + 0.j, -1. + 0.j ]))
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_feedback_dynamic_static(): M = array([[2, 2, 1, -1], [3, 2, -2, 3], [1, -1, 1, -3], [0, -1, 2, 0]]) a, b, c, d = matrix_slice(M, [3, 3]) G = State(a, b, eye(3)) H, _, _ = lqr(G, eye(3)) CL = feedback(G, H) assert_almost_equal(CL.poles, array([-5.42998305, -3.75504185, -1.55400925])) G = State(a, b, c, d) CL = feedback(G, 5+0j) assert_almost_equal(concatenate_state_matrices(CL), array([[2., -3., 11., -1.], [3., 17., -32., 3.], [1., -16., 31., -3.], [0., -1., 2., 0.]])) CL = feedback(5, G) assert_almost_equal(concatenate_state_matrices(CL), array([[2., -3., 11., -5.], [3., 17., -32., 15.], [1., -16., 31., -15.], [0., 5., -10., 5.]]))
def test_State_matmul_rmatmul_ndarray(): H = State([[-5, -2], [1, 0]], [[2], [0]], [3, 1], 1) J1 = np.array([[-5., -2., 0., 0., 0., 0., 2., 4., 6., 8.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., -5., -2., 0., 0., 10., 12., 14., 16.], [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., -5., -2., 18., 20., 22., 24.], [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.], [3., 1., 0., 0., 0., 0., 1., 2., 3., 4.], [0., 0., 3., 1., 0., 0., 5., 6., 7., 8.], [0., 0., 0., 0., 3., 1., 9., 10., 11., 12.]]) J2 = np.array([[-5., -2., 0., 0., 0., 0., 2., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., -5., -2., 0., 0., 0., 2., 0.], [0., 0., 1., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., -5., -2., 0., 0., 2.], [0., 0., 0., 0., 1., 0., 0., 0., 0.], [3., 1., 6., 2., 9., 3., 1., 2., 3.], [12., 4., 15., 5., 18., 6., 4., 5., 6.], [21., 7., 24., 8., 27., 9., 7., 8., 9.], [30., 10., 33., 11., 36., 12., 10., 11., 12.]]) mat = np.arange(1, 13).reshape(3, 4) Fm = concatenate_state_matrices(mat @ H) assert_array_almost_equal(J1, Fm) Fm = concatenate_state_matrices(H @ mat) assert_array_almost_equal(J1, Fm) mat = np.arange(1, 13).reshape(4, 3) Fm = concatenate_state_matrices(mat @ H) assert_array_almost_equal(J2, Fm) Fm = concatenate_state_matrices(H @ mat) assert_array_almost_equal(J2, Fm) G, H = random_state_model(2, 2, 2), random_state_model(2, 3, 3) with assert_raises(ValueError): G @ H # Scalars G = random_state_model(1) H = 0. @ G assert H._isgain H = 1. @ G assert_almost_equal(concatenate_state_matrices(G), concatenate_state_matrices(H)) # static gain mults G = random_state_model(0, 4, 5) H = random_state_model(0, 5, 4) assert (G @ H)._isgain assert_equal((G @ H).shape, (4, 4)) H = random_state_model(0, 3, 3) with assert_raises(ValueError): G @ H G = State(1.) H = random_state_model(1, 2, 2) assert_almost_equal(concatenate_state_matrices(G @ H), concatenate_state_matrices(H @ G)) G = random_state_model(1, 4, 5) H = random_state_model(1, 4, 5) with assert_raises(ValueError): G @ H
def test_transfer_to_state(): # Models with static column/row num, den = [[1, -1], [[1, -1], 0]], [[[1, 2], 1], [[1, 2], 1]] den2, num2 = [list(i) for i in zip(*den)], [list(i) for i in zip(*num)] G = Transfer(num, den) H = Transfer(num2, den2) Gs = transfer_to_state(G) Hs = transfer_to_state(H) Gm = concatenate_state_matrices(Gs) Hm = concatenate_state_matrices(Hs) assert_array_almost_equal(Gm, np.array([[-2, 1, 0], [1, 0, -1], [-3, 1, 0]])) assert_array_almost_equal( Hm, np.array([[-2., 0., 1., 0.], [0., -2., 0., 1.], [1., -3., 0., 1.], [0., 0., -1., 0.]])) # Example from Kalman 1963 num = [[3 * np.poly([-3, -5]), [6, 6], [2, 7], [2, 5]], [2, 1, [2, 10], [8, 16]], [[2, 14, 36], [-2, 0], 1, 2 * np.convolve([5, 17], [1, 2])]] den = [[np.poly([-1, -2, -4]), [1, 6, 8], [1, 7, 12], [1, 5, 6]], [[1, 8, 15], [1, 3], np.poly([-1, -2, -3]), np.poly([-1, -3, -5])], [np.poly([-1, -3, -5]), [1, 4, 3], [1, 3], np.poly([-1, -3, -5])]] G = Transfer(num, den) H = transfer_to_state(G) p = H.poles p.sort() assert_array_almost_equal( p, np.array([ -5. + 0.j, -5. + 0.j, -4. + 0.j, -3. + 0.j, -3. + 0.j, -3. + 0.j, -2. + 0.j, -2. + 0.j, -1. + 0.j, -1. + 0.j, -1. + 0.j ])) # Reported in gh-#42 G = Transfer([[[87.8, 8.78], [-103.68, -8.64]], [[129.84, 10.82], [-109.6, -10.96]]], [562.5, 82.5, 1]) Gss = transfer_to_state(G) assert_array_almost_equal( Gss.a, np.kron(np.eye(2), [[0., 1.], [-2 / 1125, -11 / 75]])) assert_array_almost_equal(Gss.b, [[0, 0], [1, 0], [0, 0], [0, 1]]) des_c = np.array([[ 0.01560888888888889, 0.1560888888888889, -0.015360000000000002, -0.18432 ], [ 0.019235555555555558, 0.23082666666666668, -0.019484444444444447, -0.19484444444444443 ]]) assert_array_almost_equal(Gss.c, des_c) assert_array_almost_equal(Gss.d, np.zeros([2, 2])) # reported in gh-#50 num = [[[61.79732492202783, 36.24988430260625, 0.7301196233698941], [0.0377840674057878, 0.9974993795127982, 21.763622825733773]]] den = [[[84.64, 18.4, 1.0], [1.0, 7.2, 144.0]]] TF = transfer_to_state((num, den)) assert_array_almost_equal([ -3.6 - 1.14472704e+01j, -3.6 + 1.14472704e+01j, -0.10869565 - 1.74405237e-07j, -0.10869565 + 1.74405237e-07j, ], np.sort(TF.poles)) assert TF.zeros.size == 0 # rectengular static gain gain = np.ones([2, 3]) Gss = transfer_to_state(Transfer(gain)) assert_array_almost_equal(gain, Gss.d)
def test_transfer_to_state(): # Models with static column/row num, den = [[1, -1], [[1, -1], 0]], [[[1, 2], 1], [[1, 2], 1]] den2, num2 = [list(i) for i in zip(*den)], [list(i) for i in zip(*num)] G = Transfer(num, den) H = Transfer(num2, den2) Gs = transfer_to_state(G) Hs = transfer_to_state(H) Gm = concatenate_state_matrices(Gs) Hm = concatenate_state_matrices(Hs) assert_array_almost_equal(Gm, np.array([[-2, 1, 0], [1, 0, -1], [-3, 1, 0]])) assert_array_almost_equal(Hm, np.array([[-2., 0., 1., 0.], [0., -2., 0., 1.], [1., -3., 0., 1.], [0., 0., -1., 0.]])) # Example from Kalman 1963 num = [[3*np.poly([-3, -5]), [6, 6], [2, 7], [2, 5]], [2, 1, [2, 10], [8, 16]], [[2, 14, 36], [-2, 0], 1, 2*np.convolve([5, 17], [1, 2])]] den = [[np.poly([-1, -2, -4]), [1, 6, 8], [1, 7, 12], [1, 5, 6]], [[1, 8, 15], [1, 3], np.poly([-1, -2, -3]), np.poly([-1, -3, -5])], [np.poly([-1, -3, -5]), [1, 4, 3], [1, 3], np.poly([-1, -3, -5])]] G = Transfer(num, den) H = transfer_to_state(G) p = H.poles p.sort() assert_array_almost_equal(p, np.array([-5.+0.j, -5.+0.j, -4.+0.j, -3.+0.j, -3.+0.j, -3.+0.j, -2.+0.j, -2.+0.j, -1.+0.j, -1.+0.j, -1.+0.j])) # Reported in gh-#42 G = Transfer([[[87.8, 8.78], [-103.68, -8.64]], [[129.84, 10.82], [-109.6, -10.96]]], [562.5, 82.5, 1]) Gss = transfer_to_state(G) assert_array_almost_equal(Gss.a, np.kron(np.eye(2), [[0., 1.], [-2/1125, -11/75]])) assert_array_almost_equal(Gss.b, [[0, 0], [1, 0], [0, 0], [0, 1]]) des_c = np.array([[0.01560888888888889, 0.1560888888888889, -0.015360000000000002, -0.18432], [0.019235555555555558, 0.23082666666666668, -0.019484444444444447, -0.19484444444444443]]) assert_array_almost_equal(Gss.c, des_c) assert_array_almost_equal(Gss.d, np.zeros([2, 2])) # reported in gh-#50 num = [[[61.79732492202783, 36.24988430260625, 0.7301196233698941], [0.0377840674057878, 0.9974993795127982, 21.763622825733773]]] den = [[[84.64, 18.4, 1.0], [1.0, 7.2, 144.0]]] TF = transfer_to_state((num, den)) assert_array_almost_equal([-3.6-1.14472704e+01j, -3.6+1.14472704e+01j, -0.10869565-1.74405237e-07j, -0.10869565+1.74405237e-07j, ], np.sort(TF.poles)) assert TF.zeros.size == 0
def test_State_matmul_rmatmul_ndarray(): H = State([[-5, -2], [1, 0]], [[2], [0]], [3, 1], 1) J1 = np.array([[-5., -2., 0., 0., 0., 0., 2., 4., 6., 8.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., -5., -2., 0., 0., 10., 12., 14., 16.], [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., -5., -2., 18., 20., 22., 24.], [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.], [3., 1., 0., 0., 0., 0., 1., 2., 3., 4.], [0., 0., 3., 1., 0., 0., 5., 6., 7., 8.], [0., 0., 0., 0., 3., 1., 9., 10., 11., 12.]]) J2 = np.array([[-5., -2., 0., 0., 0., 0., 2., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., -5., -2., 0., 0., 0., 2., 0.], [0., 0., 1., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., -5., -2., 0., 0., 2.], [0., 0., 0., 0., 1., 0., 0., 0., 0.], [3., 1., 6., 2., 9., 3., 1., 2., 3.], [12., 4., 15., 5., 18., 6., 4., 5., 6.], [21., 7., 24., 8., 27., 9., 7., 8., 9.], [30., 10., 33., 11., 36., 12., 10., 11., 12.]]) mat = np.arange(1, 13).reshape(3, 4) Fm = concatenate_state_matrices(mat @ H) assert_array_almost_equal(J1, Fm) Fm = concatenate_state_matrices(H @ mat) assert_array_almost_equal(J1, Fm) mat = np.arange(1, 13).reshape(4, 3) Fm = concatenate_state_matrices(mat @ H) assert_array_almost_equal(J2, Fm) Fm = concatenate_state_matrices(H @ mat) assert_array_almost_equal(J2, Fm) G, H = random_state_model(2, 2, 2), random_state_model(2, 3, 3) with assert_raises(ValueError): G @ H # Scalars G = random_state_model(1) H = 0. @ G assert H._isgain H = 1. @ G assert_almost_equal(concatenate_state_matrices(G), concatenate_state_matrices(H)) # static gain mults G = random_state_model(0, 4, 5) H = random_state_model(0, 5, 4) assert (G@H)._isgain assert_equal((G@H).shape, (4, 4)) H = random_state_model(0, 3, 3) with assert_raises(ValueError): G @ H G = State(1.) H = random_state_model(1, 2, 2) assert_almost_equal(concatenate_state_matrices(G @ H), concatenate_state_matrices(H @ G)) G = random_state_model(1, 4, 5) H = random_state_model(1, 4, 5) with assert_raises(ValueError): G @ H
def test_concatenate_state_matrices(): G = State(1, 2, 3, 4) M = concatenate_state_matrices(G) assert_array_equal(M, np.array([[1, 2], [3, 4]])) # 1 G = State(np.eye(4)) assert_array_equal(concatenate_state_matrices(G), np.eye(4))