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

📄 exam6_1.m

📁 这个压缩包是浙江大学徐荣桥主编的<<结构分析有限元与Matlab程序设计>>一书各章的源代码!
💻 M
📖 第 1 页 / 共 2 页
字号:
    B = zeros( 3, 16 ) ;
    for i=1:1:8
        B(1:3,(2*i-1):2*i) = [ N_x(i)        0      
                                    0   N_y(i)
                               N_y(i),  N_x(i)]; 
    end
return

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

    J = Jacobi( ie, xi, eta ) ;
    [N_xi,N_eta] = N_xieta( ie, xi, eta ) ;
    A=inv(J)*[N_xi;N_eta] ;
    N_x = A(1,:) ;
    N_y = A(2,:) ;
return

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

    x = [ -1, 1, 1, -1 ] ;
    e = [ -1, -1, 1, 1 ] ;
    N_xi  = zeros( 1, 8 ) ;
    N_eta = zeros( 1, 8 ) ;

    N_xi( 5 )  = xi*(eta-1) ;
    N_eta( 5 ) = 0.5*(xi^2-1) ;
    N_xi( 6 )  = 0.5*(1-eta^2) ;
    N_eta( 6 ) = -eta*(xi+1) ;
    N_xi( 7 )  = -xi*(eta+1) ;
    N_eta( 7 ) = 0.5*(1-xi^2) ;
    N_xi( 8 )  = 0.5*(eta^2-1) ;
    N_eta( 8 ) = eta*(xi-1) ;

    N_xi(1)  = x(1)*(1+e(1)*eta)/4 - 0.5*( N_xi(5)  + N_xi(8) );
    N_eta(1) = e(1)*(1+x(1)*xi)/4  - 0.5*( N_eta(5) + N_eta(8) ) ;
    N_xi(2)  = x(2)*(1+e(2)*eta)/4 - 0.5*( N_xi(5)  + N_xi(6) );
    N_eta(2) = e(2)*(1+x(2)*xi)/4  - 0.5*( N_eta(5) + N_eta(6) ) ;
    N_xi(3)  = x(3)*(1+e(3)*eta)/4 - 0.5*( N_xi(6)  + N_xi(7) );
    N_eta(3) = e(3)*(1+x(3)*xi)/4  - 0.5*( N_eta(6) + N_eta(7) ) ;
    N_xi(4)  = x(4)*(1+e(4)*eta)/4 - 0.5*( N_xi(7)  + N_xi(8) );
    N_eta(4) = e(4)*(1+x(4)*xi)/4  - 0.5*( N_eta(7) + N_eta(8) ) ;
return

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

function AssembleStiffnessMatrix( ie, k )
%  把单元刚度矩阵集成到整体刚度矩阵
%  输入参数:
%      ie  --- 单元号
%      k   --- 单元刚度矩阵
%  返回值:
%      无
    global gElement gK
    for i=1:1:8
        for j=1:1:8
            for p=1:1:2
                for q=1:1:2
                    m = (i-1)*2+p ;
                    n = (j-1)*2+q ;
                    M = (gElement(ie,i)-1)*2+p ;
                    N = (gElement(ie,j)-1)*2+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 ) ;
    xi = x(1) ; xj = x(2) ; xk = x(3) ;
    yi = y(1) ; yj = y(2) ; yk = y(3) ;
    sigi = pressure(1) ;
    sigj = pressure(2) ;
    sigk = pressure(3) ;
    
    X1 = -10*xi-2*xj+12*xk ;
    Y1 = -10*yi-2*yj+12*yk ;
    X2 = xi - xj ;
    Y2 = yi - yj ;
    X3 = -6*xi-2*xj+8*xk ;
    Y3 = -6*yi-2*yj+8*yk ;
    X4 = 2*xi+10*xj-12*xk ;
    Y4 = 2*yi+10*yj-12*yk ;
    X5 = 2*xi+6*xj-8*xk ;
    Y5 = 2*yi+6*yj-8*yk ;
    X6 = -16*xi+16*xj ;
    Y6 = -16*yi+16*yj ;
    
    XY = [  Y1  Y2  Y3
           -X1 -X2 -X3
            Y2  Y4  Y5
           -X2 -X4 -X5
            Y3  Y5  Y6
           -X3 -X5 -X6 ] ;
    sig = [sigi; sigj; sigk ] ;
    edf = 1/30*XY*sig ;
return

function evf = EquivalentVolumeForce( ie )
%   计算离心力的等效节点力
%   输入参数:
%      ie ----------  单元号
%   返回值:
%      evf ---------  等效节点力向量
    global gNode gElement gMaterial
    
    evf = zeros( 16, 1 ) ;
    omega = 2094.0 ;   % 旋转角速度
    ro = gMaterial( gElement( ie, 9 ), 3 ) ;
    x = gNode( gElement(ie,1:8), 1 ) ;
    y = gNode( gElement(ie,1:8), 2 ) ;
    xi = [-0.774596669241483,0.0,              0.774596669241483] ;
    w  = [ 0.555555555555556,0.888888888888889,0.555555555555556] ;
    for i=1:length(xi)
        for j=1:length(xi)
            J = Jacobi( ie, xi(i), xi(j) ) ;
            detJ = det(J); 
            N = ShapeFunction( xi(i), xi(j) ) ;
            evf(1:2:15) = evf(1:2:15) + N'*N*x*detJ*w(i)*w(j) ;
            evf(2:2:16) = evf(2:2:16) + N'*N*y*detJ*w(i)*w(j) ;
        end
    end
    evf = evf * ro * omega^2 ;
return

function N = ShapeFunction( xi, eta )
%   计算形函数的值
%   输入参数:
%      ie ----------  单元号
%      xi, eta -----  单元内局部坐标
%   返回值:
%      N -----------  形函数的值

    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 ]; 
return

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

function DisplayResults
%  显示计算结果,并与解析解结果比较
%  输入参数:
%     无
%  返回值:
%     无

%  说明:
%    1。受内压的轴对称圆筒平面应力问题的解析解是(参考文献[1])
%           径向位移:  ur = -C1/E*(1+mu)/r + 2*C2/E*(1-mu)*r
%                      C1 = -a^2*b^2*p/(b^2-a^2)
%                      C2 = p*a^2/2/(b^2-a^2)
%           径向应力:  sr = a^2*p/(b^2-a^2)*(1-b^2/r^2)
%           周向应力:  st = a^2*p/(b^2-a^2)*(1+b^2/r^2)
%    2。以匀角速度w旋转的圆筒平面应力问题的解析解(参考文献[2])
%           径向位移:  ur = 1/E*((1-mu)*C3*r - (1+mu)*C4/r - (1-mu^2)/8*ro*w^2*r^3 ) 
%                      C3 = (3+mu)/8*ro*w^2*(b^2+a^2)
%                      C4 = -(3+mu)/8*ro*w^2*a^2*b^2
%           径向应力:  sr = (3+mu)/8*ro*w^2*(b^2+a^2-a^2*b^2/r^2-r^2)
%           周向应力:  st = (3+mu)/8*ro*w^2*(b^2+a^2+a^2*b^2/r^2-(1+3*mu)/(3+mu)*r^2)
%     
%   参数说明
%        E  ----- 弹性模量
%       mu  ----- 泊松比
%        a  ----- 内半径
%        b  ----- 外半径
%        r  ----- 径向坐标
%        p  ----- 内压
%       ro  ----- 密度
%        w  ----- 旋转角速度(rad/s)
%  
%   参考文献
%     [1] 钱伟长 叶开元, 1956, 弹性力学, pp.230-231
%     [2] Timoshenko S. P., Goodier J. N., 1970 Theory of elasticity. New York: McGraw-Hill, pp.80-83

    global gNode gElement gMaterial gDelta gDelta1 gElementStress

    E  = gMaterial( 1, 1 ) ;
    mu = gMaterial( 1, 2 ) ;
    ro = gMaterial( 1, 3 ) ;
    a = 0.05 ;
    b = 0.10 ;
    p = 120e6 ;
    w = 2094 ;
    r = 0.05:0.005:0.1 ;

    %  计算受内压圆筒的位移和应力的解析解
    C1 = -a^2*b^2*p/(b^2-a^2) ;
    C2 = p*a^2/2/(b^2-a^2) ;
    ur1 = -C1/E*(1+mu)./r + 2*C2/E*(1-mu)*r ;
    sr1 = a^2*p/(b^2-a^2)*(1-b^2./r.^2) ;
    st1 = a^2*p/(b^2-a^2)*(1+b^2./r.^2) ;
    
    %  计算旋转圆盘的位移和应力的解析解
    C3 = (3+mu)/8*ro*w^2*(b^2+a^2) ;
    C4 = -(3+mu)/8*ro*w^2*a^2*b^2 ;
    ur2 = 1/E*((1-mu)*C3*r - (1+mu)*C4./r - (1-mu^2)/8*ro*w^2*r.^3 ) ;
    sr2 = (3+mu)/8*ro*w^2*(b^2+a^2-a^2*b^2./r.^2-r.^2) ;
    st2 = (3+mu)/8*ro*w^2*(b^2+a^2+a^2*b^2./r.^2-(1+3*mu)/(3+mu)*r.^2) ;
    
    %  读取有限元的计算结果
    node = [3, 5, 8, 10, 13, 15, 18, 20, 23, 25, 28]; 
    node_num = zeros( size(node) ) ;
    ur1_fem = gDelta( node*2-1, 1 ) ;
    ur2_fem = gDelta( node*2-1, 2 ) ;
    [element_number,dummy] = size( gElement ) ;
    sr1_fem = zeros( size( sr1 ) ) ;
    st1_fem = zeros( size( st1 ) ) ;
    sr2_fem = zeros( size( sr2 ) ) ;
    st2_fem = zeros( size( st2 ) ) ;
    for n=1:length(node)
        for ie=1:element_number
            index = find( gElement( ie, 1:8 ) == node( n ) ) ;
            if ~isempty(index)    
                sr1_fem( n ) = sr1_fem( n ) + gElementStress( ie, index, 1, 1 ) ;
                st1_fem( n ) = st1_fem( n ) + gElementStress( ie, index, 2, 1 ) ;
                sr2_fem( n ) = sr2_fem( n ) + gElementStress( ie, index, 1, 2 ) ;
                st2_fem( n ) = st2_fem( n ) + gElementStress( ie, index, 2, 2 ) ;
                node_num(n) = node_num(n) + 1 ;
            end
        end
    end
    sr1_fem = sr1_fem ./ node_num ;
    st1_fem = st1_fem ./ node_num ;
    sr2_fem = sr2_fem ./ node_num ;
    st2_fem = st2_fem ./ node_num ;
    
    fprintf( '\n\n\n' ) ;
    fprintf( '                        表1 径向位移 (mm)\n' ) ;
    fprintf( '==================================================================\n' ) ;
    fprintf( '结点号  坐标         承受内压                     承受离心力\n' ) ;
    fprintf( '        (mm)    有限元解      解析解        有限元解     解析解\n' ) ;
    fprintf( '------------------------------------------------------------------\n' ) ;
    for i=1:length(node)
        fprintf( '%4d   %4.0f     %.6f     %.6f       %.6f     %.6f\n', ...
             node(i), r(i)*1000, ur1_fem(i)*1000, ur1(i)*1000, ur2_fem(i)*1000, ur2(i)*1000 ) ;
    end
    fprintf( '==================================================================\n\n\n' ) ;
    

    fprintf( '                      表2 径向应力 (MPa)\n' ) ;
    fprintf( '==================================================================\n' ) ;
    fprintf( '结点号  坐标         承受内压                     承受离心力\n' ) ;
    fprintf( '        (mm)    有限元解      解析解        有限元解     解析解\n' ) ;
    fprintf( '------------------------------------------------------------------\n' ) ;
    for i=1:length(node)
        fprintf( '%4d   %4.0f    %8.2f    %8.2f       %8.2f     %8.2f\n', ...
             node(i), r(i)*1000, sr1_fem(i)/1e6, sr1(i)/1e6, sr2_fem(i)/1e6, sr2(i)/1e6 ) ;
    end
    fprintf( '==================================================================\n\n\n' ) ;

    
    fprintf( '                      表3 周向应力 (MPa)\n' ) ;
    fprintf( '==================================================================\n' ) ;
    fprintf( '结点号  坐标         承受内压                     承受离心力\n' ) ;
    fprintf( '        (mm)    有限元解      解析解        有限元解     解析解\n' ) ;
    fprintf( '------------------------------------------------------------------\n' ) ;
    for i=1:length(node)
        fprintf( '%4d   %4.0f    %8.2f    %8.2f       %8.2f     %8.2f\n', ...
             node(i), r(i)*1000, st1_fem(i)/1e6, st1(i)/1e6, st2_fem(i)/1e6, st2(i)/1e6 ) ;
    end
    fprintf( '==================================================================\n\n\n' ) ;
return

⌨️ 快捷键说明

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