|
这是关于梁单元的,可能大家觉得很简单。。。% @% _4 x& g l; f. ?0 \; @
今天翻电脑里的东西时发现的,是我大三时有限元时的作业,记得当时花了很多时间研究,学了不少东西,一个简单的作业可以涉及各方面的知识。
- ?! E3 m N& C1 ~0 B% ?4 B" X) H毕业半年了,虽然记不清弹性矩阵、刚度矩阵等,但是只要一看书(好像现在的心境不下来)应该会,学校交的学习方法和理解问题的能力,有些东西不必记,除非每天从事,那该叫熟能生巧。3 p" g# G* ^4 |1 _
记得当时编了两个程序,梁和三维实体的,我分享一下梁的程序吧,起码有亮点和创意,可以自己选择划分个数,在matlab方面花了不少功夫。+ e v9 M6 x I
非常感谢当时的有限元授课老师“韩清凯”,虽然老师已经到了大工。上课的教材为韩清凯 的《弹性力学及有限元法基础教程》,书上有个梁单元的例子,在82页。
2 O* E5 W/ v, I. \) Q--------------------------------------------------------------------------------' ?" j( Y0 O( x( W
梁程序如下,名字就不写了,用昵称吧“太平岛”,这是常用的网络昵称
2 I6 i9 `) ^& X; r" E% R0 V$ r6 T2 n' T+ H( j( Z8 F' s
1 g/ K! b9 |( t7 Y" _%------------------------ BEAM2 ----------------
2 ]0 o* a+ J- z3 Gdisp('========================================');: A) z8 w2 n% {* t4 V
disp(' PROGRAM BEAM2 ');
/ ?! N$ u1 Q5 ?1 adisp(' Beam Bending Analysis ');
( [* ?8 H' m8 r! s# I6 V. ndisp(' The programmer:太平岛 ');" t' U7 j4 A) Z: `6 ^
disp('========================================');1 u. k4 y6 U& f p+ w
disp(' '); %输出空行2 m+ z2 P3 w. O2 h' w
warning off all %关闭所有警告提示(求积分时,警告信息比较多)
. B- _ b3 W5 y1 g' v( O yNe=input('Please input the number of elements:'); %Ne为划分的单元数
' |& S* y) k0 ]/ b R7 oNJ=Ne+1; %NJ为节点数
# t* o7 }& M, h4 A3 |; g9 hx1=0;0 P3 e& y' q; q
x2=sym('L');
: \$ X6 p" w7 n/ Sx=sym('x'); 4 q- ?# s5 f3 T( j h
j=0:3;
* u5 s- _% a7 \3 T: }1 pv=x.^j;! `1 R! ? R9 [: _7 x
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];. l, S# v+ V" b/ m. u* e& I
N=v*inv(A); %形函数# \# T0 E' ^$ h) h7 C2 w2 H3 k
%-----------------------------------------------
/ C% q P1 g+ X+ W! s% 求单元刚度矩阵
: i f( g& }# ?7 qE=4.0e11;* ]* @1 W! }: i
I=5.2e-7; %I=bh^3/12=5.2e-7;1 @# p" A* {- u* e5 P4 @& ]' q7 s
EI=4.0e11*5.2e-7;7 u+ e8 c3 [8 g& @
B=diff(N,2);2 ^. z, c2 s, g1 b5 Y1 d2 r# |
k=B'*B;% P, ~% A& o$ @ J7 g
Kee=EI*int(k,x,0,'L');
4 `/ G. ^( R+ b- Z" hKe=sym(zeros(4,4,Ne)); %用三维矩阵存放单元刚度矩阵,每页存一个,并初始化0
( V3 o* [3 W. C0 `4 v4 j( ?$ e' Q% NKe(:,:,1)=subs(Kee,'L',(10/Ne));& o0 @7 D0 x0 b8 H3 A8 j* H/ Q
T=eye(4); % 因为梁于x轴的夹角为0,所以坐标变换矩阵为T=eye(4)2 Z2 r; Q. N/ j( l7 \# q
Ke(:,:,1)=T*Ke(:,:,1)*T';) f( T8 V2 y+ h1 O+ }
for ii=2:Ne- t" L z$ N v1 V2 t |0 O
Ke(:,:,ii)=Ke(:,:,1);$ P- G! v6 h' X7 w, [
end
3 ~: V6 X# q* k+ M& E: u# bKe=double(Ke);
9 U; ]) N) |" i6 S/ M# }1 a%------------------------------------------------( B* G s6 j: K1 @4 S
% 由矩阵装换法求整体刚度矩阵
: C$ X" U5 D% t9 C% 自由度Ndof=2*NJ
+ t, G3 S& g, h( K- xNdof=2*NJ;7 D B# K! M9 k3 L1 }3 M
K=zeros(Ndof);
% v! Q2 q) G6 J4 z* Vfor ii=1:Ne; l# n, f$ _+ U
G=[zeros(4,2*(ii-1)),eye(4,Ndof-2*(ii-1))];5 |1 ?* J3 y' N/ v
KK=G'*Ke(:,:,Ne)*G;
; ]! _7 ^( ?+ m; e0 u' J K=K+KK;
9 ~- V" X! L, U( P* f) P3 tend
4 a4 C& T: i- J' A: m%------------------------------------------------1 y. @3 z& {. D1 g
% 约束条件,对整体刚度矩阵进行修正,以便计算
# N1 f1 l! ~% z- q9 V1 |- n1 [F=zeros(Ndof,1);: J( l5 w2 H2 [/ J, A
F(Ndof-1)=-100;0 B& J0 `0 [( l# T( I) ~( P
% u=F*inv(K),u=[v1,xta1,v2,xta2,v3,xta3,v4,xta4]',v1=0,xta1=02 T% {* r9 h6 b: J
K(1,=0; K(:,1)=0; %可以省略
8 J- j6 [3 {. P* i5 NK(2,=0; K(:,2)=0; %可以省略2 d; r* t. w2 M+ r2 s
KX=K(3:Ndof,3:Ndof);: v6 q: q- N+ x+ n- B. ?
FX=F(3:Ndof,1);
8 B+ d; I- w. f%------------------------------------------------
1 ~4 t' }$ t& X* T0 o%求整体节点位移列阵6 I) j, g. \; g" f" I+ ^" N! ?+ ~
uu=inv(KX)*FX;
0 h @: k, Z; k% cu=[0;0;uu];7 q" a6 G( s" z$ B6 e1 a. g2 U/ J- b
ii=1:2:2*NJ; ^7 l$ I: a3 V
v=u(ii); %各节点挠度
2 _ E$ [: ]4 t1 O1 Jxta=u(ii+1); %各节点转角
! \6 n+ H; N# m& N4 B7 H%------------------------------------------------3 H8 C% a9 h! p. _- [8 T
% 后处理,计算单元应变应力
( }) a# ~( f6 `2 U# R* U8 qB=subs(B,x,'L');7 X0 E( H* ~* H
B=subs(B,'L',10/Ne);
0 r m. W6 l1 S( p+ F# [( `4 YStrain=zeros(1,Ne); %单元应变,并初始化) F; L% H) ^) _9 z" z4 @7 q
Stress=zeros(1,Ne); %单元应力,并初始化$ \% u1 |% }+ V" j- w, j; M; e! T
for ii=1:Ne
4 S7 x$ q1 u' A# u Strain(1,ii)=B*u(2*ii-1:2*ii+2,1);
3 K0 I$ N7 S1 c2 I Stress(1,ii)=E*Strain(1,ii);8 x0 E; W2 s/ C- E$ m6 i
end# e8 N+ i! j& d
%--------------------------------------------------$ t: d! r$ m3 [ ]
% 以下程序为屏幕输出处理
$ Q- \# A# P3 T! C* ^7 qdisp(' ');
$ y. E8 U s/ _4 @& Odisp(' Input:1-print Node displacement ');, I( k! O3 f# _8 a2 r# {( \1 B
disp(' Input:2-print strain ');. z1 e' @$ ?$ w' e
disp(' Input:3-print stress ');8 L) W9 Z2 ?& Y8 v
disp(' Input:q-quit or use ''ctrl+c'' Shortcut to end the program');
# e, x; f+ |# Y
% M+ m# M3 \8 L Xwhile 1/ P9 N5 p- X- b8 r1 }5 ?& i- R
ii=input('Please input1 or 2 or 3:','s');
" O. x. v: Q$ b switch(ii)! P8 p# @! ?" v
case '1'+ | a# z# l+ B- i
disp('Node displacement');
, h" v5 A- h. s/ F1 l$ Y; u+ Z disp(u');) C6 s, y8 L# ^: x" S
case '2'1 f7 Z: i. y% H" k+ t! `* X
disp('element strain');
/ M/ x v) _; L/ U- v9 g! K6 \ disp(Strain);
4 h3 `( c5 y9 }; o% {! x, G; H case '3'
# S: ~2 F: d" b T. b# j! ^; H# \ disp('element stress');. t3 j0 ]1 n8 N( N
disp(Stress);& Z1 Y2 q( C0 s+ ^- l
case 'q'
6 i% _' m: W" M G2 n5 z/ W disp('End of program');
D8 r8 @0 k6 z& S& p( D. m% w( k break;
# j- L' x4 U4 V$ F- g otherwise
O. k6 L, P6 Q/ F disp('error!Please input again');- L0 Q8 C4 z7 q6 ]( |
continue;! r0 `2 `# T- I1 d
end
* Y# g8 K' j. L+ g5 d* vend
: g7 a7 w5 u- Z6 ?, j& _
' ]. g% d3 W9 x9 e& l
5 Z8 x [0 A" L |' a- ? |
|