|
这是关于梁单元的,可能大家觉得很简单。。。8 F- Z3 V( p, t& o$ ]- f
今天翻电脑里的东西时发现的,是我大三时有限元时的作业,记得当时花了很多时间研究,学了不少东西,一个简单的作业可以涉及各方面的知识。7 q, K* c1 W2 @: @
毕业半年了,虽然记不清弹性矩阵、刚度矩阵等,但是只要一看书(好像现在的心境不下来)应该会,学校交的学习方法和理解问题的能力,有些东西不必记,除非每天从事,那该叫熟能生巧。2 r0 U5 c' n4 ?" X
记得当时编了两个程序,梁和三维实体的,我分享一下梁的程序吧,起码有亮点和创意,可以自己选择划分个数,在matlab方面花了不少功夫。
& L8 W8 w( a3 g) l# i0 \非常感谢当时的有限元授课老师“韩清凯”,虽然老师已经到了大工。上课的教材为韩清凯 的《弹性力学及有限元法基础教程》,书上有个梁单元的例子,在82页。; z. `6 G0 ]5 Y! u
--------------------------------------------------------------------------------$ J$ G0 L1 I- a7 C5 b
梁程序如下,名字就不写了,用昵称吧“太平岛”,这是常用的网络昵称
! V2 i9 p' |& P7 Z/ {5 ~
# S! R; _2 V1 g/ a4 j+ f& R, g' s2 J: Z* p: _
%------------------------ BEAM2 ----------------. \- c% D: O/ w
disp('========================================');
! b" E( v& t% i, ?7 adisp(' PROGRAM BEAM2 ');6 n" {8 O& ~/ Y/ X% v) R: T* v8 `
disp(' Beam Bending Analysis ');
- W! M7 j- P% C$ {disp(' The programmer:太平岛 ');
4 @! H+ K! N* C5 m) D" ~disp('========================================');
& |& h8 _' Z- vdisp(' '); %输出空行
% L4 _ N5 H& @1 mwarning off all %关闭所有警告提示(求积分时,警告信息比较多)
1 k# X9 @& u; r$ oNe=input('Please input the number of elements:'); %Ne为划分的单元数1 v/ `# Y) j: e, b) w2 [
NJ=Ne+1; %NJ为节点数
# y) s) P) w6 ?3 t0 A& m2 G3 \1 Lx1=0;
9 w6 d4 I, Q# _, @( F+ N# ix2=sym('L');
- T t* W; X% s2 r I2 y) Vx=sym('x');
' u' ]1 y, R: o% e7 ]j=0:3;7 ? @+ y; ]; [5 Z6 _0 _
v=x.^j;
$ m. K5 y3 H& Z9 O" M/ Y& yA=[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];
' S' u- R8 _( u" j9 ?N=v*inv(A); %形函数) y$ }' h6 H' \8 a+ [) d3 v+ }
%-----------------------------------------------. @& G5 {' |, f* v
% 求单元刚度矩阵
' G- D2 g4 R7 s% M; TE=4.0e11;8 `3 N7 F" R1 V8 ^; `+ r" f
I=5.2e-7; %I=bh^3/12=5.2e-7;9 I9 @' t' Z3 D% r+ X- y; G8 ~
EI=4.0e11*5.2e-7;
1 t/ w0 g/ X9 h. z. AB=diff(N,2);
1 _( z+ y7 I' m, ]* l! X) s* A% ^; J$ rk=B'*B;7 w3 c" j+ ^; b
Kee=EI*int(k,x,0,'L');
0 _& M/ _1 i' ?$ X' x3 c9 `Ke=sym(zeros(4,4,Ne)); %用三维矩阵存放单元刚度矩阵,每页存一个,并初始化0$ m6 j9 h4 h# O
Ke(:,:,1)=subs(Kee,'L',(10/Ne));
, p8 L! E; A8 y! _* LT=eye(4); % 因为梁于x轴的夹角为0,所以坐标变换矩阵为T=eye(4); y, ~0 r' U8 e5 K4 a
Ke(:,:,1)=T*Ke(:,:,1)*T';
9 F1 c' V' z% O! Q: u! s3 ffor ii=2:Ne
9 Y7 I% T7 k" _# U7 h, h: E; D* }/ I7 @ Ke(:,:,ii)=Ke(:,:,1);7 C1 I$ |) c& e5 V L
end * {3 A2 g# K3 P: d5 j4 w
Ke=double(Ke);+ J1 m) A; s6 a, a. E/ T6 t+ }
%------------------------------------------------7 s' ]: ]7 v: h( A
% 由矩阵装换法求整体刚度矩阵
2 B; U, j$ u N' C% 自由度Ndof=2*NJ9 x5 G9 r3 e3 v2 e, G$ i, N v) L
Ndof=2*NJ;
5 ?$ l0 V/ A/ w* UK=zeros(Ndof);" P+ n9 v7 o$ w( K$ y$ W
for ii=1:Ne% d5 ^1 X5 `2 k. O9 v0 C
G=[zeros(4,2*(ii-1)),eye(4,Ndof-2*(ii-1))];
8 y! }, x+ l) G! J KK=G'*Ke(:,:,Ne)*G;
9 ?# j2 A: {0 J1 x) Q+ o K=K+KK;
) k \+ @! x. m Z( k+ F. bend
1 b2 ~) n2 h: F: ]% }" I, @%------------------------------------------------
0 l5 W2 {, C9 s7 b! T: j0 Q6 b' c% 约束条件,对整体刚度矩阵进行修正,以便计算! d( |% h m8 |% }
F=zeros(Ndof,1);5 ?! D1 m2 b8 @! w
F(Ndof-1)=-100;
# c& L4 f8 h- r7 B+ m% u=F*inv(K),u=[v1,xta1,v2,xta2,v3,xta3,v4,xta4]',v1=0,xta1=09 B3 V3 D8 F& E- V; C; F" F; Z
K(1, =0; K(:,1)=0; %可以省略
4 B+ t% u" V# R4 G8 g h; VK(2, =0; K(:,2)=0; %可以省略( G4 g5 L3 x5 s9 V, k
KX=K(3:Ndof,3:Ndof);7 V% @$ [: i% e9 b4 E* o
FX=F(3:Ndof,1);! | N- Q$ f: ~! o; e
%------------------------------------------------
% u& E; T: ?) M* p. b( L6 Z' |%求整体节点位移列阵
+ R3 r6 C/ d/ Y0 |/ K# d: C1 X3 [& xuu=inv(KX)*FX;
, n% y0 y" b2 y% i1 y9 @! \u=[0;0;uu];
( }! l' C, ^/ J l$ f: aii=1:2:2*NJ;
2 {' Q' q4 p7 D) e* s9 o& `$ Uv=u(ii); %各节点挠度, G* h/ l8 z# M7 a, C9 @, w
xta=u(ii+1); %各节点转角" P+ v# d" c: @4 @# P
%------------------------------------------------4 H& L9 F0 g7 S- R
% 后处理,计算单元应变应力, Z2 g" M! `6 b1 K' R4 M
B=subs(B,x,'L');# Y3 F; a, G2 ~* g$ z3 @2 E8 A, X
B=subs(B,'L',10/Ne);9 a- d1 @! ?# {6 [' ? x- y
Strain=zeros(1,Ne); %单元应变,并初始化
) {1 a. y3 F; Q2 Q" R+ Y* U5 HStress=zeros(1,Ne); %单元应力,并初始化# F4 ^+ J+ C3 E- R+ X
for ii=1:Ne, O% O# U6 \ \
Strain(1,ii)=B*u(2*ii-1:2*ii+2,1);% }" J2 l: H2 j6 J. M
Stress(1,ii)=E*Strain(1,ii);7 h. M$ y# y; d
end
" a. M9 w7 Z {' ^1 G%--------------------------------------------------
" |# T! v4 J W( o% 以下程序为屏幕输出处理
% @) [, _ [ l% r: X: hdisp(' ');
. q) q) D" Z% K' V! H9 u' vdisp(' Input:1-print Node displacement ');4 q/ S( q" z' S5 f
disp(' Input:2-print strain ');" [# g6 B. f& Q' ]& L
disp(' Input:3-print stress ');- x" ?2 H. C- B/ b" l# [1 v- M
disp(' Input:q-quit or use ''ctrl+c'' Shortcut to end the program');% f1 W" X- F9 y# v8 f
9 Q" Q, d4 x) B4 k) s
while 1
. j, [- k) ]' Q4 t/ L ii=input('Please input1 or 2 or 3:','s');1 j8 J# ^6 i9 y
switch(ii)
5 s( n2 K" s; Q- ^ case '1'- U4 g; X5 H4 N2 b: q0 _: ~
disp('Node displacement');
- `# S/ g2 [2 f- C8 r% w disp(u');
; c( h+ T) F+ X, D0 T case '2'
' w: ]5 _$ _, }' b" a2 U) f. `( |( W disp('element strain');
: z! X$ ?. |) R0 c* I' j/ c4 I disp(Strain);) j) K4 H) X* Z* }
case '3'
5 u8 P9 @; y: y* l4 k disp('element stress');
9 }# X& D, y; N% ]( q; p' ~* c# i d disp(Stress);. i1 S4 i# j" A. @0 `# d
case 'q'4 P4 V; q7 w8 m( S( [
disp('End of program');
: ~5 b# }7 Y( ]/ e break;. K+ W& y/ r5 f: C3 F/ m1 ?
otherwise
: {& G- w6 n- j4 [ disp('error!Please input again');
! L$ g7 M8 r( s) F continue;' C' R" y9 ?7 u; y: z1 X
end
7 ]1 g3 U: Z! q3 a7 Vend
$ o, n e( N/ j* ?/ I% Y6 c& ?' F: C5 ~( F' G1 X
/ t& Y0 E- Z$ n |
|