1自由度系非線形地震応答をMATLABで計算するサンプルコード
バイリニア型履歴復元力特性を有する1自由度系の非線形地震応答解析をするMATLABのコードです. 改変等,適宜修正していただいて,ご自由にお使いください.
% バイリニア型1自由度系の非線形地震応答解析 % 2021-11-22 伊津野和行 % 必要なファイル eq.txt 地震加速度のみがgal=cm/s/s単位で入っているファイル % 結果は results.xlsx に時刻歴応答が出力される % 積分は酒井らの方法 https://doi.org/10.2208/jscej.1995.507_137 % 以下のコメントで式(?)とあるのは,同上論文の式番号. clear; % パラメータの入力 ここから m = 100; % 質量 t(あるいはkg) k1 = 10000; % 初期剛性 kN/m(質量がkgならN/m) k2 = 1000; % 二次剛性 kN/m(質量がkgならN/m) yy = 500; % 降伏耐力 kN(質量がkgならN) h = 0.05; % 減衰定数 無次元 deltaT = 0.02; % 地震波の時間刻み % パラメータの入力 ここまで omega = ( k1 / m )^0.5; % 固有円振動数 rad/s T = 2 * pi / omega; % 固有周期 s msg = ['固有周期 ' num2str(T) ' (s)']; disp(msg) c = 2 * h * omega * m; % 粘性減衰係数 kN・s/m bun = 10; % 計算時間間隔分割数 dt = deltaT / bun; % 計算用時間刻み eq = readmatrix('eq.txt'); % 地震波の読み込み gal=cm/s/s eq = 0.01 * eq; % 地震加速度の単位変換 m/s/s n = size(eq,1); % 地震波データ数 dt2 = dt * dt; tmp1 = k1 + 2 * c / dt + 4 * m / dt2; % 計算途中で使う係数 tmp2 = m + dt * c / 2; output = zeros(n,6); % 出力用の変数 % 初期値 x = 0; % 変位 v = 0; % 速度 a = 0; % 加速度 f = 0; % 前ステップにおける復元力 Q = 0; % 調整外力(非線形と線形との差) z0 = 0; for i = 1:n-1 z1 = eq(i + 1); dz = (z1 - z0) / bun; for j = 1:bun z0 = z0 + dz; P = -m * z0; % 地震外力 x2 = (P + Q + m * (4 * x / dt2 + 4 * v / dt + a) ... + c * (2 * x / dt + v)) / tmp1; % 式(26) f2 = bilinear( x2, x, yy, k1, k2, f ); % 変位x2に対するバイリニアの復元力 Q2 = k1 * x2 - f; % 式(3) dq = Q2 - Q; a = -a - 4 * v / dt + 4 * (x2 - x) / dt2 + dq / tmp2; % 式(28) v = -v + 2 * (x2 - x) / dt + dq * dt / 2 / tmp2; % 式(27) % 式(28)を式(27)より先に計算しないとvが更新されてしまうので注意 x = x2; % 値を更新 f = f2; Q = Q2; end % for j % ファイルへの結果出力 output(i+1,1) = i * deltaT; output(i+1,2) = eq(i+1); output(i+1,3) = x; output(i+1,4) = v; output(i+1,5) = a + eq(i+1); output(i+1,6) = f; end % for i cells = ["時間 (s)" "地震加速度 (m/s/s)" "変位 (m)" ... "速度 (m/s)" "加速度 (m/s/s)" "復元力 (kN)"]; % 質量の単位をkgにした場合は,復元力 (kN)を復元力 (N)に変更. % 次の2行でエクセルファイルに出力. writematrix(cells,'results.xlsx','WriteMode','overwritesheet'); writematrix(output,'results.xlsx','Range','A2'); disp('NORMAL END') function y = bilinear( x, xold, yy, k1, k2, yold ) % 変位xに対するバイリニア型(移動硬化型バイリニア)履歴復元力を計算 % x:変位 xold:前ステップの変位 yy:降伏耐力 % k1:初期剛性 k2:降伏後の二次剛性 yold:前ステップの復元力 % 考え方 https://www.ritsumei.ac.jp/se/rv/izuno/programming.html xy = yy / k1; % 降伏変位 yLinear = k1 * (x - xold) + yold; % 前ステップの変位から初期剛性で変化した場合の復元力 yPlus = k2 * (x - xy) + yy; % 第二剛性で決まる上側の骨格曲線上の復元力 yMinus = k2 * (x + xy) - yy; % 第二剛性で決まる下側の骨格曲線上の復元力 y = median( [yLinear yPlus yMinus] ); % 3つの復元力の中央値が,次ステップの復元力になる end
必要な地震波ファイル eq.txt は,次のようなファイルです.
0 0.09 -60.1 -69.97 -13.78 24.19