|
这是关于梁单元的,可能大家觉得很简单。。。6 l3 j% C2 |% ?& M# E2 j3 @/ K9 F
今天翻电脑里的东西时发现的,是我大三时有限元时的作业,记得当时花了很多时间研究,学了不少东西,一个简单的作业可以涉及各方面的知识。
8 f% K ]: F# ~6 V毕业半年了,虽然记不清弹性矩阵、刚度矩阵等,但是只要一看书(好像现在的心境不下来)应该会,学校交的学习方法和理解问题的能力,有些东西不必记,除非每天从事,那该叫熟能生巧。
3 j4 s4 ^1 H: O N& M$ ~ n/ A记得当时编了两个程序,梁和三维实体的,我分享一下梁的程序吧,起码有亮点和创意,可以自己选择划分个数,在matlab方面花了不少功夫。
% ^7 ?' ]9 i; o8 T, j0 D3 P非常感谢当时的有限元授课老师“韩清凯”,虽然老师已经到了大工。上课的教材为韩清凯 的《弹性力学及有限元法基础教程》,书上有个梁单元的例子,在82页。4 C" ?% Q. W p/ V [( n8 C
--------------------------------------------------------------------------------
; B; P7 A/ \ W) `( T7 ^梁程序如下,名字就不写了,用昵称吧“太平岛”,这是常用的网络昵称; `; Z8 T/ t% E6 A
0 o+ n* w6 a- s
, R% |8 x. r- V7 Z5 {) A d% p%------------------------ BEAM2 ----------------
$ }0 z' t! N& z) Zdisp('========================================');7 l/ `# ^ N6 c) C
disp(' PROGRAM BEAM2 ');+ J! A1 s4 H2 e- X9 \6 [
disp(' Beam Bending Analysis ');
1 y; Y. z+ Q) [3 B( ?) g% {1 ?disp(' The programmer:太平岛 ');
8 Z0 v9 y) [+ ~3 Idisp('========================================');9 g7 E8 e F. U/ w6 p) K# h) F9 ^( x8 f
disp(' '); %输出空行
9 o) Q( y3 k; G! B+ u4 ^: ]warning off all %关闭所有警告提示(求积分时,警告信息比较多); }& N. F; h3 F R6 r
Ne=input('Please input the number of elements:'); %Ne为划分的单元数
1 Q: w4 ^3 x. C cNJ=Ne+1; %NJ为节点数+ X. z g8 ]; A& P8 Z; k+ |
x1=0;
/ U3 R+ L+ m ~4 m) r$ I8 V* r$ Fx2=sym('L');% b) N, F& K4 {9 y0 T1 m
x=sym('x');
# f4 I, `; i+ Mj=0:3;) E# ~& c# o4 e- k( |0 k
v=x.^j;
5 e* j* I' f. \5 j! r) p* OA=[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];
' u: v* F, S0 KN=v*inv(A); %形函数
/ k) _6 N8 c$ D( v%-----------------------------------------------
: D$ R5 h. A2 `: l8 B( a% 求单元刚度矩阵/ o4 b& U6 e: b8 C# q, q& t
E=4.0e11;# g( i: ^/ S9 b( c8 x8 Y0 ]* |
I=5.2e-7; %I=bh^3/12=5.2e-7;, _7 [- j0 Q5 N: S( a V* Q! `
EI=4.0e11*5.2e-7;
, b% P4 g# T V! g8 \B=diff(N,2);
( \: N3 ]; g. }! k& u( ~7 qk=B'*B;
" y; D+ |4 L6 {( n- Q2 L0 fKee=EI*int(k,x,0,'L');
2 z% L5 W H3 B( ?6 D; OKe=sym(zeros(4,4,Ne)); %用三维矩阵存放单元刚度矩阵,每页存一个,并初始化0
- ~/ N$ O- E3 D5 GKe(:,:,1)=subs(Kee,'L',(10/Ne));9 r' }; q ? q K& D$ R6 n
T=eye(4); % 因为梁于x轴的夹角为0,所以坐标变换矩阵为T=eye(4)& b& {+ R, w d- _3 O/ W& A
Ke(:,:,1)=T*Ke(:,:,1)*T';
: `6 |7 F. _* S$ [6 W" b$ F! Jfor ii=2:Ne0 l8 {$ L2 B8 e- x5 {" J
Ke(:,:,ii)=Ke(:,:,1);
~, B# q9 k: l9 _. uend ! _: O5 V9 S$ o* w
Ke=double(Ke);6 m3 A( ~ t1 U' e- f
%------------------------------------------------
4 R3 Z8 T" T/ N, @6 M9 x% 由矩阵装换法求整体刚度矩阵
$ H4 F' g9 P5 }. P% 自由度Ndof=2*NJ
k% \; H# X( j$ r$ K% HNdof=2*NJ;) c& h& E) ? a5 F' w2 S# u' k
K=zeros(Ndof);; a3 N' ]8 l. x( F3 ^0 v! \$ r
for ii=1:Ne
5 `) Y' [$ Z- r+ ^: t G=[zeros(4,2*(ii-1)),eye(4,Ndof-2*(ii-1))];; c. Q6 W7 J, Y
KK=G'*Ke(:,:,Ne)*G;% M4 y0 w6 C9 I( U) d) D7 L
K=K+KK;6 C) d' N$ O$ M- }. d" `& G$ |
end : v7 J; s! [1 k& e
%------------------------------------------------0 e5 Q7 I' P7 n; H) T
% 约束条件,对整体刚度矩阵进行修正,以便计算
, {, ^3 r$ l! g4 G- \; z6 ]F=zeros(Ndof,1);
" K+ ^2 w2 D! A, \F(Ndof-1)=-100;
* `) G5 @! p* X1 L% u=F*inv(K),u=[v1,xta1,v2,xta2,v3,xta3,v4,xta4]',v1=0,xta1=03 u' @" N2 M7 V* {9 }- H7 E9 g+ g- {8 X
K(1,=0; K(:,1)=0; %可以省略
$ M2 d+ e/ S' J4 s2 ?K(2,=0; K(:,2)=0; %可以省略
+ } I' v/ s, q6 |6 fKX=K(3:Ndof,3:Ndof);
7 l& G4 l' N* N% N: BFX=F(3:Ndof,1);7 V3 ^/ o1 A0 r+ j: U
%------------------------------------------------# v- I+ J6 `5 y; y
%求整体节点位移列阵 s8 R9 n6 W; e
uu=inv(KX)*FX;
# U4 @! j' a5 v+ d8 ~% c; zu=[0;0;uu];
$ D/ N% q# |6 \, f0 T* Iii=1:2:2*NJ;
) y! M* {) d! S1 dv=u(ii); %各节点挠度
+ G& g, M e3 A I3 `. R4 qxta=u(ii+1); %各节点转角
+ C/ V' [: K/ ]; T2 Z) Y3 y%------------------------------------------------
0 u y9 y2 a6 w% W" H- |% 后处理,计算单元应变应力: M; k; U) n1 L# n$ u. h3 G. M
B=subs(B,x,'L');8 W/ } J6 H0 q* F2 t# R0 R2 n
B=subs(B,'L',10/Ne);
! m, _) ^. o V i' iStrain=zeros(1,Ne); %单元应变,并初始化
! P" Z% E& l F) RStress=zeros(1,Ne); %单元应力,并初始化
7 d! ^- b* q6 u. [ ?( `% qfor ii=1:Ne
( ^; \" w& c @3 T Strain(1,ii)=B*u(2*ii-1:2*ii+2,1);
3 R: O+ p2 G6 l Stress(1,ii)=E*Strain(1,ii);
7 U( l* M! z3 e' _- c% Wend
8 ~( F/ y% ]! M+ j2 |+ E+ S%--------------------------------------------------
2 n" Q( i$ [: Y6 n. w/ I* _% 以下程序为屏幕输出处理2 _6 w" e. d' u: G3 P V) H3 k% R
disp(' ');
% `+ n$ r3 t7 \+ _0 Ldisp(' Input:1-print Node displacement ');
9 x( ?2 k& e! ^6 Wdisp(' Input:2-print strain ');7 D, k9 y; V$ K% o! k+ ]0 f
disp(' Input:3-print stress ');
5 R2 S. i6 C c4 l* M0 `disp(' Input:q-quit or use ''ctrl+c'' Shortcut to end the program');: a0 G3 ?4 z& M" `1 q, E
' M$ d# E! l% Q5 G7 z0 qwhile 1
% A9 h) s, t* J; e! E* w ii=input('Please input1 or 2 or 3:','s');
) r" M' g- M+ F# U6 o- G switch(ii)
8 ~* P( T5 [9 w3 h% k& N; p r( m case '1'
; y! @0 x m+ z8 {6 r+ e% _ disp('Node displacement');
D2 M' h3 N! a2 F: v: R. B; k. w7 J disp(u');
# r* p* s, x u& G6 f9 B case '2'& X! L1 `& r3 R6 x
disp('element strain');4 S8 }9 Y* j. i F1 P8 d0 d3 D1 `
disp(Strain);
: n6 G. z: T! W2 D9 J case '3'& \' D1 p( O. ?* W/ k' D: N l0 J
disp('element stress');
; ?9 s) R& L" V! N9 i6 N disp(Stress);
2 [9 Y' C6 Z, G! b1 [- r" @ case 'q'
7 G: T* a- F/ b6 S3 S; E disp('End of program');
" M# s% B4 c& K3 O8 x; H0 O break;: p5 R |7 b* o3 b! i& l
otherwise
% o* N$ n! y; T disp('error!Please input again'); x; `6 I% e% p3 v# }
continue;5 v8 Z' s: `5 B: C1 H7 m0 V+ m7 v
end
% h( |; f3 v* Y7 F/ R; nend% y! w+ Y3 R* T3 _
: t0 i1 ]5 h5 p4 s" I& z% E
- U. ^' k' ~6 ~( q. | |
|