⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fembeam2d.m

📁 梁元有限元分析源码(用matlab语言编写而成)
💻 M
字号:
% plane stress problem
clc;clear;
Lx=9;Ly=3;
%x=Lx;y=Ly;%单元范围[0,Lx]*[0,Ly]
Nx=12;Ny=6;%x,y方向划分单元数,Nx=Ny
Nodes=(Nx+1)*(Ny+1);%节点总数
Enum=Nx*Ny;
A=(Lx*Ly)/(2*Nx*Ny);%单元面积
E=2e10;
mu=0.167;
t=1;
q=10*Lx;
qe=q/Nx;

D=E*[1,mu,0;mu,1,0;0,0,(1-mu)/2]/(1-mu*mu);
xe1=[Lx/Nx;0;0];ye1=[Ly/Ny;Ly/Ny;0];%上三角,单数单元
xe2=[0;Lx/Nx;Lx/Nx];ye2=[0;0;Ly/Ny];%下三角,双数单元
b1=zeros(3,1);c1=zeros(3,1);
b2=zeros(3,1);c2=zeros(3,1);
for i=1:3
    if(i==1)	j=2;m=3;                                       %i
		else if(i==2)	j=3;m=1;                               %%  %
		    else if(i==3)	j=1;m=2;                           %%    %
                 end                                           %%%%%%%%%%% m
             end                                                %j
    end
    b1(i)=ye1(j)-ye1(m);
    c1(i)=-xe1(j)+xe1(m);
    b2(i)=ye2(j)-ye2(m);
    c2(i)=-xe2(j)+xe2(m);
end

B1=[b1(1),0,b1(2),0,b1(3),0;0,c1(1),0,c1(2),0,c1(3);c1(1),b1(1),c1(2),b1(2),c1(3),b1(3)]/(2*A);
B2=[b2(1),0,b2(2),0,b2(3),0;0,c2(1),0,c2(2),0,c2(3);c2(1),b2(1),c2(2),b2(2),c2(3),b2(3)]/(2*A);
S1=D*B1;
S2=D*B2;
k=(B1')*D*B1*t*A;
% kkk=(B2')*D*B2*t*A; % k=kkk;

K=zeros(Nodes*2,Nodes*2);
qNodes=zeros(Nodes*2,1);
U=zeros(Nodes*2,1);
index1=[];index2=[];
%left
for i=2:Ny
    K(2*i-1:2*i,2*i-1:2*i)=k(1:2,1:2)+k(3:4,3:4)+k(5:6,5:6);
    K(2*i-1:2*i,2*(i+1)-1:2*(i+1))=k(3:4,5:6);
    K(2*i-1:2*i,2*(i+Ny+1)-1:2*(i+Ny+1))=k(3:4,1:2)+k(1:2,3:4);
    K(2*i-1:2*i,2*(i+Ny)-1:2*(i+Ny))=k(1:2,5:6)+k(5:6,1:2);
    K(2*i-1:2*i,2*(i-1)-1:2*(i-1))=k(5:6,3:4);
%     i
    U(2*i-1)=0;
    index1=[index1;2*i-1];
end
%bottom
for i=2:Nx
    s=i*(Ny+1);
    K(2*s-1:2*s,2*s-1:2*s)=k(1:2,1:2)+k(3:4,3:4)+k(5:6,5:6);
    K(2*s-1:2*s,2*(s-Ny-1)-1:2*(s-Ny-1))=k(3:4,1:2);
    K(2*s-1:2*s,2*(s+Ny+1)-1:2*(s+Ny+1))=k(1:2,3:4);
    K(2*s-1:2*s,2*(s+Ny)-1:2*(s+Ny))=k(5:6,1:2)+k(1:2,5:6);
    K(2*s-1:2*s,2*(s-1)-1:2*(s-1))=k(5:6,3:4)+k(3:4,5:6);
end
%right
for i=Nodes-Ny+1:Nodes-1
%     i
    K(2*i-1:2*i,2*i-1:2*i)=k(1:2,1:2)+k(3:4,3:4)+k(5:6,5:6);
    K(2*i-1:2*i,2*(i+1)-1:2*(i+1))=k(5:6,3:4);
    K(2*i-1:2*i,2*(i-Ny-1)-1:2*(i-Ny-1))=k(3:4,1:2)+k(1:2,3:4);
    K(2*i-1:2*i,2*(i-Ny)-1:2*(i-Ny))=k(1:2,5:6)+k(5:6,1:2);
    K(2*i-1:2*i,2*(i-1)-1:2*(i-1))=k(3:4,5:6);
end
%top
for i=1:Nx-1
    r=1+i*(Ny+1);
    K(2*r-1:2*r,2*r-1:2*r)=k(1:2,1:2)+k(3:4,3:4)+k(5:6,5:6);
    K(2*r-1:2*r,2*(r-Ny-1)-1:2*(r-Ny-1))=k(1:2,3:4);
    K(2*r-1:2*r,2*(r-Ny)-1:2*(r-Ny))=k(5:6,1:2)+k(1:2,5:6);
    K(2*r-1:2*r,2*(r+1)-1:2*(r+1))=k(5:6,3:4)+k(3:4,5:6);
    K(2*r-1:2*r,2*(r+Ny+1)-1:2*(r+Ny+1))=k(3:4,1:2);
    qNodes(2*r)=-qe;
end
%corner
K(1:2,1:2)=k(3:4,3:4);
K(1:2,3:4)=k(3:4,5:6);
K(1:2,2*(1+Ny+1)-1:2*(1+Ny+1))=k(3:4,1:2);
U(1)=0;
index1=[index1;1];
qNodes(2)=-qe/2;

K(2*(1+Ny)-1:2*(1+Ny),2*(1+Ny)-1:2*(1+Ny))=k(1:2,1:2)+k(5:6,5:6);
K(2*(1+Ny)-1:2*(1+Ny),2*Ny-1:2*(Ny))=k(5:6,3:4);
K(2*(1+Ny)-1:2*(1+Ny),2*(1+Ny+1+Ny)-1:2*(1+Ny+1+Ny))=k(1:2,3:4);
K(2*(1+Ny)-1:2*(1+Ny),2*(1+Ny+Ny)-1:2*(1+Ny+Ny))=k(1:2,5:6)+k(5:6,1:2);
U(2*(1+Ny)-1)=0;
index1=[index1;2*(1+Ny)-1];

K(2*Nodes-1:2*Nodes,2*Nodes-1:2*Nodes)=k(3:4,3:4);
K(2*Nodes-1:2*Nodes,2*(Nodes-1)-1:2*(Nodes-1))=k(3:4,5:6);
K(2*Nodes-1:2*Nodes,2*(Nodes-Ny-1)-1:2*(Nodes-Ny-1))=k(3:4,1:2);
U(2*Nodes)=0;
index2=[index2;2*Nodes];

K(2*(Nodes-Ny)-1:2*(Nodes-Ny),2*(Nodes-Ny)-1:2*(Nodes-Ny))=k(1:2,1:2)+k(5:6,5:6);
K(2*(Nodes-Ny)-1:2*(Nodes-Ny),2*(Nodes-Ny+1)-1:2*(Nodes-Ny+1))=k(5:6,3:4);
K(2*(Nodes-Ny)-1:2*(Nodes-Ny),2*(Nodes-Ny-Ny-1)-1:2*(Nodes-Ny-Ny-1))=k(1:2,3:4);
K(2*(Nodes-Ny)-1:2*(Nodes-Ny),2*(Nodes-Ny-Ny)-1:2*(Nodes-Ny-Ny))=k(5:6,1:2)+k(1:2,5:6);
qNodes(2*(Nodes-Ny))=-qe/2;

%inner
for i=1:Nx-1
    for j=1:Ny-1
        l=1+i*(Ny+1)+j;
        K(2*l-1:2*l,2*l-1:2*l)=2*k(5:6,5:6)+2*k(3:4,3:4)+2*k(1:2,1:2);
        K(2*l-1:2*l,2*(l-Ny-1)-1:2*(l-Ny-1))=k(3:4,1:2)+k(1:2,3:4);
        K(2*l-1:2*l,2*(l-Ny)-1:2*(l-Ny))=k(1:2,5:6)+k(5:6,1:2);
        K(2*l-1:2*l,2*(l+1)-1:2*(l+1))=k(5:6,3:4)+k(3:4,5:6);
        K(2*l-1:2*l,2*(l+Ny+1)-1:2*(l+Ny+1))=k(3:4,1:2)+k(1:2,3:4);
        K(2*l-1:2*l,2*(l+Ny)-1:2*(l+Ny))=k(1:2,5:6)+k(5:6,1:2);
        K(2*l-1:2*l,2*(l-1)-1:2*(l-1))=k(5:6,3:4)+k(3:4,5:6);
    end
end

KTemp=K;% save K as KTemp
qNodesTemp=qNodes;

index_total_zero=[index1;index2];
number_zero=numel(index_total_zero);
%删去位移为零对应的行和列
for i=1:number_zero
    maxindex=max(index_total_zero);
    K(maxindex,:)=[];
    K(:,maxindex)=[];
    qNodes(maxindex)=[];
    index_total_zero=setdiff(index_total_zero,maxindex);
end
%零位移标号
index_total_zero=[index1;index2];
%位移标号
index_total=[];
for i=1:Nodes*2
    index_total=[index_total;i];
end
%计算非零位移对应的在原位移序列中的标号
index_total_nonzero=setdiff(index_total,index_total_zero);

number_nonzero=numel(index_total_nonzero);
%计算非零位移
U_temp=inv(K)*qNodes;
%把计算所的的非零位移放回原位移序列中对应的位置
for i=1:number_nonzero
    U(index_total_nonzero(i))=U_temp(i);
end

Ux=zeros(Nodes,1);
Uy=zeros(Nodes,1);
for i=1:Nodes
    Ux(i)=U(2*i-1);
    Uy(i)=U(2*i);
end


xgrid=0:(Lx/Nx):Lx;
ygrid=Ly:-(Ly/Ny):0;
[X,Y]=meshgrid(xgrid,ygrid);

% % mesh
% M=(reshape(Ux,Ny+1,Nx+1));
% figure(1);
% subplot(2,2,1)
% Mesh(X,Y,M)
% xlabel('X-axis'),ylabel('Y-axis'),zlabel('x向位移')
% title('有限元法解简支梁问题计算结果数据可视化 图 1')
% 
% subplot(2,2,2)
% Mesh(X,Y,M)
% xlabel('X-axis'),ylabel('Y-axis'),zlabel('x向位移')
% title('图 2')
% view(30,20)
% 
% subplot(2,2,3)
% Mesh(X,Y,M)
% xlabel('X-axis'),ylabel('Y-axis'),zlabel('x向位移')
% title('图 3')
% view(-30,45)
% 
% subplot(2,2,4)
% surfl(X,Y,M)
% view(-60,45)
% shading interp
% xlabel('X-axis'),ylabel('Y-axis'),zlabel('x向位移')
% title('图 4')

%绘制网格
figure(2)
xmin1=0;%区域左端的x值
xmax1=Lx;%区域右端的x值
ymin1=0;%区域下端的y值
ymax1=Ly;%区域上端的y值
n1=Nx+1;%区域划分的纵线数
m1=Ny+1;%区域划分的横线数

a1=zeros(m1*n1);b1=zeros(m1*n1);
xy1=zeros(m1*2,2);x1=zeros(1,m1*n1);y1=zeros(1,m1*n1);
%计算节点坐标
for kk=1:n1
    for i=1:m1
        x1(i+(kk-1)*m1)=xmin1+(kk-1)*(xmax1-xmin1)/(n1-1);
        y1(i+(kk-1)*m1)=ymin1+(i-1)*(ymax1-ymin1)/(m1-1);
    end
end
clear kk i
a1(m1,m1)=2;
a1((n1-1)*m1+1,(n1-1)*m1+1)=2;
a1(1,1)=3;
a1(n1*m1,n1*m1)=3;
for i=1:(n1-2)
    a1(i*m1+1,i*m1+1)=4;
    a1((i+1)*m1,(i+1)*m1)=4;
end
clear i
for j=2:(m1-1)
    a1(j,j)=4;
    a1((n1-1)*m1+j,(n1-1)*m1+j)=4;
end
clear j
for i=1:(n1-2)
    for j=2:(m1-1)
        a1(i*m1+j,i*m1+j)=6;
    end
end
clear i j
a1=sparse(a1);
clear i j
for i=1:n1*m1-1
    b1(i,i+1)=-1;
end
clear i
for i=1:(n1-1)*m1
    b1(i,i+m1)=-1;
end
clear i
for i=1:(n1-1)*m1-1
    b1(i,i+m1+1)=-1;
end
for kk=1:n1-1
    for h=1:n1-1
        b1(m1*kk,m1*h+1)=0;
    end
end
clear kk h
b1=sparse(b1);
b1=a1+b1'+b1;
clear a1
a1=sparse(b1);
clear b1
xy1=[x1',y1'];
subplot(2,2,1);
gplot(a1,xy1);%绘制网格图


%compute the stress of every element F
UElement=zeros(6,Nx*Ny*2); % element's displacement
thigma=zeros(3,Nx*Ny*2);
for i=1:Nx
    for j=(i-1)*Ny+1:i*Ny
%         2*j-1;
%         j;
        w=j+i-1;
        UElement(:,2*j-1)=[Ux(w+Ny+1);Uy(w+Ny+1);Ux(w);Uy(w);Ux(w+1);Uy(w+1)];
        UElement(:,2*j)=[Ux(w+1);Uy(w+1);Ux(w+1+Ny+1);Uy(w+1+Ny+1);Ux(w+Ny+1);Uy(w+Ny+1)];
        thigma(:,2*j-1)=S1*UElement(:,2*j-1);
        thigma(:,2*j)=S2*UElement(:,2*j);
    end
%     disp('con');
end

%calculate the stress of every nodes
thigma_nodes=zeros(3,Nodes);
%modify the strss of nodes
%left
for i=2:Ny
    thigma_nodes(:,i)=(thigma(:,2*i-3)+thigma(:,2*i-2)+thigma(:,2*i-1))/3;
end

%bottom
for i=2:Nx
%     i
    s=i*(Ny+1);
%     2*(i-1)*Ny
%     2*i*Ny
%     2*i*Ny-1
%     disp('con');
    thigma_nodes(:,s)=(thigma(:,2*(i-1)*Ny)+thigma(:,2*i*Ny)+thigma(:,2*i*Ny-1))/3;
end

%right
for i=Nodes-Ny+1:Nodes-1
%     i
    ii=2*(Nx-1)*Ny+2+2*(i-(Nodes-Ny+1));
%     disp('con');
    thigma_nodes(:,i)=(thigma(:,ii)+thigma(:,ii+1)+thigma(:,ii+2))/3;
end

%top
for i=1:Nx-1
    r=1+i*(Ny+1);
%     2*(i-1)*Ny+1
%     2*(i-1)*Ny+2
%     2*i*Ny+1
%     disp('con');
    thigma_nodes(:,r)=(thigma(:,2*(i-1)*Ny+1)+thigma(:,2*(i-1)*Ny+2)+thigma(:,2*i*Ny+1))/3;
end

%corner
thigma_nodes(:,1)=thigma(:,1);
thigma_nodes(:,Nodes)=thigma(:,2*Nx*Ny);
thigma_nodes(:,1+Ny)=(thigma(:,2*Ny-1)+thigma(:,2*Ny))/2;
thigma_nodes(:,Nodes-Ny)=(thigma(:,2*(Nx-1)*Ny+1)+thigma(:,2*(Nx-1)*Ny+2))/2;


%inner
for i=1:Nx-1
    for j=1:Ny-1
        l=1+i*(Ny+1)+j;
        ll=2*(i-1)*Ny+2*j;
        lll=2*i*Ny+2*j;
%         disp('con');
    thigma_nodes(:,l)=(thigma(:,ll)+thigma(:,ll+1)+thigma(:,ll+2)+thigma(:,lll)+thigma(:,lll-1)+thigma(:,ll+1))/6;
    end
end

% mesh
M1=thigma_nodes(1,:);
M11=reshape(M1,Ny+1,Nx+1);

figure(1);
subplot(2,2,1)
Mesh(X,Y,M11)
xlabel('X-axis'),ylabel('Y-axis'),zlabel('Stress1')
title('有限元法解简支梁问题计算结果数据(Stress)可视化 图 1')

subplot(2,2,2)
Mesh(X,Y,M11)
xlabel('X-axis'),ylabel('Y-axis'),zlabel('Stress1')
title('图 2')
view(30,20)

subplot(2,2,3)
Mesh(X,Y,M11)
xlabel('X-axis'),ylabel('Y-axis'),zlabel('Stress1')
title('图 3')
view(-30,45)

subplot(2,2,4)
surfl(X,Y,M11)
view(-60,45)
shading interp
xlabel('X-axis'),ylabel('Y-axis'),zlabel('Stress1')
title('图 4')

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -