|
这是关于梁单元的,可能大家觉得很简单。。。2 B! |7 L; o8 R. w. @# a
今天翻电脑里的东西时发现的,是我大三时有限元时的作业,记得当时花了很多时间研究,学了不少东西,一个简单的作业可以涉及各方面的知识。- L) F% k% `% o3 c7 |4 K
毕业半年了,虽然记不清弹性矩阵、刚度矩阵等,但是只要一看书(好像现在的心境不下来)应该会,学校交的学习方法和理解问题的能力,有些东西不必记,除非每天从事,那该叫熟能生巧。/ V z, M R" R: X
记得当时编了两个程序,梁和三维实体的,我分享一下梁的程序吧,起码有亮点和创意,可以自己选择划分个数,在matlab方面花了不少功夫。
- M0 t6 i9 k! L( X6 g6 r+ W# t非常感谢当时的有限元授课老师“韩清凯”,虽然老师已经到了大工。上课的教材为韩清凯 的《弹性力学及有限元法基础教程》,书上有个梁单元的例子,在82页。
; R- ]3 J* a% p& m- Y* i7 ~8 D--------------------------------------------------------------------------------
5 [# ` F1 ^4 [' p. }梁程序如下,名字就不写了,用昵称吧“太平岛”,这是常用的网络昵称
, Q+ j3 m+ o& T2 d! E8 j- w( m# m: I# W3 O7 K
; I2 j6 n( W5 T8 B6 W
%------------------------ BEAM2 ----------------& K: ]5 Q7 v, d( |
disp('========================================');4 s( r4 k- p# m3 ]" h* }5 p5 _* n/ _
disp(' PROGRAM BEAM2 ');* _, O% _" @ s: X" h* V/ x- L0 q
disp(' Beam Bending Analysis ');
9 |3 Y3 T' p) G9 y9 u) j# z& z1 jdisp(' The programmer:太平岛 ');
* G. z3 Q) A% Jdisp('========================================');
' Q) @( Z) p% ?: E& g9 `; D2 Bdisp(' '); %输出空行
6 A( y* u" C, M0 c7 k1 nwarning off all %关闭所有警告提示(求积分时,警告信息比较多)+ d% A/ y* v+ K* ^: m% D
Ne=input('Please input the number of elements:'); %Ne为划分的单元数7 i; B- u4 F( {8 l7 n( y+ `
NJ=Ne+1; %NJ为节点数
8 q! Q, \, S. I1 G Z8 L" Qx1=0;9 Q% @0 c% @& ^6 P- p; g* U
x2=sym('L');
2 F: w) V( y( g8 [+ B3 p; g7 ^- sx=sym('x');
; f, a B7 ?* k$ [1 ~j=0:3;
; ]8 H2 G9 I( N. @& ~ vv=x.^j;" `: R2 f4 ^% L) ?2 ?
A=[1,x1,x1^2,x1^3;0,1,2*x1,3*x1^2;1,x2,x2^2,x2^3;0,1,2*x2,3*x2^2];6 x$ z2 F3 _. C4 d; ^: w E' h
N=v*inv(A); %形函数
% A4 E9 N* l; z/ ~%-----------------------------------------------, J+ B h# N( F2 F- B- d3 u
% 求单元刚度矩阵( t2 b4 b5 I, M/ \( I
E=4.0e11;* ?% h/ o& `8 c$ p X4 _8 S2 W
I=5.2e-7; %I=bh^3/12=5.2e-7;
6 M0 U4 p p% q6 ^+ oEI=4.0e11*5.2e-7;
! O% E+ K2 J$ M9 Q$ wB=diff(N,2);2 F# a) L9 Q0 V
k=B'*B;0 b( G5 Y; K; d# C
Kee=EI*int(k,x,0,'L');
' E1 w p3 i9 \+ t0 H# P# uKe=sym(zeros(4,4,Ne)); %用三维矩阵存放单元刚度矩阵,每页存一个,并初始化0: M' z( \ g9 y" }' n6 m
Ke(:,:,1)=subs(Kee,'L',(10/Ne));
d: B5 Y7 z8 S( lT=eye(4); % 因为梁于x轴的夹角为0,所以坐标变换矩阵为T=eye(4)
. A9 i, F. S6 J9 I+ MKe(:,:,1)=T*Ke(:,:,1)*T';
" [6 J' }+ Z; U/ s2 S4 G# {) [for ii=2:Ne e7 {; i( _6 k0 G" a. N
Ke(:,:,ii)=Ke(:,:,1);
8 P( I d1 A: `$ F8 n# ?end " K. `, A2 V! M1 O5 N
Ke=double(Ke);
6 [# c, u, i! @%------------------------------------------------/ B f4 c/ ~* ]- ]# v+ n
% 由矩阵装换法求整体刚度矩阵6 d, Y' |& \( u6 S; M1 T
% 自由度Ndof=2*NJ
! r0 q3 k7 P+ m, ?/ v4 `Ndof=2*NJ;7 _4 B" S* j. g; j& k: g1 L) z
K=zeros(Ndof);
# N8 N( k- Z) ^4 [! ufor ii=1:Ne
- s# v3 R3 C( R, J; _' B5 O1 v G=[zeros(4,2*(ii-1)),eye(4,Ndof-2*(ii-1))];+ ^: N7 [6 b5 P8 h! z% ^1 \- N
KK=G'*Ke(:,:,Ne)*G;: w m/ t# _" C6 B( O% X; l. i B
K=K+KK;3 R8 m: p$ X! G0 u
end 1 C4 N1 w( b6 y: P) D. e
%------------------------------------------------& Y Y) Y4 ~8 g7 f. R# F, j
% 约束条件,对整体刚度矩阵进行修正,以便计算! z0 X) j% U) L
F=zeros(Ndof,1);
6 U6 H' i7 B4 ^* c/ XF(Ndof-1)=-100;- G* u8 L6 D; R7 m& y& |
% u=F*inv(K),u=[v1,xta1,v2,xta2,v3,xta3,v4,xta4]',v1=0,xta1=0$ U- o; C& a1 ~
K(1, =0; K(:,1)=0; %可以省略3 X9 ?6 ^" f! d/ ~, N' l+ {
K(2, =0; K(:,2)=0; %可以省略
* z" l; N9 p$ K6 _) rKX=K(3:Ndof,3:Ndof);$ c1 A4 | Z7 R; a
FX=F(3:Ndof,1);
5 M& P0 v$ l' t" D u; m' t%------------------------------------------------
5 a% `0 K3 y' F* Z8 b/ z%求整体节点位移列阵0 T2 C/ m( `% `4 y2 n
uu=inv(KX)*FX;. {! o! A* T; o
u=[0;0;uu];" G4 R/ H# m, `7 A: e3 v
ii=1:2:2*NJ;5 k( s1 b5 _! ~1 N
v=u(ii); %各节点挠度
7 E/ p C. z; I% Jxta=u(ii+1); %各节点转角6 x/ ^* J5 h9 E. r$ L
%------------------------------------------------
2 b A5 s8 R1 j2 T* K% 后处理,计算单元应变应力
X) z @7 A1 [) ~! lB=subs(B,x,'L');
0 @5 M- d& s6 gB=subs(B,'L',10/Ne);4 C8 ~+ R3 h( y( `- `
Strain=zeros(1,Ne); %单元应变,并初始化- r1 ?) Y: `( B% V- J/ E
Stress=zeros(1,Ne); %单元应力,并初始化
% Z4 b9 \, C5 W9 C, zfor ii=1:Ne
5 V( y) E2 H5 O# j( r Strain(1,ii)=B*u(2*ii-1:2*ii+2,1);
; `, g! E. `7 E, z Stress(1,ii)=E*Strain(1,ii);
+ ^( J, |% i9 Zend$ r/ e, _1 T4 m7 W. w8 p
%--------------------------------------------------" N) A2 C: O1 H3 Z8 V
% 以下程序为屏幕输出处理: F' l# Y9 x+ Z; p( m; i
disp(' ');
8 _/ X( y6 z- \1 \disp(' Input:1-print Node displacement ');" k* `2 @7 t* v7 Z3 Y& v; f( j0 i
disp(' Input:2-print strain ');1 I& ^/ M: T) H$ S1 F2 I- N- O
disp(' Input:3-print stress ');
/ B! Z4 E/ o! m% ydisp(' Input:q-quit or use ''ctrl+c'' Shortcut to end the program');2 e; E+ @2 [& U2 K# F
) O% e& y9 u4 Q9 S' ~6 w0 p! hwhile 18 C! D1 P/ a8 E
ii=input('Please input1 or 2 or 3:','s');* v8 x8 y% n- M9 }3 R$ R( P1 b1 D& A
switch(ii)* Q% Q8 b$ C6 z7 F# V- h6 t8 m9 a
case '1'
) Z: t! R+ a5 h$ M3 p disp('Node displacement');" ~' w; k6 J/ n; Q& E* @
disp(u');
0 z) a5 j a( d, F, O case '2'* f0 i& p+ O6 @2 T- [/ Y
disp('element strain');* s& e, z8 ~, D
disp(Strain);* i# B/ ?1 W# H4 x' T& O: k
case '3'
5 R" B+ E& u% Z# X4 z1 K1 H disp('element stress');
# |) c" A4 O" { disp(Stress);4 W) d: ]' r0 }3 W9 G" M1 a
case 'q'
$ v4 f y C' h/ Y$ y5 n* U disp('End of program');: \/ X$ G" H! C7 l8 A/ n* P
break;* G; t$ E4 e! |- C& G+ E
otherwise$ h0 d# b, M7 N" K" ^0 P
disp('error!Please input again');* d Z3 ?! w8 N* [; V" P6 w
continue;
! R: l& t# h) g" } end1 y* o5 X% g. L( {9 z
end
9 M2 g+ d, a' o/ a) E, G3 |: i* ]1 X
( S# u- }3 p K7 j S d, e0 p |
|