示例#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))
示例#2
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)
示例#3
0
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__)
示例#4
0
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]))
示例#5
0
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)
示例#6
0
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)
示例#7
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)
示例#8
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)
示例#9
0
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
        ]))
示例#10
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))
示例#11
0
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.]]))
示例#12
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
示例#13
0
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)
示例#14
0
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
示例#15
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
示例#16
0
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))
示例#17
0
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))