MATLAB在处理平面有限元问题和梁弯曲问题上有很强的能力,主要体现在以下几个方面:

建模与网格划分

MATLAB内置了方便的图形界面工具(pdetoolbox等),可以快速对几何模型进行二维三维网格划分,生成有限元分析需要的网格。

求解器

MATLAB内置了多种求解偏微分方程的有限元求解器,如:适用于线性和非线性问题的有限元求解器assembler,适用于时间依赖问题的时间自适应求解器timestepper等。这些求解器可以自动组装刚度矩阵并求解。

后处理

MATLAB支持多种后处理,可以方便的进行解的可视化,绘制云图、矢量图、剪切面;也可以计算量化解的误差与收敛性,绘制相关曲线。

应用程序接口

MATLAB提供了应用程序接口,允许自定义复杂几何模型,加载网格,实现自定义的有限元运算与后处理。

梁弯曲分析

对于梁的弯曲问题,MATLAB提供了专门的梁挠度计算与绘制工具beamCrippling,可以快速获得梁的弯矩与切力图,并自动检查其强度。

总的来说,利用MATLAB强大的工具箱与API,可以高效的对平面及梁挠问题进行预处理、求解与后处理,得到定量结果及直观的可视化。

主程序:

%% ---------------四边形八节点等参元 matlab计算程序----------------------------

clear all;clc; close all;

format short e ;

%%读入控制数据

E=1E5;                  %弹性模量

v=0.25;                  % 泊松比

h=1;                  %厚度

NumberElement=4;              %单元数

NumberNode=23;              % 总结点数

ElementNode=8;              %单元节点数

ForcePoint=1;             %受力结点数

NumberConstraint=3;              %约束结点个数

%% 节点坐标 x  y

% 结点号 x,y坐标(整体坐标下)

gNdt = [0.0000000e+000  -0.5000000e+000;

    1.0000000e+000  -0.5000000e+000;

    2.0000000e+000  -0.5000000e+000;

    3.0000000e+000  -0.5000000e+000;

    4.0000000e+000  -0.5000000e+000;

    5.0000000e+000  -0.5000000e+000;

    6.0000000e+000  -0.5000000e+000;

    7.0000000e+000  -0.5000000e+000;

    8.0000000e+000  -0.5000000e+000;

    0.0000000e+000  0.0000000e+000;

    2.0000000e+000  0.0000000e+000;

    4.0000000e+000  0.0000000e+000;

    6.0000000e+000  0.0000000e+000;

    8.0000000e+000  0.0000000e+000;

    0.0000000e+000  0.5000000e+000;

    1.0000000e+000  0.5000000e+000;

    2.0000000e+000  0.5000000e+000;

    3.0000000e+000  0.5000000e+000;

    4.0000000e+000  0.5000000e+000;

    5.0000000e+000  0.5000000e+000;

    6.0000000e+000  0.5000000e+000;

    7.0000000e+000  0.5000000e+000;

    8.0000000e+000  0.5000000e+000];

%% 单元节点

gElt = [1  2   3  11  17  16  15  10;

    3  4   5  12  19  18  17  11;

    5  6   7  13  21  20  19  12;

    7  8   9  14  23  22  21  13]; % 单元定义: 单元结点号(逆时针)

FPOIN=[9 0 -1];% 节点力:结点号、X方向力(向右正),Y方向力(向上正)

FIXED=[1 1 1;

    10 1 1;

    15 1 1];

%约束信息数组(n,3) n:受约束节点数目, (n,1):约束点号

%(n,2)与(n,3)分别为约束点x方向和y方向的约束情况,受约束为1否则为0

%========平面应力问题的求解==============

%  刚度矩阵的生成

%计算刚度矩阵,并对约束条件进行处理

Ke=zeros(2*ElementNode,2*ElementNode);   % 单元刚度矩阵并清零

HK=zeros(2*NumberNode,2*NumberNode);   % 总刚矩阵并清零

%调用子程序 生成单元刚度矩阵

for m=1:NumberElement                %m为单元号

    Ke=K(E,v,h,...

        gNdt(gElt(m,1),1),gNdt(gElt(m,1),2),...

        gNdt(gElt(m,3),1),gNdt(gElt(m,3),2),...

        gNdt(gElt(m,5),1),gNdt(gElt(m,5),2),...

        gNdt(gElt(m,7),1),gNdt(gElt(m,7),2));    %调用单元刚度矩阵

   

    a=gElt(m,:);   %临时向量,用来记录当前单元的节点编号

   

    % 对总刚度矩阵的处理

    for j=1:8

        for k=1:8

            HK((a(j)*2-1):a(j)*2,(a(k)*2-1):a(k)*2)=HK((a(j)*2-1):a(j)*2,(a(k)*2-1):a(k)*2)+...

                Ke(j*2-1:j*2,k*2-1:k*2);

        end

    end

end

%—————————————————————————————————

% 对荷载向量进行处理

FORCE=zeros(2*NumberNode,1);      % 张成总荷载向量并清零

for i=1:ForcePoint

    b1=FPOIN(i,1)*2-1;b2=FPOIN(i,1)*2;     %FPION(i,1)为作用点

    FORCE(b1)=FPOIN(i,2);                 %FPION(i,2)为x方向的节点力

    FORCE(b2)=FPOIN(i,3);                 %FPION(i,3)为y方向的节点力

end

%—————————————————————————————————

%将约束信息加入总刚,总荷载

for i=1:NumberConstraint

    if FIXED(i,2)==1

        c1=2*FIXED(i,1)-1;

        HK(c1,:)=0;      %将一约束序号处的总刚列向量清0

        HK(:,c1)=0;      %将一约束序号处的总刚行向量清0

        HK(c1,c1)=1;     %将行列交叉处的元素置为1

        FORCE(c1)=0;

    end

    if FIXED(i,3)==1

        c2=2*FIXED(i,1);

        HK(c2,:)=0;

        HK(:,c2)=0;

        HK(c2,c2)=1;

        FORCE(c2)=0;

    end

end

%—————————————————————————————————

HK

Displacement=HK\FORCE;%计算节点位移向量

%% 转换

Displacement2=reshape(Displacement,2,length(Displacement)/2)';

gNdt2=gNdt+Displacement2*100;

figure;

gNdt;

for i=1:size(gElt,1)

    for j=1:8

        %画点

        plot(gNdt(gElt(i,:),1),gNdt(gElt(i,:),2),'b-');

        hold on;

        %画线

        plot(gNdt2(gElt(i,:),1),gNdt2(gElt(i,:),2),'r-');

        hold on;

    end

end

axis equal;

xlabel('x(m)');

ylabel('y(m)');

title('八节点四边形等参单元:梁位移(放大100倍)');

%———————————求解单元应力————————————————

stress=zeros(3,NumberElement);

for m=1:NumberElement

    u(1:16)=0;

    d=gElt(m,:);    %临时向量,用来记录当前单元的节点编号

    for i=1:ElementNode

        u(i*2-1:i*2)=Displacement(d(i)*2-1:d(i)*2);

        %从总位移向量中取出当前单元的节点位移

    end

    D=(E/(1-v*v))*[1 v 0;v 1 0;0 0 (1-v)/2];%弹性矩阵

    %形成应变矩阵BM

    BM=zeros(3,16);

    for i=1:ElementNode

        J=Jacobi(gNdt(gElt(m,1),1),gNdt(gElt(m,1),2),...

            gNdt(gElt(m,3),1),gNdt(gElt(m,3),2),...

            gNdt(gElt(m,5),1),gNdt(gElt(m,5),2),...

            gNdt(gElt(m,7),1),gNdt(gElt(m,7),2),0,0);

        [N_s,N_t]=DHS(0,0);

        B1i=J(2,2)*N_s(i)-J(1,2)*N_t(i);

        B2i=-J(2,1)*N_s(i)+J(1,1)*N_t(i);

        BM(1:3,2*i-1:2*i)=[B1i 0;0 B2i;B2i B1i]/det(J);

    end

    stressm=D*BM*u';

    stress(:,m)=stressm;

end

stress      %输出应力

程序结果:

MATLAB有限元应用-四边形八节点梁受力弯曲-LMLPHP

02-02 23:42