FEM-Course-Matlab/12+13框架结构动力分析(模态分析+时程分析)/main_frame.m

137 lines
3.8 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

clc,clear,close all
tic
nodeCoord=[0 0;0 3;0 6 ;0 9; 5 0;5 3;5 6;5 9];
x=nodeCoord(:,1)'; % 节点x轴方向坐标
y=nodeCoord(:,2)'; % 节点y轴方向坐标
A=0.08;E=3e10;I=0.0128/12; % 定义截面面积和弹性模量
rho=3000;
%单元信息编号节点1编号节点2编号截面面积弹性模量
ele=[1 1 2 A E I;2 2 3 A E I; 3 3 4 A E I;4 5 6 A E I; 5 6 7 A E I;6 7 8 A E I;7 2 6 A E I;8 3 7 A E I;9 4 8 A E I];;
%载荷信息节点编号x方向力y方向力z方向力
Load=[4 2e5 0 0];
%约束节点编号x方向约束y方向约束z方向约束
Constr=[1 0 0 0;5 0 0 0];
Dofs=3*size(x,2); %总自由度数
EleCount=size(ele,1); %单元总数
K=zeros(Dofs,Dofs); %总体刚度矩阵
M=zeros(Dofs,Dofs); %总体质量矩阵
F=zeros(Dofs,1); %总体载荷列阵
U=zeros(Dofs,1); %总体位移列阵
BarLength=BarsLength(x,y,ele);
figure('Name','Undeformed Truss')
RenderFrame(ele,Load,Constr,x,y,U,1,'-k',1) %绘制框架
hold on
%遍历所有单元,将各单元刚度阵分块组装到总体刚度阵
for iEle =1:EleCount
%该单元的两个节点的编号
n1=ele(iEle,2);n2=ele(iEle,3);
%计算坐标变换矩阵
R=CoordTransform([x(n1) x(n2)],[y(n1) y(n2)],BarLength(iEle));
%计算单元刚度矩阵 Ke=R'*ke*R;局部坐标系下的单元刚度阵转换为全局坐标下的单元刚度阵
ke= FrameElementKe(ele(iEle,4),ele(iEle,5),ele(iEle,6),R,BarLength(iEle));
me= FrameElementMe(A,rho,R,BarLength(iEle));
%将各单元刚度分块组装到总刚相应位置
eleDof=[n1*3-2:n1*3,n2*3-2:n2*3];
K(eleDof,eleDof)=K(eleDof,eleDof)+ke;
M(eleDof,eleDof)=M(eleDof,eleDof)+me;
end
for i=1:length(Constr(:,1))
restrainedDof(1+(i-1)*3:3+(i-1)*3)=(Constr(i,1)-1)*3+[1:3];
end
activeDof=setdiff([1:Dofs]',restrainedDof);
if det(M(activeDof,activeDof))>0
A=M(activeDof,activeDof)\K(activeDof,activeDof);
[Vo,Do]=eig(A);
fo=diag(sqrt(Do)/(2*pi));
Vf=sortrows([Vo',fo],size(Vo,1)+1);
V=Vf(:,1:size(Vo,1))';%sort eignvectgors
elseif det(K(activeDof,activeDof))>0
A=K(activeDof,activeDof)\M(activeDof,activeDof);
[Vo,Do]=eig(A);
fo=power(diag(sqrt(Do)),-1)/(2*pi);
Vf=sortrows([Vo',fo],size(Vo,1)+1);
V=Vf(:,1:size(Vo,1))';%sort eignvectgors
end
f=sort(fo);%自振频率
figure
for i=1:5
subplot(1,5,i)
ModeNum=i;%第五阶模态
U=zeros(Dofs,1);
U(activeDof)=V(:,ModeNum)';
RenderFrame(ele,Load,Constr,x,y,U,1,'-.b',200) %绘制模态振型
axis off
end
%自振角频率
w1=2*pi*f(1);
w2=2*pi*f(2);
w3=2*pi*f(3);
w4=2*pi*f(4);
w5=2*pi*f(5);
epsilon=0.05;%阻尼比
a00=(2*epsilon*w1*w3)/(w1+w3);%假定控制频率为w1 w3
a11=(2*epsilon)/(w1+w3);
C=a00*M+a11*K; %形成阻尼矩阵
%读取加速度时程
[t,acc_x]=textread('x_acceleration.txt','%f,%f,');
dt=t(2)-t(1);
n=length(t);
vel_x = zeros(length(t),1);
dis_x = zeros(length(t),1);
for i = 2:length(t)
vel_x(i) = trapz(acc_x(1:i),t(1:i));
end
for i = 2:length(t)
dis_x(i) = trapz(vel_x(1:i),t(1:i));
end
figure
subplot(3,1,1)
plot(t,acc_x)
subplot(3,1,2)
plot(t,vel_x)
subplot(3,1,3)
plot(t,dis_x)
title('地震波')
mm=M(activeDof,activeDof);
kk=K(activeDof,activeDof);
cc=C(activeDof,activeDof);
% plot(tt,vw);
% %%%%%%%%%%%%%%%%
beta=0.25;
gamma=0.5;
%注意newmark-beta法代入的三大类矩阵可以是划行划列后的也可以是结构整体矩阵但后者需要在NewmarkBeta1中施加约束
[uu,vv,aa,ttt]=NewmarkBeta1(t,dt,gamma,beta,mm,cc,kk,acc_x,Constr);%相对位移速度加速度
uuu=zeros(size(M,1),length(t));%位移
vvv=zeros(size(M,1),length(t));%位移
aaa=zeros(size(M,1),length(t));%位移
uuu(activeDof,:)=uu;
vvv(activeDof,:)=vv;
aaa(activeDof,:)=aa;
for i=1:size(uuu,1)
base_disp(i,:)=dis_x;
end
% uuu_t=uuu+base_disp;
figure%绘制顶部节点的位移速度和加速度
toc %disp(['运行时间: ',num2str(toc)])
subplot(3,1,1);
plot(ttt,uu(end-2,:));
subplot(3,1,2);
plot(ttt,vv(end-2,:));
subplot(3,1,3);
plot(ttt,aa(end-2,:));
figure%绘制最后时刻框架变形
RenderFrame(ele,Load,Constr,x,y,uuu(:,end),1,'-.b',200) %
speed=1;%动画播放速度的
delaytime=0;
RenderFrameMotion(ele,Load,Constr,x,y,uuu,1,'-.b',delaytime,speed) %