制振時と非制振時における波形計算で,同調調和減衰器(TMD)の制振効果を比較するMaTXプログラム.
なお,本プログラムは,MaTX公式サイトのMaTXユーザーズマニュアルの例題プログラムを参考にしています.
グラフは,gnuplotにより以下のように出力されます.
xp_disp:制御時の構造物の変位 xc_disp:制御時の同調調和減衰器の変位 xs_disp:非制御時の構造物の変位
// feedback.mm
Matrix Ap, bp, cp; // 制御対象のパラメータ
Matrix Ac, bc, cc; // 制御器のパラメータ
Matrix As, bs; // 制御対象(非制御時)のパラメータ
Func void init_params()
{
Real f_p, d_p, m_p, f_c, d_c, m_c;
f_p=2*PI/2.70;
d_p=0.0005;
m_p=1200;
f_c=2*PI/2.72;
d_c=0.0660;
m_c=15.4;
// 制御対象のパラメータ
Ap = [[0, 1]
[-f_p^2-(m_c/m_p)*f_c^2, -2*d_p*f_p-2*(m_c/m_p)*d_c*f_c]];
bp = [0 1/m_p]';
cp = [m_c*f_c^2, 2*m_c*d_c*f_c];
// 制御器のパラメータ
Ac = [[0, 1]
[-f_c^2, -2*d_c*f_c]];
bc = [0 1/m_c]';
cc = [m_c*f_c^2, 2*m_c*d_c*f_c];
// 制御対象のパラメータ(非制御時)
As = [[0, 1]
[-f_p^2, -2*d_p*f_p]];
bs = [0 1/m_p]';
}
Func void main()
{
Matrix x0;
Matrix xs0;
Array TC, XC, UC;
void diff_eqs(), link_eqs(), init_params();
init_params();
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(3:3,:)][XC(5:5,:)]], {"xp_disp", "xc_disp", "xs_disp"});
}
Func void diff_eqs(DX, t, X, UY)
Real t;
Matrix X, DX, UY;
{
Matrix dxp, dxc, dxs, xp, xc, xs, up, uc, us;
xp = X(1:2,1); // 制御対象の状態
xc = X(3:4,1); // 制御器の状態
xs = X(5:6,1); // 制御対象の状態(非制御時)
up = UY(1:1,1); // 制御対象への入力
uc = UY(2:2,1); // 制御器への入力
us = UY(3:3,1); // 制御対象への入力(非制御時)
dxp = Ap*xp + bp*up; // 制御対象の状態方程式
dxc = Ac*xc + bc*uc; // 制御器の状態方程式
dxs = As*xs + bs*us; // 制御対象の状態方程式(非制御時)
DX = [[dxp][dxc][dxs]];
}
Func void link_eqs(UY, t, X)
Real t;
Matrix UY, X;
{
Matrix xp, up, yp, xc, yc, uc, xs, us;
Real noise;
xp = X(1:2,1); // 制御対象の状態
xc = X(3:4,1); // 制御器の状態
xs = X(5:6,1); // 制御対象の状態(非制御時)
yp = cp*xp; // 制御対象の出力
uc = yp; // yp を uc に接続
yc = cc*xc; // 制御器の出力
us = [(rand() - 0.5)*2];
up = us + yc; // yc を up に接続
UY = [up uc us]';
}