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

📄 exam3_2.m

📁 经典程序例子,matlab语言编制的。 可供学习者参考
💻 M
字号:
function exam3_2
% 本程序为第三章的第二个算例,采用平面梁单元计算斜腿刚架桥的变形和内力
%   输入参数: 无
%   输出结果: 节点位移和单元节点力 

    % 检查数据文件是否存在
    file_in = 'exam3_2.dat' ;
    if exist( file_in ) == 0
        disp( sprintf( '错误:文件 %s 不存在', file_in ) )
        disp( sprintf( '程序终止' ) )
        return ;
    end

    % 读入模型,求解并显示结果
    PlaneFrameModel(file_in) ;   % 定义有限元模型
    SolveModel ;                 % 求解有限元模型
    DisplayResults ;             % 显示计算结果
return ;

function PlaneFrameModel( file_in )
%  定义平面杆系的有限元模型
%  输入参数:
%      file_in ------- 有限元模型数据文件
%  返回值:
%      无
%  说明:
%      该函数定义平面杆系的有限元模型数据:
%        gNode ------- 节点定义
%        gElement ---- 单元定义
%        gMaterial --- 材料定义,包括弹性模量,梁的截面积和梁的抗弯惯性矩
%        gBC1 -------- 第一类边界条件
%        gBC2 -------- 第二类约束条件, 处理铰接的结点

    global gNode gElement gMaterial gBC1 gBC2

    % 打开数据文件
    fid_in = fopen( file_in, 'r' ) ;
    
    % 读取节点坐标和节点温度
    node_number = fscanf( fid_in, '%d', 1 ) ;
    gNode = zeros( node_number, 3 ) ;
    for i=1:node_number
        dummy = fscanf( fid_in, '%d', 1 ) ;
        gNode(i,:) = fscanf( fid_in, '%f', [1 3] ) ;
    end
     
    % 读取单元定义
    element_number = fscanf( fid_in, '%d', 1 ) ;
    gElement = zeros( element_number, 3 ) ;
    for i=1:element_number
        dummy = fscanf( fid_in, '%d', 1 ) ;
        gElement(i,:) = fscanf( fid_in, '%d', [1 3] ) ;
    end
        
    % 读取材料性质 
    material_number = fscanf( fid_in, '%d', 1 ) ;
    gMaterial = zeros( material_number, 5 ) ;
    for i=1:material_number
        dummy = fscanf( fid_in, '%d', 1 ) ;
        gMaterial(i,:) = fscanf( fid_in, '%f', [1 5] ) ;
    end
    
    % 读取第一类约束条件
    bc1_number = fscanf( fid_in, '%d', 1 ) ;
    gBC1 = zeros( bc1_number, 3 ) ;
    for i=1:bc1_number
        gBC1(i,1) = fscanf( fid_in, '%d', 1 ) ;
        gBC1(i,2) = fscanf( fid_in, '%d', 1 ) ;
        gBC1(i,3) = fscanf( fid_in, '%f', 1 ) ;
    end

    % 读取第二类约束条件
    bc2_number = fscanf( fid_in, '%d', 1 ) ;
    gBC2 = zeros( bc2_number, 3 ) ;
    for i=1:bc2_number
        gBC2(i,:) = fscanf( fid_in, '%d', [1 3] ) ;
    end
    
    % 关闭数据文件
    fclose( fid_in ) ;
return

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

    global gNode gElement gMaterial gBC1 gBC2 gK gDelta

    % 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
        k = StiffnessMatrix( ie, 1 ) ;
        AssembleStiffnessMatrix( ie, k ) ;
    end

    % step3. 计算自重温度变化产生的等效节点力
    for ie=1:1:element_number
        egf = EquivalentGravityForce( ie ) ;
        etf = EquivalentThermalForce( ie ) ;
        i = gElement( ie, 1 ) ;
        j = gElement( ie, 2 ) ;
        f( (i-1)*3+1 : (i-1)*3+3 ) = f( (i-1)*3+1 : (i-1)*3+3 ) + egf( 1:3 ) + etf( 1:3 );
        f( (j-1)*3+1 : (j-1)*3+3 ) = f( (j-1)*3+1 : (j-1)*3+3 ) + egf( 4:6 ) + etf( 4:6 );
    end
    
    % step4. 处理第二类约束条件,修改刚度矩阵和节点力向量。(采用划行划列法)
    [bc2_number,dummy] = size( gBC2 ) ;
    for ibc=1:1:bc2_number
        n1 = gBC2(ibc, 1 ) ;
        n2 = gBC2(ibc, 2 ) ;
        d = gBC2(ibc, 3 ) ;
        m1 = (n1-1)*3 + d ;
        m2 = (n2-1)*3 + d ;
        
        f(m2) = f(m2)+f(m1) ;
        f(m1) = 0 ;
        
        gK(m2,:) = gK(m2,:)+gK(m1,:) ;
        gK(:,m2) = gK(:,m2)+gK(:,m1) ;
        
        gK(m1,:) = zeros(1, node_number*3) ;
        gK(:,m1) = zeros(node_number*3, 1) ;
        gK(m1,m1) = 1.0 ;
        gK(m1,m2) = -1 ;
        gK(m2,m1) = -1 ;
        gK(m2,m2) = gK(m2,m2)+1 ;
    end
    
    % step5. 处理第一类约束条件,修改刚度矩阵和节点力向量。(采用划行划列法)
    [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 = f - gBC1(ibc,3) * gK(:,m) ;
        f(m) = gBC1(ibc,3) ;
        gK(:,m) = zeros( node_number*3, 1 ) ;
        gK(m,:) = zeros( 1, node_number*3 ) ;
        gK(m,m) = 1.0 ;
    end

    % step 7. 求解方程组,得到节点位移向量
    gDelta = gK \ f ;
return

function DisplayResults
%  显示计算结果
%  输入参数:
%     无
%  返回值:
%     无

    global gNode gElement gMaterial gBC1 gNF gDF gK gDelta
    
    fprintf( '节点位移\n' ) ; 
    fprintf( '  节点号         x方向位移               y方向位移               转角\n' ) ; 
    [node_number,dummy] = size( gNode ) ;
    for i=1:node_number
        fprintf(  '%6d       %16.8e        %16.8e       %16.8e\n',...
                  i, gDelta((i-1)*3+1), gDelta((i-1)*3+2), gDelta((i-1)*3+3) ) ; 
    end
    fprintf( '\n\n节点力\n' ) ; 
    fprintf( '                                        轴力               剪力               弯矩\n' ) ; 
    [element_number, dummy] = size( gElement ) ;
    for ie = 1:element_number
        enf = ElementNodeForce( ie ) ;
        fprintf( '单元号%6d    节点号%6d     %16.8e  %16.8e  %16.8e\n', ...
                  ie, gElement(ie,1), enf(1), enf(2), enf(3) ) ;
        fprintf( '                节点号%6d     %16.8e  %16.8e  %16.8e\n', ...
                  gElement(ie,2), enf(4), enf(5), enf(6) ) ;
    end
return

function k = StiffnessMatrix( ie, icoord )
%  计算单元刚度矩阵
%  输入参数:
%     ie -------  单元号
%     icoord  --  坐标系参数,可以是下面两个之一
%                    1  ----  整体坐标系
%                    2  ----  局部坐标系
%  返回值:
%     k  ----  根据icoord的值,相应坐标系下的刚度矩阵
    global gNode gElement gMaterial
    k = zeros( 6, 6 ) ;
    E = gMaterial( gElement(ie, 3), 1 ) ;
    I = gMaterial( gElement(ie, 3), 2 ) ;
    A = gMaterial( gElement(ie, 3), 3 ) ;
    xi = gNode( gElement( ie, 1 ), 1 ) ;
    yi = gNode( gElement( ie, 1 ), 2 ) ;
    xj = gNode( gElement( ie, 2 ), 1 ) ;
    yj = gNode( gElement( ie, 2 ), 2 ) ;
    L = ( (xj-xi)^2 + (yj-yi)^2 )^(1/2) ;
    k = [  E*A/L           0          0 -E*A/L           0          0
               0  12*E*I/L^3  6*E*I/L^2      0 -12*E*I/L^3  6*E*I/L^2
               0   6*E*I/L^2    4*E*I/L      0  -6*E*I/L^2    2*E*I/L
          -E*A/L           0          0  E*A/L           0          0
               0 -12*E*I/L^3 -6*E*I/L^2      0  12*E*I/L^3 -6*E*I/L^2
               0   6*E*I/L^2    2*E*I/L      0  -6*E*I/L^2    4*E*I/L] ;
    if icoord == 1
        T = TransformMatrix( ie ) ;
        k = T*k*transpose(T) ;
    end
return

function AssembleStiffnessMatrix( ie, k )
%  把单元刚度矩阵集成到整体刚度矩阵
%  输入参数:
%      ie  --- 单元号
%      k   --- 单元刚度矩阵
%  返回值:
%      无
    global gElement gK
    for i=1:1:2
        for j=1:1:2
            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 T = TransformMatrix( ie )
%  计算单元的坐标转换矩阵( 局部坐标 -> 整体坐标 )
%  输入参数
%      ie  ----- 节点号
%  返回值
%      T ------- 从局部坐标到整体坐标的坐标转换矩阵
    global gElement gNode
    xi = gNode( gElement( ie, 1 ), 1 ) ;
    yi = gNode( gElement( ie, 1 ), 2 ) ;
    xj = gNode( gElement( ie, 2 ), 1 ) ;
    yj = gNode( gElement( ie, 2 ), 2 ) ;
    L = sqrt( (xj-xi)^2 + (yj-yi)^2 ) ;
    c = (xj-xi)/L ;
    s = (yj-yi)/L ;
    T=[ c  -s   0   0   0   0
        s   c   0   0   0   0
        0   0   1   0   0   0
        0   0   0   c  -s   0
        0   0   0   s   c   0
        0   0   0   0   0   1] ;
return

function egf = EquivalentGravityForce( ie )
%  计算单元自重的等效节点力
%  输入参数
%      ie  ----- 节点号
%  返回值
%      egf ----- 整体坐标系下的等效节点力 
    global gElement gNode gMaterial
    
    xi = gNode( gElement( ie, 1 ), 1 ) ;
    yi = gNode( gElement( ie, 1 ), 2 ) ;
    xj = gNode( gElement( ie, 2 ), 1 ) ;
    yj = gNode( gElement( ie, 2 ), 2 ) ;
    L = sqrt( (xj-xi)^2 + (yj-yi)^2 ) ;
    c = (xj-xi)/L ;
    
    A  = gMaterial( gElement( ie, 3 ), 3 ) ;
    ro = gMaterial( gElement( ie, 3 ), 4 ) ;
    g = 9.8 ;
    
    egf = [ 0; -ro*g*A*L/2; -ro*g*A*L^2*c/12; 0; -ro*g*A*L/2; ro*g*A*L^2*c/12 ] ;
return

function etf = EquivalentThermalForce( ie )
%  计算单元的温度荷载的等效节点力
%  输入参数
%      ie  ----- 节点号
%  返回值
%      etf ----- 整体坐标系下的等效节点力 
    global gElement gNode gMaterial
    
    dT1 = gNode( gElement( ie, 1 ), 3 ) ;
    dT2 = gNode( gElement( ie, 2 ), 3 ) ;
    E = gMaterial( gElement( ie, 3 ), 1 ) ;
    A = gMaterial( gElement( ie, 3 ), 3 ) ;
    alpha = gMaterial( gElement( ie, 3 ), 5 ) ;
    Nx = E*A*alpha ;
    
    etf = [ -Nx; 0; 0; Nx; 0; 0 ] ;
    T = TransformMatrix( ie ) ;
    etf = T * etf ;
    etf = (dT1+dT2)/2 * etf ;
return

function enf = ElementNodeForce( ie )
%  计算单元的节点力
%  输入参数
%      ie  ----- 节点号
%  返回值
%      enf ----- 单元局部坐标系下的节点力 
    global gElement gNode gDelta
    i = gElement( ie, 1 ) ;
    j = gElement( ie, 2 ) ;
    de = zeros( 6, 1 ) ;
    de( 1:3 ) = gDelta( (i-1)*3+1:(i-1)*3+3 ) ;
    de( 4:6 ) = gDelta( (j-1)*3+1:(j-1)*3+3 ) ;
    k = StiffnessMatrix( ie, 1 ) ;
    enf = k * de ;
    etf = EquivalentThermalForce( ie ) ;
    egf = EquivalentGravityForce( ie ) ;
    enf = enf - etf -egf ;
    T = TransformMatrix( ie ) ;
    enf = transpose( T ) * enf ;
return

⌨️ 快捷键说明

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