def testMinreal(self, verbose=False): """Test a minreal model reduction""" # A = [-2, 0.5, 0; 0.5, -0.3, 0; 0, 0, -0.1] A = [[-2, 0.5, 0], [0.5, -0.3, 0], [0, 0, -0.1]] # B = [0.3, -1.3; 0.1, 0; 1, 0] B = [[0.3, -1.3], [0.1, 0.], [1.0, 0.0]] # C = [0, 0.1, 0; -0.3, -0.2, 0] C = [[0., 0.1, 0.0], [-0.3, -0.2, 0.0]] # D = [0 -0.8; -0.3 0] D = [[0., -0.8], [-0.3, 0.]] # sys = ss(A, B, C, D) sys = ss(A, B, C, D) sysr = minreal(sys, verbose=verbose) assert sysr.nstates == 2 assert sysr.ninputs == sys.ninputs assert sysr.noutputs == sys.noutputs np.testing.assert_array_almost_equal( eigvals(sysr.A), [-2.136154, -0.1638459]) s = tf([1, 0], [1]) h = (s+1)*(s+2.00000000001)/(s+2)/(s**2+s+1) hm = minreal(h, verbose=verbose) hr = (s+1)/(s**2+s+1) np.testing.assert_array_almost_equal(hm.num[0][0], hr.num[0][0]) np.testing.assert_array_almost_equal(hm.den[0][0], hr.den[0][0])
def main(): # 制御対象を定義(今回はモータを想定) J = 0.6 # 慣性 D = 0.2 # 粘性 Kt = 0.15 # トルク定数 P = crl.tf([Kt], [J, D, 0]) # モータ角度の電流制御 # 参照モデルの定義 M = crl.tf([50], [1, 50]) # シミュレーション条件を定義 Ts = 0.001 # サンプリング時間 # 制御器構造の定義 beta = crl.ss("0", "1", "0; 1", "1; 0") # PI制御器 print(crl.tf(beta)) beta = crl.c2d(beta, Ts) # 制御対象と参照モデルのゲイン線図 plt.figure(1) crl.bode([P, M]) plt.legend(["Plant", "Ref. model"]) # prbsを生成する n = 12 # m系列信号の次数 Tp = 5 # 何周期印加するか? Ap = 0.5 # 振幅 [A] u0 = 2 * prbs(n) u0 = Ap * (u0 - np.average(u0)) u0 = np.tile(u0, Tp) t = np.linspace(0, Ts * u0.shape[0], u0.shape[0]) plt.figure(2) plt.plot(t, u0) plt.xlabel("Time [s]") plt.ylabel("Current [A]") # 実験データの取得 print("=== Start Experiment ===") Pd = crl.c2d(P, Ts, "tustin") # 双一次変換で離散時間モデルを作成 t = np.arange(start=0, stop=Tp * Ts * (2**n - 1), step=Ts) (y0, t0, xout) = crl.lsim(Pd, u0[:], t[:]) # 応答を取得 plt.figure(3) plt.plot(y0) # VRFTを実行する print("=== Start VRFT ===") W = crl.tf([50], [1, 50]) # 周波数重み L = crl.minreal((1 - M) * M * W) # プレフィルタ Ld = crl.c2d(L, Ts, "tustin") (ul, tl, xlout) = crl.lsim(Ld, u0, t) (phi_l, tl, xlout) = crl.lsim(beta, y0[:]) print(phi_l) rho = np.linalg.solve(phi_l, ul) print(rho) plt.show()