|
这是关于梁单元的,可能大家觉得很简单。。。
9 }/ {; |2 r3 W- T; Q" [% E1 L今天翻电脑里的东西时发现的,是我大三时有限元时的作业,记得当时花了很多时间研究,学了不少东西,一个简单的作业可以涉及各方面的知识。
* a! h7 e% _$ `7 ~* x- D毕业半年了,虽然记不清弹性矩阵、刚度矩阵等,但是只要一看书(好像现在的心境不下来)应该会,学校交的学习方法和理解问题的能力,有些东西不必记,除非每天从事,那该叫熟能生巧。
) |8 l- O2 ~3 J2 s* p1 v5 N; G G记得当时编了两个程序,梁和三维实体的,我分享一下梁的程序吧,起码有亮点和创意,可以自己选择划分个数,在matlab方面花了不少功夫。
% p/ U! J2 T$ ?6 b0 @: E非常感谢当时的有限元授课老师“韩清凯”,虽然老师已经到了大工。上课的教材为韩清凯 的《弹性力学及有限元法基础教程》,书上有个梁单元的例子,在82页。
; O2 _5 b& K. g2 K8 x8 V# q" K--------------------------------------------------------------------------------
k' q1 |" W& [梁程序如下,名字就不写了,用昵称吧“太平岛”,这是常用的网络昵称
0 V! f# o4 w3 f9 h" T- j; f# w( U- c- _
+ [9 F, ]7 o3 [ z. ^9 p* ]; [
%------------------------ BEAM2 ----------------
+ q! y, Q% C8 v( M' |/ cdisp('========================================');
# i! D9 O2 \* N" x- ddisp(' PROGRAM BEAM2 ');
3 G2 S, U; Y7 Y7 jdisp(' Beam Bending Analysis ');7 ~* l8 h6 D/ ^. l
disp(' The programmer:太平岛 ');
/ I9 }" n' q' \* u6 w, O; hdisp('========================================');
, R( O) W8 |5 v* l& ^- O, O$ Ndisp(' '); %输出空行5 Z* t! X W( e5 ~ ?) ~
warning off all %关闭所有警告提示(求积分时,警告信息比较多)* D h8 S+ Y4 W: s* z1 A
Ne=input('Please input the number of elements:'); %Ne为划分的单元数
& o% e& ?& R6 Y: ]NJ=Ne+1; %NJ为节点数7 ^* l2 {. I% F3 \$ Y) P+ Z
x1=0;; b3 h- B. B2 P' t* q# G
x2=sym('L');7 g6 q: m9 P/ G5 a- v
x=sym('x');
0 V8 E( w* s0 t3 n. W- ?j=0:3;3 x: j2 u, r3 Z, D* c
v=x.^j;1 G2 T8 W# ?' y4 k5 P7 J
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];
?1 {) P% T2 ?8 f, a6 U1 v3 q1 YN=v*inv(A); %形函数
5 E" F7 c5 H# W/ }%-----------------------------------------------) }( r. h1 p9 W* I4 @9 C
% 求单元刚度矩阵
9 m( M# J! Y$ z- M k. ?; mE=4.0e11;( M& L" h* p- x: V- Z
I=5.2e-7; %I=bh^3/12=5.2e-7;
" u# e- U/ Z# B0 ^8 ]EI=4.0e11*5.2e-7;& z- R- o+ }7 g, |) `3 i/ a+ k
B=diff(N,2);& Z: ^5 P. G1 ?
k=B'*B;
8 a, p; a9 x% l, @! z% A# OKee=EI*int(k,x,0,'L');
4 I- a) H W3 J' Y; v4 sKe=sym(zeros(4,4,Ne)); %用三维矩阵存放单元刚度矩阵,每页存一个,并初始化0
0 f5 T) `, i2 g# LKe(:,:,1)=subs(Kee,'L',(10/Ne));
& v7 d% a, F, h4 }, C' y8 cT=eye(4); % 因为梁于x轴的夹角为0,所以坐标变换矩阵为T=eye(4)
% Y. D4 g8 o: T# C5 S7 m) x" YKe(:,:,1)=T*Ke(:,:,1)*T';
4 H& P( k6 R3 Sfor ii=2:Ne
- G7 z# f2 _7 h P Ke(:,:,ii)=Ke(:,:,1); |" P1 g# q+ M
end # m# ?! ?0 ]' i
Ke=double(Ke);" \# c$ h1 H( h; }! ?( v
%------------------------------------------------ F" E: P* M) ^! Q# O
% 由矩阵装换法求整体刚度矩阵
5 [3 V5 b9 r( p: [7 s% 自由度Ndof=2*NJ
$ w1 h0 N7 O2 e3 t$ L3 Q, B" QNdof=2*NJ;
6 u3 r8 N/ T2 jK=zeros(Ndof);
- {9 Y' W5 y6 G6 H) ~5 }7 x1 bfor ii=1:Ne4 a* }: U5 L) Z, Y7 l' i3 [0 z
G=[zeros(4,2*(ii-1)),eye(4,Ndof-2*(ii-1))];
9 _& e6 g* _0 G4 U0 x e KK=G'*Ke(:,:,Ne)*G;2 v" u4 _, z$ ]0 ?; U0 A7 ` K
K=K+KK;- {5 D) Q2 g. H, v2 `
end " z& Y8 d j1 A% a5 b: G5 E
%------------------------------------------------0 G# M) u1 X( G1 e, x' d" k+ P
% 约束条件,对整体刚度矩阵进行修正,以便计算
( U1 H& T$ C/ [2 t. y( V9 aF=zeros(Ndof,1);
( Z- \2 \4 W% o+ L B- UF(Ndof-1)=-100;
6 [! ^5 M1 m' M+ B! D0 C% u=F*inv(K),u=[v1,xta1,v2,xta2,v3,xta3,v4,xta4]',v1=0,xta1=05 {6 J: i8 F+ Y/ q& y2 K7 b& ~ r
K(1, =0; K(:,1)=0; %可以省略
9 A! M5 a3 S3 x, O- R. k* GK(2, =0; K(:,2)=0; %可以省略
' P6 G& O1 _1 B0 |0 d& M0 n& e$ [! YKX=K(3:Ndof,3:Ndof);9 h; L% T- }7 s
FX=F(3:Ndof,1);7 K. i; [4 c: d9 M8 R1 k2 Z: d
%------------------------------------------------: Q/ b9 [" N( z/ |. _" `( s: @. |
%求整体节点位移列阵+ b' O# @& q7 x1 L9 R6 t
uu=inv(KX)*FX;* P. U( P2 g/ E" l( {! g
u=[0;0;uu];' j- A* S; F* f9 ]. Y
ii=1:2:2*NJ;* Y) V" c$ d7 Z- l1 K
v=u(ii); %各节点挠度
; N( N/ n1 _- _3 Y% Pxta=u(ii+1); %各节点转角6 t6 c9 |) u/ X0 s/ N7 F3 ], h9 L
%------------------------------------------------+ t1 o2 @8 B. B. O3 A
% 后处理,计算单元应变应力: [- b8 {" D8 L* T6 D6 O5 z
B=subs(B,x,'L');" r1 H9 S2 |% N# C' G
B=subs(B,'L',10/Ne);3 [4 B9 _9 l1 k6 h' S# v' ]
Strain=zeros(1,Ne); %单元应变,并初始化
9 E5 w& E/ O+ H9 \8 {Stress=zeros(1,Ne); %单元应力,并初始化, u7 H) K" ]( @
for ii=1:Ne: P1 Q5 J# Y& o, g% F# P; \
Strain(1,ii)=B*u(2*ii-1:2*ii+2,1);1 A4 Z3 h4 E6 u& O( P N) I5 B
Stress(1,ii)=E*Strain(1,ii);
8 R2 X) `1 D5 S+ O8 j/ fend
7 Z8 K8 O5 B' E. u8 i/ k%--------------------------------------------------
* e) N5 @1 m" t: k7 X. h% 以下程序为屏幕输出处理
+ P$ ]/ M% s: k s% Edisp(' ');4 T3 s5 K8 {& P) m1 F
disp(' Input:1-print Node displacement ');. K$ i. c/ o- p& ^. c( k
disp(' Input:2-print strain ');# t# R2 v: B" T8 U5 k, K$ r/ h
disp(' Input:3-print stress ');% l2 j' p3 b D" T- ]
disp(' Input:q-quit or use ''ctrl+c'' Shortcut to end the program');( i9 N$ W* f# B& ^ _: F" y5 o7 f
9 ]( J7 R) l/ v
while 10 S$ U* x- y2 C
ii=input('Please input1 or 2 or 3:','s');
( d o9 ?2 ]/ U, f switch(ii)
, S) N* S8 G# p7 C* f case '1'/ ~- W- o h) S' B
disp('Node displacement');
; b; d% z& F+ i" B" Q disp(u');4 h n0 ?* v" D. V: G% ?* J
case '2'5 F( G& k \7 A4 ^7 g$ |7 M: U
disp('element strain');+ q; u) i2 k$ S$ _+ J
disp(Strain);
) R- K8 X: ]$ p case '3'$ \* |/ |* H/ ^4 H( V, n
disp('element stress');
$ z4 N* _0 _; S disp(Stress);
, w) D" b, b$ v) w6 Z# M& f5 C case 'q'
2 @% A3 ]7 x2 w" K disp('End of program');8 o7 O3 E) f h. x7 L$ c
break;, j3 F+ e( q5 b. V, Z3 A" P
otherwise3 X5 k* }2 `% t& e6 ^0 @ H
disp('error!Please input again');
, F/ h1 R8 L; x3 z continue;
0 P0 z% M4 {9 _ end6 u3 S* R3 b1 c' ]* m' W
end
% X* V; \% |: G
8 j) F9 l% j: V) C# P0 X+ |& j" X& W9 @0 l$ z5 Q
|
|