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

📄 exam6_2.m

📁 这个压缩包是浙江大学徐荣桥主编的<<结构分析有限元与Matlab程序设计>>一书各章的源代码!
💻 M
📖 第 1 页 / 共 2 页
字号:
return

function [N_x, N_y, N_z] = N_xyz( ie, xi, eta, zeta )
%  计算形函数对整体坐标的导数
%  输入参数:
%     ie -------------- 单元号
%     xi,eta,zeta ----- 局部坐标  
%  返回值:
%     N_x  ------------ 在局部坐标处的形函数对x坐标的导数
%     N_y  ------------ 在局部坐标处的形函数对y坐标的导数
%     N_z  ------------ 在局部坐标处的形函数对z坐标的导数

    J = Jacobi( ie, xi, eta, zeta ) ;
    [N_xi,N_eta,N_zeta] = N_xietazeta( ie, xi, eta, zeta ) ;
    N = [N_xi;N_eta;N_zeta] ;
    A = inv(J)*N ;
    N_x = A(1,:) ;
    N_y = A(2,:) ;
    N_z = A(3,:) ;
return

function [N_xi, N_eta, N_zeta] = N_xietazeta( ie, xi, eta, zeta )
%  计算形函数对局部坐标的导数
%  输入参数:
%     ie -------------- 单元号
%     xi,eta,zeta ----- 局部坐标  
%  返回值:
%     N_xi   ---------- 在局部坐标处的形函数对xi坐标的导数
%     N_eta  ---------- 在局部坐标处的形函数对eta坐标的导数
%     N_zeta  --------- 在局部坐标处的形函数对zeta坐标的导数

    x = [-1, 1, 1, -1, -1, 1, 1, -1, 0, 0, 0, 0, 1, 1, -1, -1, -1, 1, 1, -1];
    e = [-1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 0, 0, 0, 0, -1, -1, 1, 1];
    z = [-1, -1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 0, 0, 0, 0];
    N_xi   = zeros( 1, 20 ) ;
    N_eta  = zeros( 1, 20 ) ;
    N_zeta = zeros( 1, 20 ) ;

    N_xi(1:8)   = x(1:8).*(1+e(1:8)*eta).*(1+z(1:8)*zeta)/8 ;
    N_eta(1:8)  = (1+x(1:8)*xi).*e(1:8).*(1+z(1:8)*zeta)/8 ;
    N_zeta(1:8) = (1+x(1:8)*xi).*(1+e(1:8)*eta).*z(1:8)/8 ;

    N_xi(9:12)   = -2*xi*(1+e(9:12)*eta).*(1+z(9:12)*zeta)/4 ;
    N_eta(9:12)  = ( 1-xi^2)*e(9:12).*(1+z(9:12)*zeta)/4 ;
    N_zeta(9:12) = ( 1-xi^2)*(1+e(9:12)*eta).*z(9:12)/4 ;

    N_xi(13:16) = ( 1-eta^2)*x(13:16).*(1+z(13:16)*zeta)/4 ;
    N_eta(13:16) = -2*eta*(1+x(13:16)*xi).*(1+z(13:16)*zeta)/4 ;
    N_zeta(13:16) = ( 1-eta^2)*(1+x(13:16)*xi).*z(13:16)/4 ;

    N_xi(17:20) = ( 1-zeta^2)*x(17:20).*(1+e(17:20)*eta)/4 ;
    N_eta(17:20) = ( 1-zeta^2)*(1+x(17:20)*xi).*e(17:20)/4 ;
    N_zeta(17:20) = -2*zeta*(1+x(17:20)*xi).*(1+e(17:20)*eta)/4 ;

    N_xi(1) = N_xi(1) - 0.5*(N_xi(9) +N_xi(16)+N_xi(17)) ;
    N_xi(2) = N_xi(2) - 0.5*(N_xi(9) +N_xi(13)+N_xi(18)) ;
    N_xi(3) = N_xi(3) - 0.5*(N_xi(10)+N_xi(13)+N_xi(19)) ;
    N_xi(4) = N_xi(4) - 0.5*(N_xi(10)+N_xi(16)+N_xi(20)) ;
    N_xi(5) = N_xi(5) - 0.5*(N_xi(12)+N_xi(15)+N_xi(17)) ;
    N_xi(6) = N_xi(6) - 0.5*(N_xi(12)+N_xi(14)+N_xi(18)) ;
    N_xi(7) = N_xi(7) - 0.5*(N_xi(11)+N_xi(14)+N_xi(19)) ;
    N_xi(8) = N_xi(8) - 0.5*(N_xi(11)+N_xi(15)+N_xi(20)) ;

    N_eta(1) = N_eta(1) - 0.5*(N_eta(9) +N_eta(16)+N_eta(17)) ;
    N_eta(2) = N_eta(2) - 0.5*(N_eta(9) +N_eta(13)+N_eta(18)) ;
    N_eta(3) = N_eta(3) - 0.5*(N_eta(10)+N_eta(13)+N_eta(19)) ;
    N_eta(4) = N_eta(4) - 0.5*(N_eta(10)+N_eta(16)+N_eta(20)) ;
    N_eta(5) = N_eta(5) - 0.5*(N_eta(12)+N_eta(15)+N_eta(17)) ;
    N_eta(6) = N_eta(6) - 0.5*(N_eta(12)+N_eta(14)+N_eta(18)) ;
    N_eta(7) = N_eta(7) - 0.5*(N_eta(11)+N_eta(14)+N_eta(19)) ;
    N_eta(8) = N_eta(8) - 0.5*(N_eta(11)+N_eta(15)+N_eta(20)) ;

    N_zeta(1) = N_zeta(1) - 0.5*(N_zeta(9) +N_zeta(16)+N_zeta(17)) ;
    N_zeta(2) = N_zeta(2) - 0.5*(N_zeta(9) +N_zeta(13)+N_zeta(18)) ;
    N_zeta(3) = N_zeta(3) - 0.5*(N_zeta(10)+N_zeta(13)+N_zeta(19)) ;
    N_zeta(4) = N_zeta(4) - 0.5*(N_zeta(10)+N_zeta(16)+N_zeta(20)) ;
    N_zeta(5) = N_zeta(5) - 0.5*(N_zeta(12)+N_zeta(15)+N_zeta(17)) ;
    N_zeta(6) = N_zeta(6) - 0.5*(N_zeta(12)+N_zeta(14)+N_zeta(18)) ;
    N_zeta(7) = N_zeta(7) - 0.5*(N_zeta(11)+N_zeta(14)+N_zeta(19)) ;
    N_zeta(8) = N_zeta(8) - 0.5*(N_zeta(11)+N_zeta(15)+N_zeta(20)) ;
return

function J = Jacobi( ie, xi, eta, zeta )
%  计算雅克比矩阵
%  输入参数:
%     ie -------------- 单元号
%     xi,eta,zeta ----- 局部坐标  
%  返回值:
%     J   ------------- 在局部坐标(xi,eta)处的雅克比矩阵
    global gNode gElement
    x = gNode(gElement(ie,1:20),1) ;
    y = gNode(gElement(ie,1:20),2) ;
    z = gNode(gElement(ie,1:20),3) ;
    [N_xi, N_eta, N_zeta] = N_xietazeta( ie, xi, eta, zeta ) ;
    x_xi  = N_xi  * x ;
    x_eta = N_eta * x ;
    x_zeta = N_zeta * x ;

    y_xi  = N_xi  * y ;
    y_eta = N_eta * y ;
    y_zeta = N_zeta* y;

    z_xi = N_xi * z ;
    z_eta = N_eta * z ;
    z_zeta = N_zeta * z ;

    J = [  x_xi,    y_xi,    z_xi
          x_eta,   y_eta,   z_eta
         x_zeta,  y_zeta,  z_zeta ];
return

function AssembleStiffnessMatrix( ie, k )
%  把单元刚度矩阵集成到整体刚度矩阵
%  输入参数:
%      ie  --- 单元号
%      k   --- 单元刚度矩阵
%  返回值:
%      无
    global gElement gK
    for i=1:1:20
        for j=1:1:20
            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, pressure )
%   计算分布压力的等效节点力
%   输入参数:
%      node ----------  结点号
%      pressure ------  跟结点号对应的压力值
%   返回值:
%      edf -----------  等效节点力向量
    global gNode
    x = gNode( node, 1 ) ;
    y = gNode( node, 2 ) ;
    z = gNode( node, 3 ) ;
    g = [-0.774596669241483,              0.0,0.774596669241483] ;   
    w = [ 0.555555555555556,0.888888888888889,0.555555555555556] ;  
    edf = zeros( 8*3, 1 ) ;
    for i=1:length(g)
        for j=1:length(g)
            xi = g(i) ;
            eta = g(j) ;
            N5 = ( eta - 1 ) * ( xi^2 - 1 ) / 2 ;
            N6 = ( xi + 1 ) * ( 1 - eta^2 ) / 2 ;
            N7 = ( eta + 1 ) * ( 1 - xi^2 ) / 2 ;
            N8 = ( xi - 1 ) * ( eta^2 - 1 ) / 2 ;
            N1 = ( 1 - xi ) * ( 1 - eta ) / 4 - 0.5 * ( N8 + N5 ) ;
            N2 = ( 1 + xi ) * ( 1 - eta ) / 4 - 0.5 * ( N5 + N6 ) ;
            N3 = ( 1 + xi ) * ( 1 + eta ) / 4 - 0.5 * ( N6 + N7 ) ;
            N4 = ( 1 - xi ) * ( 1 + eta ) / 4 - 0.5 * ( N7 + N8 ) ;
            N = [ N1 N2 N3 N4 N5 N6 N7 N8 ] ;
            N5_xi = (eta-1)*xi ;
            N6_xi = 1/2*(1-eta^2) ;
            N7_xi = -(eta+1)*xi ;
            N8_xi = 1/2*(eta^2-1) ;
            N1_xi = -1/4*(1-eta) - 1/2 * ( N5_xi + N8_xi) ;
            N2_xi = 1/4*(1-eta) - 1/2 * (N5_xi + N6_xi) ;
            N3_xi = 1/4*(eta+1) - 1/2 * (N6_xi + N7_xi) ;
            N4_xi = -1/4*(eta+1) - 1/2 * (N7_xi + N8_xi ) ;
            N_xi = [ N1_xi N2_xi N3_xi N4_xi N5_xi N6_xi N7_xi N8_xi ] ;
            N5_eta = 1/2*(xi^2-1) ;
            N6_eta = -eta*(1+xi) ;
            N7_eta = 1/2*(1-xi^2) ;
            N8_eta = eta*(xi-1) ;
            N1_eta = -1/4*(1-xi) - 1/2 * ( N5_eta + N8_eta) ;
            N2_eta = -1/4*(1+xi) - 1/2 * (N5_eta + N6_eta) ;
            N3_eta = 1/4*(1+xi) - 1/2 * (N6_eta + N7_eta) ;
            N4_eta = 1/4*(1-xi) - 1/2 * (N7_eta + N8_eta) ;
            N_eta = [ N1_eta N2_eta N3_eta N4_eta N5_eta N6_eta N7_eta N8_eta ] ;
            x_xi = N_xi * x ;
            y_xi = N_xi * y ;
            z_xi = N_xi * z ;
            x_eta = N_eta * x ;
            y_eta = N_eta * y ;
            z_eta = N_eta * z ;
            px = y_xi * z_eta - y_eta * z_xi ;
            py = z_xi * x_eta - z_eta * x_xi ;
            pz = x_xi * y_eta - x_eta * y_xi ;
            sig = N * transpose( pressure ) ;
            edf = edf + w(i)*w(j)*sig*[N1*eye(3);N2*eye(3);N3*eye(3);N4*eye(3);N5*eye(3);N6*eye(3);N7*eye(3);N8*eye(3)]*[px;py;pz] ;
        end
    end
return

function SaveResults( file_out ) 
%  保存计算结果
%  输入参数:
%     无
%  返回值:
%     无
    global gNode gElement gMaterial gBC1 gDF gK gDelta gElementStress
    save( file_out, 'gNode', 'gElement', 'gMaterial', 'gBC1', ...
          'gDF', 'gDelta', 'gElementStress' ) ;
return

function DisplayResults
%  显示计算结果
%  输入参数:
%     无
%  返回值:
%     无
   % 读取正应力沿截面高度的变化
   global gElement gNode gMaterial gElementStress
   
    [element_number,dummy] = size( gElement ) ;
    node = [ 112  426  445  463  482  500 519  537  285 ] ;
    node_num = zeros( size(node) ) ;
    sigz = zeros( size( node ) ) ;
    for n=1:length(node)
        for ie=1:element_number
            index = find( gElement(ie,1:20) == node(n) ) ;
            if ~isempty( index )
                sigz( n ) = sigz( n ) + gElementStress( ie, index, 3 ) ;
                node_num(n) = node_num(n) + 1; 
            end
        end
    end
    sigz = sigz./node_num ;
    y = gNode( node, 2 ) ;
    sigz1 = 16e6*(0-gNode(node(1),3))/pi * y ;
    figure ;
    plot( sigz1, y, '-', sigz, y, 'o' ) ;
    xlabel( 'sigma-z' ) ;
    ylabel( 'y' ) ;
    
     % 读取剪应力沿截面宽度的变化
    node = [285 366 365 364 363 362 361 360 137] ;
    node_num = zeros( size(node) ) ;
    taoyz = zeros( size( node ) ) ;
    for n=1:length(node)
        for ie=1:element_number
            index = find( gElement(ie,1:20) == node(n) ) ;
            if ~isempty( index )
                taoyz( n ) = taoyz( n ) + gElementStress( ie, index, 4 ) ;
                node_num(n) = node_num(n) + 1; 
            end
        end
    end
    taoyz = taoyz./node_num ;
    x = gNode( node, 1 ) ;
    mu = gMaterial( 1, 2 ) ;
    taoyz1 = -(3+2*mu)/8/(1+mu)*16e6/pi*(1-(1-2*mu)/(3+2*mu)*x.^2) ;
    figure ;
    plot( x, taoyz1, '-', x, taoyz, 'o' ) ;
    xlabel( 'x' ) ;
    ylabel( 'tao-xz' ) ;
    set( gca, 'ylim', [min(taoyz), 0]*1.2 ) ;
    
    fprintf( '\n\n\n          有限元与解析解的应力比较(MPa)\n' ) ;
    fprintf( '==========================================================\n' ) ;
    fprintf( '       正应力(sigma-x)                剪应力(tao-yz)\n' ) ;
    fprintf( ' 位置(y)  有限元   解析解       位置(x)   有限元    解析解\n' ) ;
    fprintf( '----------------------------------------------------------\n' ) ;
    for n=1:length(y)
        fprintf( '  %6.3f   %5.2f   %5.2f         %6.3f    %5.2f    %5.2f\n', ...
                 y(n), sigz(n)/1e6, sigz1(n)/1e6, ...
                 x(n), taoyz(n)/1e6, taoyz1(n)/1e6 ) ;
    end
    fprintf( '==========================================================\n' ) ;
return 

⌨️ 快捷键说明

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