有限元方法[Matlab]-笔记

<-- 访问笔记代码仓库 -->

<< MATLAB Codes for Finite Element Analysis - Solids and Structures (Ferreira) >> 笔记

第一章:matlab基础

第二章: 离散系统

笔记、例题

Page 1

Page 2

Page 3

Matlab代码

problem1.m

% MATLAB codes for Finite Element Analysis

%  Problem 1: 3 springs problem

% clear memory
clear ;

% ? define vars
P=10; % N
ki=[1;1;1;1];

% elementNodes: connections at elements
elementNodes=[1 2;
            2 3;
            2 4];

% numberElements: number of Elements
numberElements=size(elementNodes,1);

% numberNodes: number of nodes
numberNodes=4;

% for structure:
% displacements: displacement vector N x 1
% force : force vector N x 1
% stiffness: stiffness matrix N x N
displacements=zeros(numberNodes,1); %#ok<PREALL>
force=zeros(numberNodes,1);
stiffness=zeros(numberNodes);

% applied load at node 2
force(2)=P;
% computation of the system stiffness matrix
for e=1:numberElements
    % elementDof: element degrees of freedom (Dof)
    elementDof=elementNodes(e,:) ;
    stiffness(elementDof,elementDof)=...
    stiffness(elementDof,elementDof)+ki(e)*[1 -1;-1 1];
end
% boundary conditions and solution
% prescribed dofs
prescribedDof=[1;3;4];
% free Dof : activeDof
% setdiff() 函数-->求两个数组的差集
% C = setdiff(A,B) 返回 A 中存在但 B 中不存在的数据,不包含重复项.C 是有序的.
activeDof=setdiff((1:numberNodes)',prescribedDof);

% solution
% !KU=F --> U=K\F
displacements=stiffness(activeDof,activeDof)\force(activeDof);

% positioning all displacements
displacements1=zeros(numberNodes,1);
displacements1(activeDof)=displacements;

% output displacements/reactions
outputDisplacementsReactions(displacements1,stiffness,numberNodes,prescribedDof)

outputDisplacementsReactions.m

function outputDisplacementsReactions(displacements,stiffness,GDof,prescribedDof)
    % output of displacements and reactions in
    % tabular form
    % GDof: total number of degrees of freedom of the problem
    % displacements
    disp('Displacements')
    %displacements=displacements1;
    jj=1:GDof; % format
    [jj' displacements]
    % reactions
    F=stiffness*displacements;
    reactions=F(prescribedDof);
    disp('reactions')
    [prescribedDof reactions]
end

第三章:1D 杆单元

笔记

Page 1

Page 2

Page 3

Page 4

例题1

img

Page 5

Page 6

matlab 代码

problem2.m

% antonio ferreira 2008
% clear memory
clear all
% E; modulus of elasticity
% A: area of cross section
% L: length of bar
E = 30e6;A=1;EA=E*A; L = 90;
% generation of coordinates and connectivities
% numberElements: number of elements
numberElements=3;
% generation equal spaced coordinates
nodeCoordinates=linspace(0,L,numberElements+1);
xx=nodeCoordinates;
% numberNodes: number of nodes
numberNodes=size(nodeCoordinates,2);
% elementNodes: connections at elements
ii=1:numberElements;
elementNodes(:,1)=ii;
elementNodes(:,2)=ii+1;
% for structure:
% displacements: displacement vector
% force : force vector
% stiffness: stiffness matrix
displacements=zeros(numberNodes,1); %#ok<PREALL>
force=zeros(numberNodes,1);
stiffness=zeros(numberNodes,numberNodes);

% applied load at node 2
force(2)=3000.0;
% computation of the system stiffness matrix
for e=1:numberElements;
    % elementDof: element degrees of freedom (Dof)
    elementDof=elementNodes(e,:) ;
    nn=length(elementDof);
    length_element=nodeCoordinates(elementDof(2))...
    -nodeCoordinates(elementDof(1));
    detJacobian=length_element/2;invJacobian=1/detJacobian;

    % central Gauss point (xi=0, weight W=2)
    [shape,naturalDerivatives]=shapeFunctionL2(0.0);
    Xderivatives=naturalDerivatives*invJacobian;
    % B matrix
    B=zeros(1,nn); B(1:nn) = Xderivatives(:);
    stiffness(elementDof,elementDof)=stiffness(elementDof,elementDof)+B'*B*2*detJacobian*EA;
end

% boundary conditions and solution
% prescribed dofs
fixedDof=find(xx==min(nodeCoordinates(:)) | xx==max(nodeCoordinates(:)))';
prescribedDof=[fixedDof]
% free Dof : activeDof
activeDof=setdiff([1:numberNodes]',[prescribedDof]);

% solution
GDof=numberNodes;
displacements=solution(GDof,prescribedDof,stiffness,force);

% output displacements/reactions
outputDisplacementsReactions(displacements,stiffness,numberNodes,prescribedDof)

disp(stiffness)
disp(force)
disp(displacements)

solution.m

function displacements=solution(GDof,prescribedDof,stiffness,force)
    % function to find solution in terms of global displacements
    activeDof=setdiff([1:GDof]', ...
    [prescribedDof]);
    U=stiffness(activeDof,activeDof)\force(activeDof);
    displacements=zeros(GDof,1);
    displacements(activeDof)=U;
end

shapeFunctionL2.m

function [shape,naturalDerivatives]=shapeFunctionL2(xi)
    % shape function and derivatives for L2 elements
    % shape : Shape functions
    % naturalDerivatives: derivatives w.r.t. xi
    % xi: natural coordinates (-1 ... +1)
    shape=([1-xi,1+xi]/2)';
    naturalDerivatives=[-1;1]/2;
end 

例题2

img

Page 2

Page 1

matlab 代码

problem3Structure.m

% MATLAB codes for Finite Element Analysis

% antonio ferreira 2008
% clear memory
clear all
% p1 : structure
p1=struct();

% E; modulus of elasticity
% A: area of cross section
% L: length of bar
% k: spring stiffness
E=70000;
A=200;
k=2000;

% generation of coordinates and connectivities
% numberElements: number of elements
p1.numberElements=3;
p1.numberNodes=4;
p1.elementNodes=[1 2; 2 3; 3 4];
p1.nodeCoordinates=[0 2000 4000 4000];
p1.xx=p1.nodeCoordinates;
% GDof: total degrees of freedom
p1.GDof=p1.numberNodes;

% for structure:
    % displacements: displacement vector
    % force : force vector
    % stiffness: stiffness matrix
p1.displacements=zeros(p1.GDof,1);
p1.force=zeros(p1.GDof,1);
p1.stiffness=zeros(p1.GDof);

% applied load at node 2
p1.force(2)=8000.0;
% computation of the system stiffness matrix
for e=1:p1.numberElements;
    % elementDof: element degrees of freedom (Dof)
    elementDof=p1.elementNodes(e,:) ;
    L=p1.nodeCoordinates(elementDof(2))-p1.nodeCoordinates(elementDof(1));
    if e<3
        ea(e)=E*A/L;
    else
        ea(e)=k;
    end
    p1.stiffness(elementDof,elementDof)=p1.stiffness(elementDof,elementDof)+ea(e)*[1 -1;-1 1];
end

% prescribed dofs
p1.prescribedDof=[1;4];

% solution
p1.displacements=solutionStructure(p1);

% output displacements/reactions
outputDisplacementsReactionsStructure(p1)

% Displacements

% ans =

%     1.0000         0
%     2.0000    3.3333
%     3.0000         0
%     4.0000         0


% reactions

% ans =

%     1.0000   -3.3333
%     3.0000   -3.3333
%     4.0000   -3.3333

outputDisplacementsReactionsStructure.m

function outputDisplacementsReactionsStructure(p)
    % output of displacements and reactions in
    % tabular form
    % GDof: total number of degrees of freedom of
    % the problem
    % displacements
    disp('Displacements')
    jj=1:p.GDof; 
    [jj' p.displacements]
    % reactions
    F=p.stiffness*p.displacements;
    reactions=F(p.prescribedDof);
    disp('reactions')
    [p.prescribedDof reactions]

shapeFunctionL2Structure.m

function shapeL2=shapeFunctionL2Structure(xi)
    % shape function and derivatives for L2 elements
    % shape : Shape functions
    % naturalDerivatives: derivatives w.r.t. xi
    % xi: natural coordinates (-1 ... +1)
    shapeL2=struct()
    shapeL2.shape=([1-xi,1+xi]/2)';
    shapeL2.naturalDerivatives=[-1;1]/2;

end % end function shapeFunctionL2

solutionStructure.m

function displacements = solutionStructure(p)
    % function to find solution in terms of global displacements
    activeDof=setdiff([1:p.GDof]', [p.prescribedDof]);
    U=p.stiffness(activeDof,activeDof)\p.force(activeDof);
    displacements=zeros(p.GDof,1);
    displacements(activeDof)=U;
end

第四章 2D桁架分析

笔记:单元刚度矩阵推导

Page 1

Page 2

例题1

img

模型参数:

  • 杨氏模量E=30e6 Pa ,泊松比 \(\mu\) =0.3
  • A=2 m^2
  • L=10 m
  • P=10000 N

手算过程

Page 1

Page 2

Page 3

Abaqus 模拟结果

inp文件在码云repo中

img

U and RF result :


********************************************************************************
Probe Values Report, written on Tue Apr 16 21:43:02 2024

Source
-------

   ODB: C:/Users/Administrator/Documents/learnFEM/Matlb Fea Codes repo/fea-codes-of-matlab/chapter04/problem4/abaqus/Job-2.odb
   Step: Step-1
   Frame: Increment      1: Step Time =    1.000
   Variable: U, U1

Probe values reported at nodes

  Part Instance     Node ID                   Orig. Coords                                     Def. Coords                 
                                    X               Y               Z               X               Y               Z      
-------------------------------------------------------------------------------------------------------------------------
    PART-1-1           1              0.              0.              0.     345.178E-06    -1.32149E-03              0.
    PART-1-1           2              0.             10.              0.              0.             10.              0.
    PART-1-1           3             10.             10.              0.             10.             10.              0.
    PART-1-1           4             10.              0.              0.             10.              0.              0.


  Part Instance     Node ID  Attached elem      U, U1        U, U2           RF, RF1         RF, RF2  
-------------------------------------------------------------------------------------------------------------- 
    PART-1-1           1         3          345.178E-06    -1.32149E-03              0.              0.        
    PART-1-1           2         1                   0.    -7.92893E-33              0.     7.92893E+03        
    PART-1-1           3         2         -2.07107E-33    -2.07107E-33     2.07107E+03     2.07107E+03        
    PART-1-1           4         3          2.07107E-33              0.    -2.07107E+03             -0.        

可以看出,手算和abaqus的U结果完全一致.

matlab 代码

problem4.m
% ! problem4.m --> based on <<MATLAB codes for Finite Element Analysis>>

clear ;
clc
format default
p=struct();

% define model parameters

p.E = 30e6;
p.A = 2;
p.L = 10;
p.P = -10000;

% define elems and nodes

p.nodes=[0 0 ;  % node's coordinates (x,y)
         0 p.L ;
         p.L p.L ;
         p.L 0 ];
p.elems=[1 2 ; 
        1 3 ; 
        1 4];

p.node_num=size(p.nodes,1);
p.elem_num=size(p.elems,1);
p.node_Coord_x=p.nodes(:,1);
p.node_Coord_y=p.nodes(:,2);

% define problem's dimension : 1D/2D/3D;
%        = each node's dof  
p.problem_dimension=size(p.nodes,2);

% global degree of freedom number
p.global_dof_num=2*p.node_num;
% define global Nodal displacement  colum vector
p.displacements=zeros(p.global_dof_num,1);
p.node_forces=zeros(p.global_dof_num,1);

% define boundary conditions
% fixed dof 
p.fix_dof=[3 4 5 6 7 8]';
% load dof and amplitude
p.load_dof=2;

% initial global stiffness matrix
p.global_stiffness_matrix=zeros(p.global_dof_num);

% compute all ElemStiffnessMatrix and assembly stiff matrix
elem_global_dof_num=2*size(p.elems,2);
p.elemStiffs=zeros(elem_global_dof_num,elem_global_dof_num,p.elem_num);

for i=1:p.elem_num
    connectivity=p.elems(i,:);
    % elem's all dof : a 2d truss node has 2 node,each node have 2 dof,
    % i-th node --> U_(2*i-1) and U_(2*i) dof(displacement of node) 
    elem_dof=[connectivity(1)*2-1 connectivity(1)*2 ...
             connectivity(2)*2-1 connectivity(2)*2];

    node1_x=p.node_Coord_x(connectivity(1));
    node1_y=p.node_Coord_y(connectivity(1));
    node2_x=p.node_Coord_x(connectivity(2));
    node2_y=p.node_Coord_y(connectivity(2));
    
    elem_length=sqrt((node1_x-node2_x).^2+(node1_y-node2_y).^2);
    l=(node2_x-node1_x)/elem_length;
    m=(node2_y-node1_y)/elem_length;

    k_e=(p.E*p.A/elem_length)*...
        [l*l l*m -l*l -l*m;
         l*m m*m -l*m -m*m;
        -l*l -l*m l*l l*m;
        -l*m -m*m l*m m*m];
    p.elemStiffs(:,:,i)=k_e;

    % assemble stiffness matrix
    p.global_stiffness_matrix(elem_dof,elem_dof)=...
        p.global_stiffness_matrix(elem_dof,elem_dof)+k_e;

end

% apply boundary condition 
p.displacements(p.fix_dof)=0;
p.node_forces(p.load_dof)=p.P;

% solution KU=F
p = solutionStruct(p);

% show compute result
disp('displacements of dofs :')
disp([(1:p.global_dof_num)', p.displacements])

disp('forces of dofs :')
disp([(1:p.global_dof_num)',p.node_forces])

figure
axis equal

% plot undeformed mesh
draw_2Dtruss_mesh(p.nodes,p)

% plot deformed mesh
deformed_node_coordinate=cal_deformed_nodes(p,500.0);
draw_2Dtruss_mesh(deformed_node_coordinate,p)

title('位移变形')
grid on


function new_p=solutionStruct(p)
    % free dof in structure
    free_dof=setdiff((1:p.global_dof_num)',p.fix_dof);
    
    % solute the equation :KU=F --> U=K\F
    U=p.global_stiffness_matrix(free_dof,free_dof)\p.node_forces(free_dof);
    
    p.displacements(free_dof)=U;
    % displacements=zeros(p.global_dof_num,1);
    
    p.node_forces=p.global_stiffness_matrix*p.displacements;
    
    new_p=p;
end

function deformed_node_coordinate=cal_deformed_nodes(p,scale)
    % initial 
    deformed_node_coordinate=p.nodes;
    if p.problem_dimension==2
        index1=1:2:p.global_dof_num;
        index2=2:2:p.global_dof_num;
        deformed_node_coordinate(:,1)=deformed_node_coordinate(:,1)+p.displacements(index1)*scale;
        deformed_node_coordinate(:,2)=deformed_node_coordinate(:,2)+p.displacements(index2)*scale;
    elseif p.problem_dimension==3
        index1=1:3:p.global_dof_num;
        index2=2:3:p.global_dof_num;
        index3=3:3:p.global_dof_num;
        deformed_node_coordinate(:,1)=deformed_node_coordinate(:,1)+p.displacements(index1);
        deformed_node_coordinate(:,2)=deformed_node_coordinate(:,2)+p.displacements(index2);
        deformed_node_coordinate(:,3)=deformed_node_coordinate(:,3)+p.displacements(index3);
    end
end

function draw_2Dtruss_mesh(nodes,p)
    xy=zeros(size(p.elems,2)*p.elem_num,p.problem_dimension);
    cur1=1;
    cur2=0;
    for i =1:p.elem_num
        
        connectivity=p.elems(i,:);
        attach_node_num=size(connectivity,2);
        
        cur1=cur2+1;
        cur2=cur2+attach_node_num;
        
        coord=zeros(attach_node_num,p.problem_dimension);
        for j=1:size(connectivity,2)
            coord(j,:)=nodes(connectivity(j),:);
        end
    
        xy(cur1:cur2,:)=coord;
    end
    line(xy(:,1),xy(:,2),"Marker","o","LineWidth",1,"Color",rand(1,3))
end

img

三种方式,计算结果一致

例题2

img

img

模型参数:

  • 杨氏模量E = 70 GPa,泊松比 \(\mu\) = 0.3
  • 桁架横截面积 A = \(3e^{-4} m^2\)
  • L = 3 m

Abaqus 结果

待补充...

matlab 计算

基于problem4.m 代码,作如下修改即可:


% define model parameters
% unit:SI(m)
p.E = 70e9;
p.A = 3e-4;
p.L = 3;
p.P = 1000*[-50;-100;-50];
disp('单位制:SI(m)')
% define elems and nodes

p.nodes=[0 0 ;  % node's coordinates (x,y)
        0 p.L ;
        p.L 0 ;
        p.L p.L ;
        2*p.L 0 ;
        2*p.L p.L];
p.elems=[1 2 ; 
        1 3; 
        2 3;
        2 4;
        1 4;
        3 4;
        3 6;
        4 5;
        4 6;
        3 5;
        5 6];

......

% define boundary conditions
% fixed dof 
p.fix_dof=[1 2 10]';
% load dof and amplitude
p.load_dof=[4 8 12]';

......

img

单位制:SI(m)
displacements of dofs :
    1.0000         0
    2.0000         0
    3.0000    0.0071
    4.0000   -0.0090
    5.0000    0.0052
    6.0000   -0.0163
    7.0000    0.0052
    8.0000   -0.0201
    9.0000    0.0105
   10.0000         0
   11.0000    0.0034
   12.0000   -0.0090

forces of dofs :
   1.0e+05 *

    0.0000    0.0000
    0.0000    1.0000
    0.0000    0.0000
    0.0000   -0.5000
    0.0001   -0.0000
    0.0001   -0.0000
    0.0001   -0.0000
    0.0001   -1.0000
    0.0001    0.0000
    0.0001    1.0000
    0.0001         0
    0.0001   -0.5000

第五章 3D 桁架分析

笔记 - 3d truss 单元刚度矩阵

img

例题 1

img

matlab 计算

  • problem7.m 代码
% ! problem7.m --> based on <<MATLAB codes for Finite Element Analysis>>

clear ;
clc
format default
p=struct();

% define model parameters
% unit:SI(m)
p.E = 1.2e6;
p.A = [0.302 0.729 0.187]';
p.P = -1000;
disp('单位制:SI(m)')
% define elems and nodes

p.nodes=[72 0 0 ;  % node's coordinates (x,y,z)
        0 36 0;
        0 36 72;
        0 0 -48];

p.elems=[1 2 ; 
        1 3;
        1 4];

p.node_num=size(p.nodes,1);
p.elem_num=size(p.elems,1);
p.node_Coord_x=p.nodes(:,1);
p.node_Coord_y=p.nodes(:,2);
p.node_Coord_z=p.nodes(:,3);

% define problem's dimension : 1D/2D/3D;
%        = each node's dof  
p.problem_dimension=size(p.nodes,2);

% global degree of freedom number
p.global_dof_num=p.problem_dimension*p.node_num;
% define global Nodal displacement  colum vector
p.displacements=zeros(p.global_dof_num,1);
p.node_forces=zeros(p.global_dof_num,1);

% define boundary conditions
% fixed dof 
p.fix_dof=[2 4 5 6 7 8 9 10 11 12]';
% load dof and amplitude
p.load_dof=3;

% initial global stiffness matrix
p.global_stiffness_matrix=zeros(p.global_dof_num);

% compute all ElemStiffnessMatrix and assembly stiff matrix
elem_global_dof_num=p.problem_dimension*size(p.elems,2);
p.elemStiffs=zeros(elem_global_dof_num,elem_global_dof_num,p.elem_num);

for i=1:p.elem_num
    connectivity=p.elems(i,:);
    % elem's all dof : a 3d truss node has 2 node,each node have 3 dof,
    % i-th node --> U_(3*i-2) / U_(3*i-1) / U_(3*i) dof(displacement of node) 
    elem_dof=[connectivity(1)*3-2 connectivity(1)*3-1 connectivity(1)*3 ...
        connectivity(2)*3-2 connectivity(2)*3-1 connectivity(2)*3];

    node1_x=p.node_Coord_x(connectivity(1));
    node1_y=p.node_Coord_y(connectivity(1));
    node1_z=p.node_Coord_z(connectivity(1));
    node2_x=p.node_Coord_x(connectivity(2));
    node2_y=p.node_Coord_y(connectivity(2));
    node2_z=p.node_Coord_z(connectivity(2));
    
    elem_length=sqrt((node1_x-node2_x).^2+(node1_y-node2_y).^2+(node1_z-node2_z).^2);
    Cx=(node2_x-node1_x)/elem_length;
    Cy=(node2_y-node1_y)/elem_length;
    Cz=(node2_z-node1_z)/elem_length;

    T=[Cx*Cx Cx*Cy Cx*Cz;
        Cx*Cy Cy*Cy Cy*Cz;
        Cx*Cz Cy*Cz Cz*Cz];

    k_e=(p.E*p.A(i)/elem_length)*[T -T;-T T];
    p.elemStiffs(:,:,i)=k_e;

    % assemble stiffness matrix
    p.global_stiffness_matrix(elem_dof,elem_dof)=...
        p.global_stiffness_matrix(elem_dof,elem_dof)+k_e;

end

% apply boundary condition 
p.displacements(p.fix_dof)=0;
p.node_forces(p.load_dof)=p.P;

% solution KU=F
p = solutionStruct(p);

% calculate stress
p.stress=zeros(p.elem_num,1);
for i=1:p.elem_num
    connectivity=p.elems(i,:);
    % elem's all dof : a 3d truss node has 2 node,each node have 3 dof,
    % i-th node --> U_(3*i-2) / U_(3*i-1) / U_(3*i) dof(displacement of node) 
    elem_dof=[connectivity(1)*3-2 connectivity(1)*3-1 connectivity(1)*3 ...
        connectivity(2)*3-2 connectivity(2)*3-1 connectivity(2)*3];

    node1_x=p.node_Coord_x(connectivity(1));
    node1_y=p.node_Coord_y(connectivity(1));
    node1_z=p.node_Coord_z(connectivity(1));
    node2_x=p.node_Coord_x(connectivity(2));
    node2_y=p.node_Coord_y(connectivity(2));
    node2_z=p.node_Coord_z(connectivity(2));
    
    elem_length=sqrt((node1_x-node2_x).^2+(node1_y-node2_y).^2+(node1_z-node2_z).^2);
    Cx=(node2_x-node1_x)/elem_length;
    Cy=(node2_y-node1_y)/elem_length;
    Cz=(node2_z-node1_z)/elem_length;

    p.stress(i)=(p.E/elem_length)*[-Cx -Cy -Cz Cx Cy Cz]*p.displacements(elem_dof);
end

% show compute result
disp('displacements of dofs :')
disp([(1:p.global_dof_num)', p.displacements])

disp('forces of dofs :')
disp([(1:p.global_dof_num)',p.node_forces])

disp('3d truss elem stress :')
disp([(1:p.elem_num)',p.stress])

figure
axis equal

% plot undeformed mesh
draw_3Dtruss_mesh(p.nodes,p)

% plot deformed mesh
deformed_node_coordinate=cal_deformed_nodes(p,50.0);
draw_3Dtruss_mesh(deformed_node_coordinate,p)

title('位移变形')
grid on


function draw_3Dtruss_mesh(nodes,p)
    xy=zeros(size(p.elems,2)*p.elem_num,p.problem_dimension);
    cur1=1;
    cur2=0;
    for i =1:p.elem_num
        
        connectivity=p.elems(i,:);
        attach_node_num=size(connectivity,2);
        
        cur1=cur2+1;
        cur2=cur2+attach_node_num;
        
        coord=zeros(attach_node_num,p.problem_dimension);
        for j=1:size(connectivity,2)
            coord(j,:)=nodes(connectivity(j),:);
        end
    
        xy(cur1:cur2,:)=coord;
    end
    line(xy(:,1),xy(:,2),xy(:,3),"Marker","o","LineWidth",1,"Color",rand(1,3))
end
  • 计算结果
单位制:SI(m)
displacements of dofs :
    1.0000   -0.0711
    2.0000         0
    3.0000   -0.2662
    4.0000         0
    5.0000         0
    6.0000         0
    7.0000         0
    8.0000         0
    9.0000         0
   10.0000         0
   11.0000         0
   12.0000         0


forces of dofs :
   1.0e+03 *

    0.0010         0
    0.0020   -0.2232
    0.0030   -1.0000
    0.0040    0.2561
    0.0050   -0.1281
    0.0060         0
    0.0070   -0.7024
    0.0080    0.3512
    0.0090    0.7024
    0.0100    0.4463
    0.0110         0
    0.0120    0.2976


3d truss elem stress :
   1.0e+03 *

    0.0010   -0.9482
    0.0020    1.4454
    0.0030   -2.8685

img

例题2

img

模型参数:

  • E = 210000 Mpa,\(\mu\)=0.3
  • A = 100 mm^2
  • P =-10000 N

Abaqus 结果

waiting...

Matlab 计算

  • problem8.m

基于problem7.m,修改参数,即可.


% define model parameters
% unit:SI(mm)
p.E = 210000;
p.A = 100;
p.P = -10000;
disp('单位制:SI(mm)')
% define elems and nodes

p.nodes=[4 4 3 ;  % node's coordinates (x,y,z)
        0 4 0;
        0 4 6;
        4 0 3;
        8 -1 1];
p.elems=[1 2 ; 
        1 3;
        1 4;
        1 5];

......

% define boundary conditions
% fixed dof 
p.fix_dof=[4:15]';
% load dof and amplitude
p.load_dof=2;

......
  • 计算结果
单位制:SI(mm)
displacements of dofs :
    1.0000   -0.0003
    2.0000   -0.0015
    3.0000    0.0003

forces of dofs :
   1.0e+04 *

    0.0004    0.0271
    0.0005         0
    0.0006    0.0203
    0.0007    0.1355
    0.0008         0
    0.0009   -0.1016
    0.0010         0
    0.0011    0.7968
    0.0012         0
    0.0013   -0.1626
    0.0014    0.2032
    0.0015    0.0813

3d truss elem stress :
    1.0000   -3.3865
    2.0000  -16.9326
    3.0000  -79.6809
    4.0000  -27.2610

deformed nodes:
    3.8791    3.3929    3.1075
         0    4.0000         0
         0    4.0000    6.0000
    4.0000         0    3.0000
    8.0000   -1.0000    1.0000

img

第六章 2D 欧拉-伯努利梁分析

单元刚度矩阵推导

Page 1

Page 2

Page 3

Page 4

例题 1

consider a simply-supported and clamped Bernoulli beam in bending, under uniform load

img

img

Abaqus 计算

Matlab 计算

img

img

img

% ! problem9.m --> based on <<MATLAB codes for Finite Element Analysis>>

clear ;
clc
format default
p=struct();
Case=1;

% define model parameters
% unit:SI(mm)
p.EI = 1;
p.L = 1;
% * distribute force
p.P = -1;
% define elems num of bornoulli beam
p.elem_num=80;
% define problem's dimension : 1D/2D/3D;
%        = each node's dof  
p.problem_dimension=2;

% ? -------------------------------

% node's coordinates (x)
p.nodes=linspace(0,p.L,p.elem_num+1)';
p.elems=zeros(p.elem_num,2);
for i=1:p.elem_num
    p.elems(i,1)=i;
    p.elems(i,2)=i+1;
end
p.node_num=size(p.nodes,1);
p.node_Coord_x=p.nodes(:,1);

% global degree of freedom number
p.global_dof_num=2*p.node_num;

% define global Nodal displacement  colum vector
p.displacements=zeros(p.global_dof_num,1);
p.node_forces=zeros(p.global_dof_num,1);

% define boundary conditions
if Case==1
    % Case 01: clamped at x=0
    % fixed dof 
    p.fix_dof=[1 2]';
end
if Case==2
    % Case 02: clamped-clamped
    % fixed dof 
    p.fix_dof=[1 p.elem_num*2+1 2 p.elem_num*2+2]';
end
if Case==3
    % Case 03: simply supported-simply supported 
    p.fix_dof=[1 2*p.elem_num+1]';
end

% initial global stiffness matrix
p.global_stiffness_matrix=zeros(p.global_dof_num);

% compute all ElemStiffnessMatrix and assembly stiff matrix
elem_global_dof_num=p.problem_dimension*size(p.elems,2);
p.elemStiffs=zeros(elem_global_dof_num,elem_global_dof_num,p.elem_num);

for i=1:p.elem_num
    connectivity=p.elems(i,:);
    % elem's all dof : a 3d truss node has 2 node,each node have 2 dof,
    % i-th node --> w_(2*i-1) / dw_(2*i-2) /  dof(displacement of node) 
    elem_dof=[connectivity(1)*2-1 connectivity(1)*2  ...
        connectivity(2)*2-1 connectivity(2)*2 ];

    node1_x=p.node_Coord_x(connectivity(1));
    node2_x=p.node_Coord_x(connectivity(2)); 
    
    elem_length=node2_x-node1_x;
    a=0.5*elem_length;
    k_e=(p.EI/(a^3))*0.5*[3 3*a -3 3*a;
                        3*a 4*a*a -3*a 2*a*a;
                        -3 -3*a 3 -3*a;
                        3*a 2*a*a -3*a 4*a*a];
    p.elemStiffs(:,:,i)=k_e;
    p.node_forces(elem_dof)=p.node_forces(elem_dof)+((p.P*a/3)*[3 a 3 -a])';

    % assemble stiffness matrix
    p.global_stiffness_matrix(elem_dof,elem_dof)=...
        p.global_stiffness_matrix(elem_dof,elem_dof)+k_e;
end

% apply boundary condition 
p.displacements(p.fix_dof)=0;

% solution KU=F
p = solutionStruct_bornoulli_beam(p);

plot(p.node_Coord_x,p.displacements(1:2:2*p.node_num),'.')
minDispalce=min(p.displacements(1:2:2*p.node_num));
text(0.35,0.5*minDispalce,"挠度最小值:"+minDispalce)

if Case==1
    title("Case 01: clamped at x=0")
end
if Case==2
    title("Case 02: clamped-clamped")
end
if Case==3
    title("Case 03: simply supported-simply supported") 
end


function new_p=solutionStruct_bornoulli_beam(p)
    % free dof in structure
    free_dof=setdiff((1:p.global_dof_num)',p.fix_dof);
    
    % solute the equation :KU=F --> U=K\F
    U=p.global_stiffness_matrix(free_dof,free_dof)\p.node_forces(free_dof);
    
    p.displacements(free_dof)=U;
    % displacements=zeros(p.global_dof_num,1);
    
    p.node_forces_fu=p.global_stiffness_matrix*p.displacements;
    
    new_p=p;
end

例题2

matlab 计算

  • problem10.m
% ! problem10.m --> based on <<MATLAB codes for Finite Element Analysis>>

clear;
clc;
format compact;

p=struct();

% define model paraeters
p.E=1000000;
p.L=10;
t=p.L/1000;
p.Iz=(1*t^3)/12;
p.P=-1000;
% define elems of bornoulli beam
p.elem_num=20;  
% dof of each nornoulli beam nodes
p.bornoulli_node_dof_num=2;
p.spring_k=100;

% -------------------------------

% node's coordinate
p.nodes=linspace(0,p.L,p.elem_num+1)';
p.elems=zeros(p.elem_num,2);
for i=1:p.elem_num
    p.elems(i,1)=i;
    p.elems(i,2)=i+1;
end
p.node_num=size(p.nodes,1);
p.node_Coord_x=p.nodes(:,1);

% global degree of freedom number: 
%   ! bornoulli_beam node's dof + 1 spring node's dof
p.global_dof_num=2*p.node_num;

% define global Nodal displacement  colum vector
p.displacements=zeros(p.global_dof_num+1,1);
p.node_forces=zeros(p.global_dof_num+1,1);

% define boundary conditions
%   ! BC: clamped at x=0
p.fix_dof=[1,2,p.global_dof_num+1]';

% initial global stiffness matrix
p.global_stiffness_matrix=zeros(p.global_dof_num+1);

% compute all ElemStiffnessMatrix and assembly stiff matrix
beam_dof_num=p.bornoulli_node_dof_num*size(p.elems,2);
p.elemStiffs=zeros(beam_dof_num,beam_dof_num,p.elem_num);

for i=1:p.elem_num
    connectivity=p.elems(i,:);
    % elem's all dof : a 3d truss node has 2 node,each node have 2 dof,
    % i-th node --> w_(2*i-1) / dw_(2*i-2) /  dof(displacement of node) 
    elem_dof=[connectivity(1)*2-1 connectivity(1)*2  ...
        connectivity(2)*2-1 connectivity(2)*2 ];

    node1_x=p.node_Coord_x(connectivity(1));
    node2_x=p.node_Coord_x(connectivity(2)); 
    
    elem_length=node2_x-node1_x;
    a=0.5*elem_length;
    k_e=(p.E*p.Iz/(a^3))*0.5*[3 3*a -3 3*a;
                        3*a 4*a*a -3*a 2*a*a;
                        -3 -3*a 3 -3*a;
                        3*a 2*a*a -3*a 4*a*a];
    p.elemStiffs(:,:,i)=k_e;
    p.node_forces(elem_dof)=p.node_forces(elem_dof)+((p.P*a/3)*[3 a 3 -a])';

    % assemble stiffness matrix
    p.global_stiffness_matrix(elem_dof,elem_dof)=...
        p.global_stiffness_matrix(elem_dof,elem_dof)+k_e;
end

% add spring nodes into global_stiffness_matrix
p.global_stiffness_matrix([p.global_dof_num-1,p.global_dof_num+1],[p.global_dof_num-1,p.global_dof_num+1])=...
    p.global_stiffness_matrix([p.global_dof_num-1,p.global_dof_num+1],[p.global_dof_num-1,p.global_dof_num+1])+p.spring_k*[1,-1;-1,1];

% apply boundary condition
p.node_forces(p.fix_dof)=0;

% solution KU=F
p=solutionStruct(p);

% ! display result
disp('Bornoulli beam result !')

disp('beam挠度:')
omega_index=(1:2:p.global_dof_num)';
disp([omega_index,p.displacements(omega_index)])

disp('beam转角:')
theta_index=(2:2:p.global_dof_num)';
disp([theta_index,p.displacements(theta_index)])

disp('beam支反力:')
disp([p.fix_dof,p.node_forces(p.fix_dof)])

plot(p.node_Coord_x,p.displacements(omega_index),'-')
title('Problem10.m')
  • 计算结果
Bornoulli beam result !
beam挠度:
   1.0e+05 *
    0.0000         0
    0.0000   -0.1722
    0.0001   -0.6300
    0.0001   -1.2909
    0.0001   -2.0800
    0.0001   -2.9297
    0.0001   -3.7800
    0.0001   -4.5785
    0.0002   -5.2801
    0.0002   -5.8473
    0.0002   -6.2501
    0.0002   -6.4661
    0.0003   -6.4802
    0.0003   -6.2849
    0.0003   -5.8802
    0.0003   -5.2737
    0.0003   -4.4803
    0.0003   -3.5225
    0.0004   -2.4303
    0.0004   -1.2413
    0.0004   -0.0004

beam转角:
   1.0e+05 *
    0.0000         0
    0.0000   -0.6588
    0.0001   -1.1450
    0.0001   -1.4738
    0.0001   -1.6600
    0.0001   -1.7188
    0.0001   -1.6650
    0.0002   -1.5138
    0.0002   -1.2800
    0.0002   -0.9788
    0.0002   -0.6250
    0.0002   -0.2338
    0.0003    0.1800
    0.0003    0.6012
    0.0003    1.0149
    0.0003    1.4062
    0.0003    1.7599
    0.0004    2.0612
    0.0004    2.2949
    0.0004    2.4462
    0.0004    2.4999

beam支反力:
   1.0e+04 *
    0.0001    0.6000
    0.0002    1.2479
    0.0043    0.3750

第7章 2d Frame单元静态分析

单元刚度矩阵推导

参见博文:【刚度矩阵推导】2d frame 单元

例题

alt text

Matlab 代码

% ! problem10.m --> based on <<MATLAB codes for Finite Element Analysis>>
% ! chpater 7  using 2d-frame element

clear ;
clc
format default
p=struct();

% define model parameters

p.E = 210000;   % SI(mm)
p.A = 200;
p.P = [15000 10e6]';
p.Iz=2e8;

% define elems and nodes

p.nodes=[0 0 ;  % node's coordinates (x,y)
         0 6000 ;
         6000 6000 ;
         6000 0;];
p.elems=[1 2; 2 3; 3 4;];

p.node_num=size(p.nodes,1);
p.elem_num=size(p.elems,1);
p.node_Coord_x=p.nodes(:,1);
p.node_Coord_y=p.nodes(:,2);

% define problem's dimension = each node's dof  
p.problem_dimension=3;

% global degree of freedom number
p.global_dof_num=3*p.node_num;
% define global Nodal displacement  colum vector
p.displacements=zeros(p.global_dof_num,1);
p.node_forces=zeros(p.global_dof_num,1);

% define boundary conditions
% fixed dof 
p.fix_dof=[1 2 3  10 11 12]';
% load dof and amplitude
p.load_dof=[4 6]';

% initial global stiffness matrix
p.global_stiffness_matrix=zeros(p.global_dof_num);

% compute all ElemStiffnessMatrix and assembly stiff matrix
elem_global_dof_num=p.problem_dimension*size(p.elems,2);
p.elemStiffs=zeros(elem_global_dof_num,elem_global_dof_num,p.elem_num);

for i=1:p.elem_num
    connectivity=p.elems(i,:);
    % elem's all dof : a 2d frame elem has 2 node,each node have 3 dof,
    % i-th node --> U_(3*i-2) and U_(3*i-1) and  U_(3*i) dof(displacement of node) 
    elem_dof=[connectivity(1)*3-2 connectivity(1)*3-1 connectivity(1)*3 connectivity(2)*3-2 connectivity(2)*3-1 connectivity(2)*3];

    node1_x=p.node_Coord_x(connectivity(1));
    node1_y=p.node_Coord_y(connectivity(1));
    node2_x=p.node_Coord_x(connectivity(2));
    node2_y=p.node_Coord_y(connectivity(2));
    
    elem_length=sqrt((node1_x-node2_x).^2+(node1_y-node2_y).^2);
    l=(node2_x-node1_x)/elem_length;
    m=(node2_y-node1_y)/elem_length;

    % coordinate transform matrix: U_l=L*U_g
    L=[l m 0 0 0 0;
        -m l 0 0 0 0;
        0 0 1 0 0 0;
        0 0 0 l m 0;
        0 0 0 -m l 0;
        0 0 0 0 0 1;];

    % in local coordinates, the stiffness matrix of the frame element is obtained by com-
    % bination of the stiffness of the bar element and the Bernoulli beam element
    E=p.E;
    A=p.A;
    Iz=p.Iz;

    k_e_local=zeros(elem_global_dof_num,elem_global_dof_num);

    k_e_local(1,1)=(E*A)/elem_length;
    k_e_local(4,4)=(E*A)/elem_length;
    
    k_e_local(1,4)=-(E*A)/elem_length;
    k_e_local(4,1)=-(E*A)/elem_length;
    
    k_e_local(2,2)=12*E*Iz/(elem_length^3);
    k_e_local(2,3)=6*E*Iz/(elem_length^2);
    k_e_local(2,5)=12*E*Iz/(elem_length^3);
    k_e_local(2,6)=6*E*Iz/(elem_length^2);
    
    k_e_local(3,2)=6*E*Iz/(elem_length^2);
    k_e_local(5,2)=12*E*Iz/(elem_length^3);
    k_e_local(6,2)=6*E*Iz/(elem_length^2);
    
    k_e_local(3,3)=4*E*Iz/(elem_length);
    k_e_local(3,5)=-6*E*Iz/(elem_length*elem_length);
    k_e_local(3,6)=2*E*Iz/elem_length;
    
    k_e_local(6,3)=2*E*Iz/elem_length;
    k_e_local(5,3)=-6*E*Iz/(elem_length*elem_length);
    
    k_e_local(5,5)=12*E*Iz/(elem_length*elem_length*elem_length);
    k_e_local(5,6)=-6*E*Iz/(elem_length*elem_length);
    k_e_local(6,5)=-6*E*Iz/(elem_length*elem_length);
    
    k_e_local(6,6)=4*E*Iz/elem_length;

    k_e_global=L' *k_e_local *L;
    p.elemStiffs(:,:,i)=k_e_global;

    % assemble stiffness matrix
    p.global_stiffness_matrix(elem_dof,elem_dof)=...
        p.global_stiffness_matrix(elem_dof,elem_dof)+k_e_global;

end

% apply boundary condition 
p.displacements(p.fix_dof)=0;
p.node_forces(p.load_dof)=p.P;

% solution KU=F
p = solutionStruct(p);

% show compute result
disp('displacements of dofs :')
disp([(1:p.global_dof_num)', p.displacements])

disp('forces of dofs :')
disp([(1:p.global_dof_num)',p.node_forces])

figure
axis equal

% plot undeformed mesh
draw_2Dtruss_mesh(p.nodes,p,'black')

deform_scale=500;
deformed_node_coordinate=[p.node_Coord_x+deform_scale*p.displacements(3*(1:p.node_num)-2), ...
                            p.node_Coord_y+deform_scale*p.displacements(3*(1:p.node_num)-1)];
% plot deformed mesh
draw_2Dtruss_mesh(deformed_node_coordinate,p,'red')

title('位移变形')
grid on


alt text

第八章 3d Frame单元静态分析

第九章 analysis of grids

第十章 Timoshenko beams 静态分析

与欧拉-伯努利梁公式不同,Timoshenko梁公式考虑了横向剪切变形.因此,它能够模拟较薄或较厚的梁.本章对Timoshenko梁的静力弯曲、自由振动和屈曲进行了分析.

10.Timoshenko梁的静力分析-Formulation

posted @ 2024-04-13 20:26  FE-有限元鹰  阅读(282)  评论(1编辑  收藏  举报