def test_state_norm(plt): # Choose a filter, timestep, and number of simulation timesteps sys = Alpha(0.1) dt = 0.000001 length = 2000000 # Modify the state-space to read out the state vector A, B, C, D = sys2ss(sys) old_C = C C = np.eye(len(A)) D = np.zeros((len(A), B.shape[1])) response = np.empty((length, len(C))) for i in range(len(C)): # Simulate the state vector response[:, i] = impulse((A, B, C[i, :], D[i, :]), dt, length) # Check that the power of each state equals the H2-norm of each state # The analog case is the same after scaling since dt is approx 0. actual = norm(response, axis=0) * dt assert np.allclose(actual, state_norm(cont2discrete(sys, dt))) assert np.allclose(actual, state_norm(sys) * np.sqrt(dt)) plt.figure() plt.plot(response[:, 0], label="$x_0$") plt.plot(response[:, 1], label="$x_1$") plt.plot(np.dot(response, old_C.T), label="$y$") plt.legend()
def test_grams(): sys = 0.6*Alpha(0.01) + 0.4*Lowpass(0.05) A, B, C, D = sys2ss(sys) P = control_gram(sys) assert np.allclose(np.dot(A, P) + np.dot(P, A.T), -np.dot(B, B.T)) assert np.linalg.matrix_rank(P) == len(P) # controllable Q = observe_gram(sys) assert np.allclose(np.dot(A.T, Q) + np.dot(Q, A), -np.dot(C.T, C)) assert np.linalg.matrix_rank(Q) == len(Q) # observable
def test_grams(): sys = 0.6 * Alpha(0.01) + 0.4 * Lowpass(0.05) A, B, C, D = sys2ss(sys) P = control_gram(sys) assert np.allclose(np.dot(A, P) + np.dot(P, A.T), -np.dot(B, B.T)) assert matrix_rank(P) == len(P) # controllable Q = observe_gram(sys) assert np.allclose(np.dot(A.T, Q) + np.dot(Q, A), -np.dot(C.T, C)) assert matrix_rank(Q) == len(Q) # observable
def test_similarity_transform(): sys = Alpha(0.1) TA, TB, TC, TD = similarity_transform(sys, np.eye(2)).ss A, B, C, D = sys2ss(sys) assert np.allclose(A, TA) assert np.allclose(B, TB) assert np.allclose(C, TC) assert np.allclose(D, TD) T = [[1, 1], [-0.5, 0]] TA, TB, TC, TD = similarity_transform(sys, T).ss assert not np.allclose(A, TA) assert not np.allclose(B, TB) assert not np.allclose(C, TC) assert np.allclose(D, TD) assert sys_equal(sys, (TA, TB, TC, TD))