MATLAB有限元计算程序2
- 格式:docx
- 大小:19.45 KB
- 文档页数:12
MATLAB有限元计算程序2
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 ) ;