|
这是关于梁单元的,可能大家觉得很简单。。。' `) `- D2 k. |8 `4 P
今天翻电脑里的东西时发现的,是我大三时有限元时的作业,记得当时花了很多时间研究,学了不少东西,一个简单的作业可以涉及各方面的知识。/ w3 L0 t, B6 b) v$ q7 ]' [
毕业半年了,虽然记不清弹性矩阵、刚度矩阵等,但是只要一看书(好像现在的心境不下来)应该会,学校交的学习方法和理解问题的能力,有些东西不必记,除非每天从事,那该叫熟能生巧。( t, b* F) H' t1 f; i
记得当时编了两个程序,梁和三维实体的,我分享一下梁的程序吧,起码有亮点和创意,可以自己选择划分个数,在matlab方面花了不少功夫。
4 o; ]7 y% A4 _8 k3 \6 h/ c* F非常感谢当时的有限元授课老师“韩清凯”,虽然老师已经到了大工。上课的教材为韩清凯 的《弹性力学及有限元法基础教程》,书上有个梁单元的例子,在82页。
* u$ P5 S) y* I. O; j' c( q--------------------------------------------------------------------------------6 d3 z; i3 C+ ~" U! T1 T9 ?
梁程序如下,名字就不写了,用昵称吧“太平岛”,这是常用的网络昵称% L9 m/ P% @4 {3 C8 ]! W4 Q* s8 L
7 m r7 O6 z9 _6 W- c4 M% e* [; C
! `+ J! J5 R7 S! Z1 ]7 D* ?%------------------------ BEAM2 ----------------
* J8 x% q: |0 R% T' hdisp('========================================');2 z0 |+ g0 x/ I% k% o
disp(' PROGRAM BEAM2 ');
" C. V6 v4 K% q: _ [disp(' Beam Bending Analysis ');2 }: \, i9 ^3 Z; B. @
disp(' The programmer:太平岛 ');2 w e r: S4 I6 K
disp('========================================');0 ^( I1 i* p0 z/ X4 J q1 r0 L
disp(' '); %输出空行
( N' K1 w" r! e4 y" U$ X4 H, t, m6 _" Ewarning off all %关闭所有警告提示(求积分时,警告信息比较多)
. M) d( Q$ y" b. R' ^% ~Ne=input('Please input the number of elements:'); %Ne为划分的单元数
# f* D8 X; a% ~NJ=Ne+1; %NJ为节点数* K- c! F3 A, }; B
x1=0;
- L3 W6 v5 B; _4 ix2=sym('L');
! \) I6 F9 {% w7 G9 ^% R5 h- dx=sym('x');
! T5 y) F4 k! ^+ v; S. F! vj=0:3;0 Z& n4 P7 K+ F7 r% i5 q
v=x.^j;2 X2 S- {2 }1 C6 i; ?# K# e( F
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 H6 ^+ ? u9 z# x: r0 t# F3 ~
N=v*inv(A); %形函数% Y5 ]: \; N' N! i4 {' V
%-----------------------------------------------
R7 {/ j3 ?* _0 ]* w% 求单元刚度矩阵5 k* G7 ~! r6 b' t
E=4.0e11;/ b% i- L, ?1 T5 X) D8 j) N& s2 Z
I=5.2e-7; %I=bh^3/12=5.2e-7;/ _7 J: E% O/ L9 U: g
EI=4.0e11*5.2e-7;2 l5 x! n% h: C. d/ ?
B=diff(N,2);
$ p6 ^ c0 d8 [* E& ok=B'*B;
1 _' ]" L1 ]% ^/ c6 Z9 w) Y/ }9 EKee=EI*int(k,x,0,'L');% U" w# Y) s2 s1 k; ?" Z2 S, y
Ke=sym(zeros(4,4,Ne)); %用三维矩阵存放单元刚度矩阵,每页存一个,并初始化0
! {1 e7 n+ B4 C2 H" HKe(:,:,1)=subs(Kee,'L',(10/Ne));) u# ]8 |# E# |0 y
T=eye(4); % 因为梁于x轴的夹角为0,所以坐标变换矩阵为T=eye(4)
B2 o- N6 u' kKe(:,:,1)=T*Ke(:,:,1)*T';
- O$ x1 e( d% p% w+ e# f6 p/ s$ ufor ii=2:Ne& n+ W' t/ p" b6 L
Ke(:,:,ii)=Ke(:,:,1);
7 c% }8 z9 C3 G3 u; Xend 4 C9 n; Z6 A/ g) h/ J: g
Ke=double(Ke);
" O6 z+ o F$ X( i& z+ W2 [! }%------------------------------------------------
& l, I$ D2 X( o+ D9 D1 ]7 \6 V% 由矩阵装换法求整体刚度矩阵2 }6 f8 K2 Z4 Y% w3 H/ V. N
% 自由度Ndof=2*NJ
2 I0 j0 J0 D u( r" t1 yNdof=2*NJ;. H$ ^: \- R6 K3 d
K=zeros(Ndof);5 Q/ M% ~1 r# e }; e. Q4 ^, c1 V, e
for ii=1:Ne
4 F6 d- C; s2 k# f" X. F' k0 B% \ G=[zeros(4,2*(ii-1)),eye(4,Ndof-2*(ii-1))];
. K& h2 S, D2 _ KK=G'*Ke(:,:,Ne)*G;
% `; n# g- R( ?, ] K=K+KK;
- [* w6 z1 H9 r4 w6 M8 n6 V8 pend * z4 i1 F* Y8 T, G, s; e& ~( C
%------------------------------------------------
/ K9 ~1 ]. U# `1 h% 约束条件,对整体刚度矩阵进行修正,以便计算
% \; D4 t8 r* C8 n5 ~5 `F=zeros(Ndof,1);5 t( ?- J" q; J+ K* A* f
F(Ndof-1)=-100;$ t1 g8 N* k9 K( c1 d# K
% u=F*inv(K),u=[v1,xta1,v2,xta2,v3,xta3,v4,xta4]',v1=0,xta1=0
+ }: h) j' h1 D3 @1 r( B6 GK(1,=0; K(:,1)=0; %可以省略6 B5 M5 N4 s6 U F8 {6 r' `
K(2,=0; K(:,2)=0; %可以省略+ {6 w( C2 @0 {/ v' x
KX=K(3:Ndof,3:Ndof);( w, }3 o* d) V. I G$ g
FX=F(3:Ndof,1);
2 |6 a U6 ^7 @%------------------------------------------------" e' M" s5 z" H! O- |
%求整体节点位移列阵1 y: d. O. Q+ Y) A4 [) ?
uu=inv(KX)*FX;
: T& B8 |0 W- {- u6 y$ O0 }u=[0;0;uu];
" T9 Q; N) @* bii=1:2:2*NJ;6 [% {3 v5 I' \# w
v=u(ii); %各节点挠度3 k8 f& u2 D: a* g- T, v8 Q
xta=u(ii+1); %各节点转角
) h1 {8 |0 f! X% c%------------------------------------------------. ]1 L7 x- u2 }6 A @- t' Y
% 后处理,计算单元应变应力* F$ I+ C' N# v: G# e
B=subs(B,x,'L');
6 |+ A/ t8 N' V3 Z+ P( w7 bB=subs(B,'L',10/Ne);) |; ~4 X% U8 a, z0 w
Strain=zeros(1,Ne); %单元应变,并初始化- p% W! v' J) N* [. t. ^# }
Stress=zeros(1,Ne); %单元应力,并初始化/ g/ Y7 S# ]% {2 u# n# c' h
for ii=1:Ne s4 t. z0 K& T% o! y9 u5 i
Strain(1,ii)=B*u(2*ii-1:2*ii+2,1);
9 F A: @1 Y" ^# R$ c# P6 d Stress(1,ii)=E*Strain(1,ii);
# c& }* R; E: V5 z2 lend
2 q+ _% E/ H# ~- G: b6 \0 T1 }%--------------------------------------------------
; U/ Z- w' ^: d* \4 x% 以下程序为屏幕输出处理
' V+ |/ ~3 y9 J# \: l) p* gdisp(' ');; `/ y/ i' [- ]) ^
disp(' Input:1-print Node displacement ');) d6 Q6 o1 Z* t5 I' }/ _' H4 l' U) q
disp(' Input:2-print strain ');
0 h9 n& @. h+ }disp(' Input:3-print stress ');
. ~ C( \0 O, a; u Y# cdisp(' Input:q-quit or use ''ctrl+c'' Shortcut to end the program');9 l0 V: ^4 j. {! `
; \# }0 N: J4 z) x8 awhile 1" j I) S/ \! r$ x7 y/ F
ii=input('Please input1 or 2 or 3:','s');
/ T0 q9 b. y: H) } switch(ii)
, n: [# O3 g# D8 @ case '1'
5 T' [$ F& F c0 \9 k disp('Node displacement');
! l7 Y! T2 L! @- p1 w3 R: K+ ]. t, u disp(u');
' b+ N& B- y( B7 ~1 w9 W. T case '2'+ x1 W2 d" d5 j' `, Y, l: Y% P
disp('element strain');* j N2 n! g" b6 \7 ]) c4 {9 U
disp(Strain);1 }% W! d$ I# o. }; H- F' s8 r) N
case '3'6 l4 r* T" R! M) n
disp('element stress');/ u5 c& g/ e; ~' ?/ y, x
disp(Stress);
; `; j( T2 k4 o x! D+ G case 'q'% p8 @9 n/ i6 w& b# ^# o6 ?5 d
disp('End of program');
4 N& B# H6 r' H break;
8 |- N) d1 k3 E- ? otherwise7 A) f N* R% d+ p3 p
disp('error!Please input again');
/ @- l* t& ]; s* v6 e& E8 e continue;" c7 e8 o8 O8 J/ ?: b
end# i* p# G3 k0 R; Y% `
end7 o" u3 j; n: v' b$ [2 u& o. a
/ `9 w! a4 ~6 L6 S3 O6 |
4 g* X% b0 y1 t7 i* ^. T" w8 _) T9 q
|
|