制振時と非制振時における波形計算で,同調調和減衰器(TMD)の制振効果を比較するMaTXプログラムです.
なお,本プログラムは,MaTX公式サイトのMaTXユーザーズマニュアルの例題プログラムを参考にしています.
グラフは,gnuplotにより以下のように出力されます.緑線が制振なしの場合の変位波形,青線が制振ありの場合の変位波形です.
// tmd.mm Matrix Ap, bp, cp; // 制御対象のパラメータ Matrix As, bs, cs; // 制御対象(非制御時)のパラメータ Real f_s, d_s, m_s, f_d, d_d, m_d; Func void init_params() { Matrix MM, CC, KK; f_s=2*PI/2.70; d_s=0.0005; m_s=1200; f_d=2*PI/2.72; d_d=0.0660; m_d=15.4; MM = [[m_s, 0] [0, m_d]]; CC = [[2*m_s*d_s*f_s+2*m_d*d_d*f_d, -2*m_d*d_d*f_d] [-2*m_d*d_d*f_d, 2*m_d*d_d*f_d]]; KK = [[m_s*f_s^2+m_d*f_d^2, -m_d*f_d^2] [-m_d*f_d^2, m_d*f_d^2]]; // 制御対象のパラメータ Ap = [[Z(2), diag(1.0, 1.0)] [-MM~*KK, -MM~*CC]]; bp = [[Z(2)] [MM~]]; cp = [[0, 0, 0, 0] [0, 0, 0, 0]]; // 制御対象のパラメータ(非制御時) As = [[0, 1] [-f_s^2, -2*d_s*f_s]]; bs = [0, 1/m_s]'; cs = [0, 0]; } Func void main() { Matrix x0; Array TC, XC, UC; void diff_eqs(), link_eqs(), init_params(); init_params(); print Ap; print eigval(Ap); print As; print eigval(As); x0 = [0 0 0 0 0 0]'; {TC, XC, UC} = Ode(0.0, 100.0, x0, diff_eqs, link_eqs, 0.1); mgplot(1, TC, [[XC(1:1,:)][XC(5:5,:)]], {"with TMD", "without TMD"}); pause; } Func void diff_eqs(DX, t, X, UY) Real t; Matrix X, DX, UY; { Matrix dxp, dxs, xp, xs, up, us; xp = X(1:4,1); // 制御対象の状態 xs = X(5:6,1); // 制御対象の状態(非制御時) up = UY(1:2,1); // 制御対象への入力 us = UY(3:3,1); // 制御対象への入力(非制御時) dxp = Ap*xp + bp*up; // 制御対象の状態方程式 dxs = As*xs + bs*us; // 制御対象の状態方程式(非制御時) DX = [[dxp][dxs]]; } Func void link_eqs(UY, t, X) Real t; Matrix UY, X; { Matrix xp, up, yp, xs, us, ys, vp, vs; Real noise; xp = X(1:4,1); // 制御対象の状態 xs = X(5:6,1); // 制御対象の状態(非制御時) noise = (rand() - 0.5)*2; vp = [noise 0]'; // 外乱 vs = [noise]; yp = cp*xp; // 出力 ys = cs*xs; up = yp+vp; // 入力 us = ys+vs; UY = [[up][us]]; }