首页/文章/ 详情

基于有限元计算程序的探究(下)—方程求解、单元应变应力计算、后处理

11月前浏览1573

前言  

在上一篇文章中,已经介绍了网格的划分、刚度矩阵的求解与载荷的施加;本篇文章是在上一篇文章的基础上,讲解后续操作,主要包括:方程的求解、单元应变应力的计算与后处理(包括变形图与云图)。  

(为了上、下两篇文章保持连续性,标题、图号均续上篇)

5.方程的求解  

该部分主要是求解节点位移和约束反力,其函数为:  

[NdspRfoc]=SloveS2d3n(KSSPcons)

参数意义:  

KS2N(N为节点总数)2N列整体刚度矩阵;  

SP2N1列节点载荷矩阵;  

consRN (位移约束总数) 3列矩阵,1-3列分别为节点编号、约束位移方向、约束位移值;  

NdspN3列矩阵,1-3列分别为节点编号、x方向位移值、y方向位移值;  

RfocRN3列矩阵,1-3列分别为节点编号、约束反力方向、约束反力数值。  

源程序:  

function [Ndsp,Rfoc] = SloveS2d3n(KS, SP, cons)    

KS1 = KS;%%%整体刚度矩阵  
SP1 = SP;%%%节点载荷列阵  
nc = size(cons, 1);%%%约束个数(1个节点的xy方向约束算作2个约束)  
for i = 1:nc
     ii =cons(i, 1);  %%%约束节点编号  
     dr =cons(i, 2);  %%%约束位移方向  
     vu =cons(i, 3);  %%%约束位移值大小  
     if dr ==1       %%%如果约束了x方向  
           dof =2*ii - 1;
     else
           dof =2*ii;   %%%%约束了y方向  
end
if  vu ==0      %%%%如果约束值为0(固定约束)
        KS1(dof, :) = 0;  %%%在整体刚度矩阵中,把与零位移分量对应的行与列的非对称元素置为0、对角元素置为1
        KS1(:, dof) = 0;
        KS1(dof, dof) = 1;
         SP1(dof, 1) = 0;  %%%在载荷矩阵中,把与零位移分量对应的节点载荷置为0
   else
         KS1(dof, dof) = 1.0e9*KS1(dof, dof);  %%% 非零位移的乘大数法
         SP1(dof, 1) = KS1(dof, dof)*vu;  %%% 载荷矩阵中对应位置的数值乘以大数和整体刚度矩阵中对应的元素之积
    end
end
NDSP1 = KS1\SP1; %%%求出节点位移(2N*2N矩阵,N位节点总数)
for i = 1:nc
      ii =cons(i, 1);  %%%约束节点编号  
     dr =cons(i, 2);  %%%约束位移方向  
     Rfoc(i,1) = ii;  %%% Rfoc矩阵第1行储存约束节点编号  
     Rfoc(i,2) = dr;  %%% Rfoc矩阵第2行储存约束反力方向  
     if dr ==1
          dof =2*ii - 1;
    else
            dof =2*ii;
     end
Rfoc(i,3)= KS(dof, :)*NDSP1;  %%%刚度乘以位移等于力,Rfoc矩阵第3行储存约束反力大小
end
nn = 0.5*size(NDSP1,1); %%%节点总个数  
for i = 1:nn
     Ndsp(i,1)= i; %%% 矩阵Ndsp1列存储节点编号  
     Ndsp(i,2)= NDSP1(2*i-1, 1); %%%矩阵Ndsp2列节点x方向位移  
     Ndsp(i,3)= NDSP1(2*i, 1);  %%%矩阵Ndsp3列节点y方向位移  
end
end

函数应用实例  

clear;clc;
x12= [0,2];
y12= [0,1.5];
[Nxy,Enod]= mesh2d3n(x12,y12, 3, 3); %%%网格划分  
axis([-0.2,2.2,-0.2,1.7])
[M,N] = size(Enod)
Emat(1,1:4)= [1, 180e9, 0.35,  5e-2];
fori = 2:M
Emat(i, 1:4) = Emat(1,1:4); %%%为每个单元赋予材料属性
end
KS= SstiffM2d3n(Nxy, Enod, Emat) %%%整体刚度矩阵  
EP= [7, 8, 1, 3.5e3
7, 6, 2, -(2+2/3)*1e3
7, 9, 2, -(2+4/3)*1e3
5, 3, 2, -2/3*1e3
5, 6, 2, -4/3*1e3]; %%%载荷施加信息表
[N,M]=size(Nxy)
SP= SloadA2d3n(EP,N); %%%求解载荷列阵
cons= [1,1,0;
1,2,0;
4,2,0;
7,2,0]; %%%约束施加信息表
[Ndsp, Rfoc] = SloveS2d3n(KS, SP, cons); %%%方程求解  

运行完程序后,得到所有节点位移值和约束节点的约束反力值,如图5所示。  

 

5 方程求解结果

6. 单元应变、应力的计算  

通过方程求解得到各节点的位移值后,可以得到各单元的应变应力值,其函数为:  

[EstrainEstress]=EstssM2d3n(NxyEnodEmatNdsp)

参数意义:

Nxy:N(节点总数)行3列矩阵,1-3列分别为节点编号、节点横、纵坐标;
Enod:M(单元总数)行4列矩阵,1-4列分别为单元编号、单元所含3节点编号;
Emat:M行4列矩阵,1-4列分别为单元编号、弹性模量、泊松比、单元厚度;
Ndsp:N行3列矩阵,1-3列分别为节点编号、x方向位移值、y方向位移值;
Estrain:M行4列矩阵,1-4列分别为单元编号、应变分量;
Estress:M行4列矩阵,1-4列分别为单元编号、应力分量。

源程序  

function[Estrain,Estress] = EstssM2d3n(Nxy,Enod,Emat,Ndsp)    
[M,N]= size(Enod); %%%M为单元数  
fori = 1:M
     i1 = Enod(i,2);  %%%单元的节点编号  
     i2 = Enod(i,3);
     i3 = Enod(i,4);
     xy = [Nxy(i1,2:3);Nxy(i2,2:3);Nxy(i3,2:3)];%%%节点的横、纵坐标  
     B = EstrainM2d3n(xy);  %%%单元应变矩阵  
     DSP = [Ndsp(i1,2:3), Ndsp(i2,2:3),Ndsp(i3,2:3)]'; %%%节点xy位移分量  
     Est = B*DSP;   %%%单元应变列阵  
     Estrain(i,1:4) = [i, Est'];  %%%i个单元应变分量  
     E = Emat(i,2);    %%%弹性模量  
     mu = Emat(i,3);   %%%泊松比  
     D = [1, mu, 0; mu, 1, 0; 0, 0, (1-mu)/2];
     D = E/(1 - mu*mu)*D;  %%%弹性矩阵  
     Ess = D*Est;    %%%单元应力列阵  
     Estress(i,1:4) =[i, Ess'];   %%%i个单元应力分量  
end
end

函数应用实例

clear;clc;

x12 = [0,2];

y12 = [0,1.5];

[Nxy,Enod] =mesh2d3n(x12,y12, 3, 3); %%%网格划分  

axis([-0.2,2.2,-0.2,1.7])

[M, N] = size(Enod)

Emat(1,1:4) = [1,180e9, 0.35,  5e-2];

for i = 2:M

     Emat(i, 1:4) = Emat(1,1:4);

end

KS = SstiffM2d3n(Nxy,Enod, Emat); %%%整体刚度矩阵  

EP = [7, 8, 1, 3.5e3

7, 6, 2, -(2+2/3)*1e3

7, 9, 2, -(2+4/3)*1e3

5, 3, 2, -2/3*1e3

5, 6, 2, -4/3*1e3]; %%%载荷施加信息表

[N,M]= size(Nxy)

SP = SloadA2d3n(EP,N); %%%求解载荷列阵

cons = [1,1,0;

1,2,0;

4,2,0;

7,2,0]

[Ndsp, Rfoc] =SloveS2d3n(KS, SP, cons); %%%方程求解  

[Estrain,Estress]= EstssM2d3n(Nxy,Enod,Emat,Ndsp); %%% 求解单元应力应变    

运行完程序后,得到所有单元的应变、应力值,如图6所示。  

6 单元应变应力

7. 后处理  

得到节点的位移值后,可以绘制出各单元的变形图,其函数为:  

pltdfm2d3n(EnodNxyNdspenlarge)

参数意义:  

EnodM(单元总数)4列矩阵,1-4列分别为单元编号、单元所含3节点编号;  

Nxy N(节点总数)3列矩阵, 1-3列分别为节点编号、节点横、纵坐标;  

NdspN3列矩阵,1-3列分别为节点编号、x方向位移值、y方向位移值;  

enlarge:变形放大系数。  

源程序  

function pltdfm2d3n(Enod,Nxy,Ndsp,enlarge)  

figure
holdon
axisequal
axisoff
m= size(Enod,1); %%%单元总数  
fori=1:m
     k = Enod(i,2:4); %%%节点编号  
     x = Nxy(k,2);  %%%节点坐标  
     y = Nxy(k,3);
     x = [x;x(1)];  %%%末尾加上x(1)是为了画图时首尾相连,形成封闭图形  
     y = [y;y(1)];
      plot(x,y,'k')  %%%未变形的图形  
end
fori=1:m
     k = Enod(i,2:4)
     x = Nxy(k,2)+enlarge*Ndsp(k,2); %%%变形后节点坐标  
     y = Nxy(k,3)+enlarge*Ndsp(k,3);
     x = [x;x(1)];
     y = [y;y(1)];
     plot(x,y,'r')   %%%变形后的图形  
end
end  

函数应用实例  

clear;clc;

x12 = [0,2];

y12 = [0,1.5];

[Nxy,Enod] =mesh2d3n(x12,y12, 3, 3);

axis([-0.2,2.2,-0.2,1.7])

[M, N] = size(Enod)

Emat(1,1:4) = [1,180e9, 0.35,  5e-2];

for i = 2:M

     Emat(i, 1:4) = Emat(1,1:4);  %%%为每个单元赋属性

end

KS = SstiffM2d3n(Nxy,Enod, Emat); %%%整体刚度矩阵

EP = [7, 8, 1, 3.5e3

7, 6, 2, -(2+2/3)*1e3

7, 9, 2, -(2+4/3)*1e3

5, 3, 2, -2/3*1e3

5, 6, 2, -4/3*1e3];  %%%解载荷列阵  

[N,M]= size(Nxy)

SP = SloadA2d3n(EP,N); %%%求解载荷列阵  

cons = [1,1,0;

1,2,0;

4,2,0;

7,2,0];

[Ndsp, Rfoc] =SloveS2d3n(KS, SP, cons); %%%求解方程

Nvar(:,1:2) =Ndsp(:,1:2);  %%%%节点位移

enlarge = 1e5; %%%变形放大系数

pltdfm2d3n(Enod,Nxy,Ndsp,enlarge); %%%画出单元变形图  

运行完程序后,得到单元变形前、变形后的图形,如图7所示。  

7 单元变形前后图形对比

除了得到单元变形图之外,还可以得到单元变形云图,其函数为:  

pltvc2d3n(EnodNxyNvar)

参数意义:  

EnodM(单元总数)4列矩阵,1-4列分别为单元编号、单元所含3节点编号;  

NxyN(节点总数)3列矩阵,1-3列分别为节点编号、节点横、纵坐标;  

NvarN2列矩阵,1-2列分别为节点编号、节点位移值。  

源程序  

functionpltvc2d3n(Enod,Nxy,Nvar)  

figure

holdon

axisequal

axisoff

m= size(Enod,1)

fori=1:m

     k = Enod(i,2:4);

     x = Nxy(k,2);

     y = Nxy(k,3);

     c = Nvar(k,2);  %%% 节点位移  

    fill(x,y,c);    %%%填充xy确定的图形,填充颜色由c来决定  

end

colorbar('location','eastoutside')

end  

函数应用实例

clear;clc;
x12 = [0,2];
y12 = [0,1.5];
[Nxy,Enod] =mesh2d3n(x12,y12, 3, 3); %%%网格划分
axis([-0.2,2.2,-0.2,1.7])
[M, N] = size(Enod)
Emat(1,1:4) = [1,180e9, 0.35,  5e-2];
for i = 2:M
     Emat(i, 1:4) = Emat(1,1:4);
end
KS = SstiffM2d3n(Nxy,Enod, Emat);%%%整体刚度求解
EP = [7, 8, 1, 3.5e3
7, 6, 2, -(2+2/3)*1e3
7, 9, 2, -(2+4/3)*1e3
5, 3, 2, -2/3*1e3
5, 6, 2, -4/3*1e3]; %%%载荷施加信息表
[N,M]= size(Nxy);
SP = SloadA2d3n(EP,N); %%%载荷施加
cons = [1,1,0;
1,2,0;
4,2,0;
7,2,0]
[Ndsp, Rfoc] =SloveS2d3n(KS, SP, cons);  %%%方程求解
Nvar(:,1:2) =Ndsp(:,1:2);
pltvc2d3n(Enod,Nxy,Nvar);%%%单元变形云图    

运行完程序后,得到单元变形后的云图,如图8所示。  

8 单元变形云图  

至此,结构有限元所有的步骤及相关程序都已列出,大家可以根据自己兴趣来选择阅读和编写程序。  

前面叙述较为零散,为了大家阅读方便,现把问题及程序从头到尾再列一遍(大部分都已在前面列出)。  

问题描述如图9(摘自周博老师的《有限元法与MATLAB》)。

9 问题描述  

求解程序:  

clear;clc;

x12= [0,2];

y12= [0,1.5];

[Nxy,Enod]= mesh2d3n(x12,y12, 3, 3); %%%三角网格划分  

axis([-0.2,2.2,-0.2,1.7]);

[M,N] = size(Enod);

Emat(1,1:4)= [1, 180e9, 0.35,  5e-2];

fori = 2:M

     Emat(i, 1:4) = Emat(1,1:4); %%%%每个节点的材料属性  

end

KS= SstiffM2d3n(Nxy, Enod, Emat); %%%整体刚度矩阵(内嵌了单元刚度矩阵函数)  

EP= [7, 8, 1, 3.5e3

7, 6, 2, -(2+2/3)*1e3

7, 9, 2, -(2+4/3)*1e3

5, 3, 2, -2/3*1e3

5, 6, 2, -4/3*1e3];  %%%载荷施加信息矩阵  

[N,M]=size(Nxy);

SP= SloadA2d3n(EP,N); %%%节点载荷列阵  

cons= [1,1,0;

1,2,0;

4,2,0;

7,2,0];    %%%%约束施加信息矩阵  

[Ndsp,Rfoc] = SloveS2d3n(KS, SP, cons); %%%求解节点位移和节点约束反力

Nvar(:,1:2)= Ndsp(:,1:2); %%%把所有节点的编号、x方向位移分量提取出来,为下一步画云图所用

enlarge=1e5;

pltdfm2d3n(Enod,Nxy,Ndsp,enlarge);%%%把离散结构变形图画出

pltvc2d3n(Enod,Nxy,Nvar); %%%把各节点的x方向位移分量用云图表示  

运行以上程序后,网格划分见图10、单元变形图见图7、单元变形云图见图8  

10 网格划分

   

来源:CAE与Dynamics学习之友
MATLAB材料
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-12-09
最近编辑:11月前
CAE与Dynamics学习之友
博士 乾坤未定,你我皆是黑马
获赞 26粉丝 69文章 32课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈