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

📄 exam7_2.m

📁 经典程序例子,matlab语言编制的。 可供学习者参考
💻 M
字号:
function exam7_2
% 本程序为第七章的第二个算例,采用薄板三角形单元计算斜板的弯曲
%  输入参数: 
%       无

    %   斜板尺寸示意图
    %                        a 
    %            |-----------------------|                  a :  长度(x)  
    %                                                       b :  宽度(y)  
    %       -|-   \-----------------------\                 h :  厚度
    %        |     \                       \   |           fi :  斜角(单位: 度)
    %     b  |      \                       \fi|
    %        |       \                       \-|
    %       -|-       \-----------------------\|    
    
    % 定义板的尺寸 
    a = 1.92 ;     
    b = 1 ;        
    h = 0.01 ;     
    fi = 30 ;      

    % 定义网格密度     
    m = 16 ;     % 长度划分的数目 
    n = 16 ;     % 宽度划分的数目

    % 定义材料性质
    E = 2.1e11 ;   % 弹性模量
    mu = 0.2 ;     % 泊松比
    
    % 定义均布荷载大小
    p = 1.0e6 ;

    % 输出文件名称
    file_out = 'exam7_2.mat' ;
    
    % 检查输出文件是否存在
    if exist( file_out ) ~= 0 
        answer = input( sprintf( '文件 %s 已经存在,是否覆盖? ( Yes / [No] ):  ', file_out ), 's' ) ;
        if length( answer ) == 0
            answer = 'no' ;
        end
        
        answer = lower( answer ) ;
        if answer ~= 'y' | answer ~= 'yes' 
            disp( sprintf( '请使用另外的文件名,或备份已有的文件' ) ) ;
            disp( sprintf( '程序终止' ) );
            return ; 
        end
    end

    FemModel(a,b,fi,h,m,n,E,mu,p) ;         % 定义有限元模型
    SolveModel ;                            % 求解有限元模型
    SaveResults( file_out ) ;               % 保存计算结果
    DisplayResults(a,b,fi,h,m,n,E,mu,p) ;   % 把计算结果显示出来 
return

function FemModel(a,b,fi,h,m,n,E,mu,p)
%  定义有限元模型
%  输入参数:
%    a  ---------   板长度
%    b  ---------   板宽度
%    fi ---------   斜角
%    h  ---------   板厚度
%    m  ---------   长度方向单元数目 
%    n  ---------   宽度方向单元数目
%    E  ---------   弹性模量
%    mu ---------   泊松比
%    p ----------   均布载荷大小
%  返回值:
%      无

    global gNode gElement gMaterial gBC1 gDF
    
    dx =  a / m ;
    dy =  b / n ;
    tanfi = tan(fi*pi/180) ;
    
    gNode = zeros( (n+1)*(m+1), 2 ) ;
    for i=1:n+1
        for j=1:m+1
            gNode( (i-1)*(m+1)+j, : ) = [(b-(i-1)*dy)*tanfi+dx*(j-1),dy*(i-1)] ;
        end
    end
    
    gElement = zeros( n*m*2, 4 ) ;
    for i=1:n
        for j=1:m
            gElement( (i-1)*m*2+(j-1)*2+1, 1:3) = [ (i-1)*(m+1)+j, ...
                                                    i*(m+1)+j+1, ...
                                                    i*(m+1)+j ] ;
            gElement( (i-1)*m*2+(j-1)*2+2, 1:3) = [ (i-1)*(m+1)+j, ...
                                                    (i-1)*(m+1)+j+1, ...
                                                    i*(m+1)+j+1 ] ;
        end
    end
    gElement( :, 4 ) = 1 ;
    
    gMaterial = [ E, mu, h] ;  % 材料特性
    
    gBC1 = zeros( (n+1)*2, 3 ) ;
    for i=1:n+1
        gBC1( i, : ) = [ (i-1)*(m+1)+1, 1, 0 ] ;
    end
    for i=1:n+1
        gBC1( (n+1)+i, : ) = [i*(m+1), 1, 0] ;
    end

    gDF = gElement ;
    gDF( :, 4 ) = p ;
return

function SolveModel
%  求解有限元模型
%  输入参数:
%     无
%  返回值:
%     无
%  说明:
%      该函数求解有限元模型,过程如下
%        1. 计算单元刚度矩阵,集成整体刚度矩阵
%        2. 计算单元的等效节点力,集成整体节点力向量
%        3. 处理约束条件,修改整体刚度矩阵和节点力向量
%        4. 求解方程组,得到整体节点位移向量

    global gNode gElement gMaterial gBC1 gDF gK gDelta gElementMoment gNodeMoment

    % step1. 定义整体刚度矩阵和节点力向量
    [node_number,dummy] = size( gNode ) ;
    gK = sparse( node_number * 3, node_number * 3 ) ;
    f = sparse( node_number * 3, 1) ;    

    % step2. 计算单元刚度矩阵,并集成到整体刚度矩阵中
    [element_number,dummy] = size( gElement ) ;
    for ie=1:1:element_number
        disp( sprintf(  '计算节点刚度矩阵并集成,当前单元: %d', ie  ) ) ;
        k = StiffnessMatrix( ie ) ;
        AssembleStiffnessMatrix( ie, k ) ;
    end
    
    % step3. 计算分布压力的等效节点力,并集成到整体节点力向量中
    [df_number, dummy] = size( gDF ) ;
    for idf = 1:1:df_number
        edf = EquivalentDistPressure( gDF(idf,1:3), gDF(idf,4) ) ;
        node = gDF( idf, 1:3) ;
        f( node*3-2 ) = f( node*3-2 ) + edf( 1:3:7 ) ;
        f( node*3-1 ) = f( node*3-1 ) + edf( 2:3:8 ) ;
        f( node*3 )   = f( node*3 )   + edf( 3:3:9 ) ;
    end
  
    % step4. 处理第一类约束条件,修改刚度矩阵和节点力向量。采用乘大数法
    [bc1_number,dummy] = size( gBC1 ) ;
    for ibc=1:1:bc1_number
        n = gBC1(ibc, 1 ) ;
        d = gBC1(ibc, 2 ) ;
        m = (n-1)*3 + d ;
        f(m) = gBC1(ibc, 3)* gK(m,m) * 1e10 ;
        gK(m,m) = gK(m,m) * 1e10 ;
    end
    
    % step5. 求解方程组,得到节点位移向量
    gDelta = gK \ f ;
    
    % step6. 计算单元的每个结点的弯矩
    gElementMoment = zeros( element_number, 3, 3 ) ;
    for ie=1:element_number 
        disp( sprintf(  '计算单元弯矩,当前单元: %d', ie  ) ) ;
        em = ElementMoment( ie ) ;
        gElementMoment( ie, :, : ) = em ;
    end
    
    % step7. 计算节点弯矩(采用绕节点平均)
    gNodeMoment = zeros( node_number, 3 ) ;       
    nodenum = zeros( node_number,1 ) ;
    for i=1:node_number                         
        disp( sprintf(  '计算节点弯矩,当前结点: %d', i  ) ) ;
        for ie=1:element_number
            index = find(  gElement( ie, 1:3 ) == i ) ;
            if ~isempty(index)
                nodenum(i) = nodenum(i) + 1 ;
                gNodeMoment(i,1) = gNodeMoment(i,1) + gElementMoment( ie, index, 1 ) ;
                gNodeMoment(i,2) = gNodeMoment(i,2) + gElementMoment( ie, index, 2 ) ;
                gNodeMoment(i,3) = gNodeMoment(i,3) + gElementMoment( ie, index, 3 ) ;
            end
        end
    end
    gNodeMoment(:,1) = gNodeMoment(:,1) ./ nodenum ;
    gNodeMoment(:,2) = gNodeMoment(:,2) ./ nodenum ;
    gNodeMoment(:,3) = gNodeMoment(:,3) ./ nodenum ;
return

function k = StiffnessMatrix( ie )   
%  计算薄板三角形单元的刚度矩阵
%  输入参数:
%     ie -- 单元号
%  返回值:
%     k  -- 单元刚度矩阵
    global gNode gElement
    
    x = gNode( gElement( ie, 1:3 ), 1 ) ;
    y = gNode( gElement( ie, 1:3 ), 2 ) ;
    i=1; j=2; m=3;
    ai = x(j)*y(m) - x(m)*y(j) ;
    aj = x(m)*y(i) - x(i)*y(m) ;
    am = x(i)*y(j) - x(j)*y(i) ;
    delta2 = ai+aj+am ;
    
    k = zeros( 9, 9 ) ;
    L = [1/2 1/2   0;
           0 1/2 1/2;
         1/2   0 1/2] ;
    W = [1/6 1/6 1/6] ;
    D = MatrixD( ie ) ;
    for i=1:length(W)
         B = MatrixB( ie, L(i,:) ) ;
         k = k + W(i)*transpose(B)*D*B*delta2 ;
    end
return

function B = MatrixB( ie, L )
%  计算薄板三角形单元的应变矩阵
%  输入参数:
%     ie -- 单元号
%  返回值:
%     B  -- 单元应变矩阵
    global gNode gElement
    
    x = gNode( gElement( ie, 1:3 ), 1 ) ;
    y = gNode( gElement( ie, 1:3 ), 2 ) ;
    i=1; j=2; m=3;
    ai = x(j)*y(m) - x(m)*y(j) ;
    aj = x(m)*y(i) - x(i)*y(m) ;
    am = x(i)*y(j) - x(j)*y(i) ;
    bi = y(j) - y(m) ;
    bj = y(m) - y(i) ;
    bm = y(i) - y(j) ;
    ci = -(x(j)-x(m)) ;
    cj = -(x(m)-x(i)) ;
    cm = -(x(i)-x(j)) ;
    delta2 = ai+aj+am ;
    T = [    bi^2          bj^2             2*bi*bj
             ci^2          cj^2             2*ci*cj
          2*bi*ci       2*bj*cj     2*(bi*cj+bj*ci) ] ;
    Li = L(1); Lj = L(2); Lm = L(3) ;
    Nii = [ -4*Lj-12*Li+6, ...
            -6*bj*Li+2*bj-3*bj*Lj-bm*Lj, ...
            2*cj-6*cj*Li-3*cj*Lj-cm*Lj, ...
            -4*Lj, ...
            (-bm+bi)*Lj, ...
            -(cm-ci)*Lj, ...
            -6+12*Li+8*Lj, ...
            bi*Lj-6*bj*Li+4*bj-3*bj*Lj, ...
            ci*Lj+4*cj-6*cj*Li-3*cj*Lj ] ;
    Njj = [ -4*Li, ...
            -(bj-bm)*Li, ...
            (-cj+cm)*Li, ...
            6-4*Li-12*Lj, ...
            bm*Li+6*bi*Lj-2*bi+3*bi*Li, ...
            cm*Li+6*ci*Lj-2*ci+3*ci*Li, ...
            8*Li-6+12*Lj, ...
            6*bi*Lj-4*bi+3*bi*Li-bj*Li, ...
            6*ci*Lj-4*ci+3*ci*Li-cj*Li] ;
    Nij = [ -4*Li-4*Lj+2, ...
            -3*bj*Li-bm*Li+1/2*bj-bj*Lj-1/2*bm+bm*Lj, ...
            -3*cj*Li-cm*Li+1/2*cj-cj*Lj-1/2*cm+cm*Lj, ...
            -4*Li-4*Lj+2, ...
            bm*Lj+3*bi*Lj+1/2*bm-bm*Li-1/2*bi+bi*Li, ...
            cm*Lj+3*ci*Lj+1/2*cm-cm*Li-1/2*ci+ci*Li, ...
            -4+8*Li+8*Lj, ...
            3*bi*Lj-3/2*bi+bi*Li-3*bj*Li+3/2*bj-bj*Lj, ...
            3*ci*Lj-3/2*ci+ci*Li-3*cj*Li+3/2*cj-cj*Lj] ;
    B = -1/delta2^2*T*[Nii; Njj; Nij] ;
return

function D = MatrixD( ie )
%  计算薄板三角形单元的弹性矩阵
%  输入参数:
%     ie -- 单元号
%  返回值:
%     D  -- 单元弹性矩阵
    global gElement gMaterial
    E = gMaterial( gElement( ie, 4 ), 1 ) ;
    mu = gMaterial( gElement( ie, 4 ), 2 ) ;
    h = gMaterial( gElement( ie, 4 ), 3 ) ;
    D = E*h^3/12/(1-mu^2)*[  1        mu           0
                            mu         1           0
                             0         0    (1-mu)/2 ] ;
return

function AssembleStiffnessMatrix( ie, k )
%  把单元刚度矩阵集成到整体刚度矩阵
%  输入参数:
%      ie  --- 单元号
%      k   --- 单元刚度矩阵
%  返回值:
%      无
    global gElement gK
    for i=1:1:3
        for j=1:1:3
            for p=1:1:3
                for q=1:1:3
                    m = (i-1)*3+p ;
                    n = (j-1)*3+q ;
                    M = (gElement(ie,i)-1)*3+p ;
                    N = (gElement(ie,j)-1)*3+q ;
                    gK(M,N) = gK(M,N) + k(m,n) ;
                end
            end
        end
    end
return

function edf = EquivalentDistPressure( node, press )
%   计算分布压力的等效节点力
%   输入参数:
%      node ----------  结点号
%      press ---------  跟结点号对应的压力值
%   返回值:
%      edf -----------  等效节点力向量

    global gNode
    edf = zeros( 9, 1 ) ;
    x = gNode( node, 1 ) ;
    y = gNode( node, 2 ) ;
    i=1; j=2; m=3;
    ai = x(j)*y(m) - x(m)*y(j) ;
    aj = x(m)*y(i) - x(i)*y(m) ;
    am = x(i)*y(j) - x(j)*y(i) ;
    bi = y(j) - y(m) ;
    bj = y(m) - y(i) ;
    bm = y(i) - y(j) ;
    ci = -(x(j)-x(m)) ;
    cj = -(x(m)-x(i)) ;
    cm = -(x(i)-x(j)) ;
    delta = abs(ai+aj+am)/2 ;
    edf = delta*press/24*[ 8; bj-bm; cj-cm;
                           8; bm-bi; cm-ci;
                           8; bi-bj; ci-cj] ;
return

function em = ElementMoment( ie )
%  计算单元的结点弯矩
%  输入参数:
%      ie ----- 单元号
%  返回值:
%      em ----- 单元结点弯矩

    global gElement gDelta gMaterial

    E = gMaterial( gElement( ie, 4 ),  1 ) ;
    mu = gMaterial( gElement( ie, 4 ), 2 ) ;
    h = gMaterial( gElement( ie, 4 ),  3 ) ;
    em = zeros( 3, 3 ) ;
    node = gElement( ie, 1:3 ) ;
    delta = zeros( 9, 1 ) ;
    delta(1:3:7) = gDelta( (node-1)*3+1 ) ;
    delta(2:3:8) = gDelta( (node-1)*3+2 ) ;
    delta(3:3:9) = gDelta( (node-1)*3+3 ) ;
    L  = [ 1, 0, 0
           0, 1, 0
           0, 0, 1] ;
    D = E/(1-mu^2)*[1  mu  0
                    mu  1  0
                    0   0  (1-mu)/2 ] ;
    for i=1:3
        B = MatrixB( ie, L(i,:) ) ;
        em( i, : ) = transpose(h^3/12*D*B*delta) ;
    end
return
    
function SaveResults( file_out )
%  保存计算结果
%  输入参数:
%     无
%  返回值:
%     无
    global gNode gElement gMaterial gBC1 gDF gDelta gElementMoment gNodeMoment
    save( file_out, 'gNode', 'gElement', 'gMaterial', 'gBC1',  ...
          'gDF', 'gDelta', 'gElementMoment', 'gNodeMoment' ) ;
return

function DisplayResults(a,b,fi,h,m,n,E,mu,p)
%  显示计算结果,并与解析解结果比较
%  输入参数:
%    a  ---------   板长度
%    b  ---------   板宽度
%    fi ---------   斜角
%    h  ---------   板厚度
%    m  ---------   长度方向单元数目 
%    n  ---------   宽度方向单元数目
%    E  ---------   弹性模量
%    mu ---------   泊松比
%    p ----------   均布载荷大小
%  返回值:
%     无
    global gMaterial gNode gDelta gElementMoment gNodeMoment
    [node_number, dummy] = size( gNode ) ;
    for i=1:node_number
        fprintf( '%6d  %10.5f  %10.5f  %18.8e  %18.8e  %18.8e\n', i, gNode(i,1), gNode(i,2),...
               gDelta( i*3-2 ), gDelta(i*3-1), gDelta(i*3) ) ;
    end
    
    % 计算板中心的挠度和内力矩
    node0 = (n/2+1)*(m+1)+(m/2+1) ;
    w0 = gDelta( node0*3-2 ) ;
    Mx0 = gNodeMoment( node0, 1 ) ;
    My0 = gNodeMoment( node0, 2 ) ;
    Mxy0 = gNodeMoment( node0, 3 ) ;
    M0 = Mx0*cos(fi*pi/180)^2+My0*sin(fi*pi/180)^2+Mxy0*sin(2*fi*pi/180) ;
    
    % 计算自由边上最大挠度和最大弯矩(方法是利用三次样条加密,然后取最大值)
    x = gNode(1:m+1,1) ;
    w1 = full(gDelta(1:3:(m+1)*3-2)) ;
    M1 = gNodeMoment(1:m+1,1) ;
    xx = x(1):0.01:x(length(x)) ;
    ww = spline(x,w1,xx) ;
    MM = spline(x,M1,xx) ;
    w1max = max(ww) ;
    M1max = max(MM) ;
    
    % 计算挠度和内力矩系数,并显示
    D = E*h^3/12/(1-mu^2) ;
    alpha0 = w0*D/p/b^4 ;
    alpha1 = w1max*D/p/b^4 ;
    beta0 = M0/p/b^2 ;
    beta1 = M1max/p/b^2 ;
    fprintf( 'w0 = %g    alpha0 = %.6f\n', w0, alpha0 ) ;
    fprintf( 'w1 = %g    alpha1 = %.6f\n', w1max, alpha1 ) ;
    fprintf( 'M0 = %g    beta0 = %.6f\n', M0, beta0 ) ;
    fprintf( 'M1 = %g    beta1 = %.6f\n', M1max, beta1 ) ;
return

⌨️ 快捷键说明

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