|
这是关于梁单元的,可能大家觉得很简单。。。
4 I' }8 M$ t) G! S, d5 ^/ i今天翻电脑里的东西时发现的,是我大三时有限元时的作业,记得当时花了很多时间研究,学了不少东西,一个简单的作业可以涉及各方面的知识。
: r! P" y) V9 p6 {毕业半年了,虽然记不清弹性矩阵、刚度矩阵等,但是只要一看书(好像现在的心境不下来)应该会,学校交的学习方法和理解问题的能力,有些东西不必记,除非每天从事,那该叫熟能生巧。
- a# K8 V* z. V9 M0 Y记得当时编了两个程序,梁和三维实体的,我分享一下梁的程序吧,起码有亮点和创意,可以自己选择划分个数,在matlab方面花了不少功夫。
9 r0 B2 e; F; s: v9 w& c非常感谢当时的有限元授课老师“韩清凯”,虽然老师已经到了大工。上课的教材为韩清凯 的《弹性力学及有限元法基础教程》,书上有个梁单元的例子,在82页。) h! ~6 k+ m+ l% P9 _; K& R6 ~. w( N
--------------------------------------------------------------------------------
/ K7 r% q! k* g2 b8 E0 @! S: ~梁程序如下,名字就不写了,用昵称吧“太平岛”,这是常用的网络昵称$ { f5 {. w! E# ~7 ~7 r i3 N
) |' D0 O0 B3 G
9 L) j1 U5 r0 I
%------------------------ BEAM2 ----------------1 {( a3 m3 s- D. q e
disp('========================================');! H. T) V% W3 g" ?3 k/ v0 g
disp(' PROGRAM BEAM2 ');
8 b" @2 A# L$ }2 y* X% f8 a. wdisp(' Beam Bending Analysis ');
. b2 B W. @: Adisp(' The programmer:太平岛 ');4 i8 i, G# P/ ~: s! L0 _: b
disp('========================================');
. o& p/ g0 A" D( edisp(' '); %输出空行# j% U+ v& B, J8 j1 K/ X# J
warning off all %关闭所有警告提示(求积分时,警告信息比较多)
8 H, m" Q# {7 G8 nNe=input('Please input the number of elements:'); %Ne为划分的单元数
- ]$ l5 r& f' t% f. T9 V$ a4 QNJ=Ne+1; %NJ为节点数
5 R; I4 q8 l, R5 E& rx1=0;
5 o; p8 @" j0 G7 ]" Nx2=sym('L');/ |! ?: e& @( e7 V# r
x=sym('x');
3 ? `( H6 `2 j+ ?% h5 m: N3 lj=0:3;
% j I. Y0 ~/ nv=x.^j;
! A o8 v8 p5 ]- g6 PA=[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];# M2 O+ O5 F- h& w K( R
N=v*inv(A); %形函数
9 x1 F2 `" H+ k7 H%-----------------------------------------------" A3 L' W, d! x) y% o2 X
% 求单元刚度矩阵* e5 Z: b6 \1 ]: w+ M& K
E=4.0e11;' u5 t; b3 j' L7 o9 O8 T
I=5.2e-7; %I=bh^3/12=5.2e-7;
0 `) W8 T; o( FEI=4.0e11*5.2e-7;& R7 \2 v& C% ]% d2 o' J: D1 g, a
B=diff(N,2);
{3 @6 ^* ~( C4 W# F E0 c1 C* |k=B'*B;; U' ~# U- t% v" s( Y# c5 X
Kee=EI*int(k,x,0,'L');
0 c! h2 ^9 w5 _/ e6 FKe=sym(zeros(4,4,Ne)); %用三维矩阵存放单元刚度矩阵,每页存一个,并初始化0
2 |( b/ h0 ^* ?Ke(:,:,1)=subs(Kee,'L',(10/Ne));
' i. v; H A/ gT=eye(4); % 因为梁于x轴的夹角为0,所以坐标变换矩阵为T=eye(4)
1 ^/ k0 j! w5 X" w9 e; C* @Ke(:,:,1)=T*Ke(:,:,1)*T';* m# ?2 M9 `! Y
for ii=2:Ne: o4 H+ V0 }; i6 J7 o! T& h
Ke(:,:,ii)=Ke(:,:,1); I- A! s$ _5 V' ?3 J
end
8 e$ F) O' J: f& p5 y- t* r6 UKe=double(Ke);3 H1 `* t" h( v1 U0 {! J
%------------------------------------------------
+ g8 b. b+ O( b- e& S% 由矩阵装换法求整体刚度矩阵
: {, d9 o- ^+ _* L& E' i$ r, n% 自由度Ndof=2*NJ
$ o! U: U# e) S, n) R' BNdof=2*NJ;
' K/ R! p* |9 @5 a: A8 ?6 nK=zeros(Ndof);
9 x& L; {/ e8 e6 hfor ii=1:Ne
0 s6 ?1 `4 d) _ G=[zeros(4,2*(ii-1)),eye(4,Ndof-2*(ii-1))];
0 `0 ^7 G2 S9 Q( I; A9 q, S: B KK=G'*Ke(:,:,Ne)*G;7 K. ^7 Q+ e: y- o: q
K=K+KK;
' J& ?4 m+ f( Q! j. lend & q3 O" Z0 V0 l! P# \, X8 u J
%------------------------------------------------
+ n, H6 v1 F: X V+ X% 约束条件,对整体刚度矩阵进行修正,以便计算
" B( p" S7 v2 T1 [, S$ h8 t- Z! NF=zeros(Ndof,1);% `4 A5 E0 j- W' O% }
F(Ndof-1)=-100;# m# R/ G6 x9 d1 P* @5 S
% u=F*inv(K),u=[v1,xta1,v2,xta2,v3,xta3,v4,xta4]',v1=0,xta1=0
8 F/ V- Q. R9 b7 y) i- t- tK(1,=0; K(:,1)=0; %可以省略
6 ^7 O* a t) Q7 v' {& D6 ?K(2,=0; K(:,2)=0; %可以省略
4 @3 _; s( ]" t" x" y1 l5 }" S* SKX=K(3:Ndof,3:Ndof);: h6 Z) J4 e$ r& B
FX=F(3:Ndof,1);7 U1 r: C- D& G G
%------------------------------------------------
& M% d) z3 O& W%求整体节点位移列阵! k$ G6 w+ t' N
uu=inv(KX)*FX;
4 w' ] p. {7 P3 tu=[0;0;uu];
. q# S) m. W6 Y* [% }- }ii=1:2:2*NJ;
6 E) u) W9 P! kv=u(ii); %各节点挠度
; C5 u4 O8 \% ]: mxta=u(ii+1); %各节点转角
! X& G. d6 s# {%------------------------------------------------$ a' {3 x- @, V
% 后处理,计算单元应变应力
2 a* K- A# y6 s& xB=subs(B,x,'L');& k; T, _0 x* J6 y. C
B=subs(B,'L',10/Ne);4 E9 ~* D1 ~1 E
Strain=zeros(1,Ne); %单元应变,并初始化8 ]' k- o1 I& ~/ \4 y. x
Stress=zeros(1,Ne); %单元应力,并初始化
+ ~; \& y, z( t* s2 n# Ufor ii=1:Ne
0 T5 M& J: c3 C, X% }5 M: k% d$ F Strain(1,ii)=B*u(2*ii-1:2*ii+2,1);
1 k3 X4 q- _! {5 J" `/ \ Stress(1,ii)=E*Strain(1,ii);3 b8 G4 H; h0 B! o# x
end5 ]' G: W; D: }( e5 [
%--------------------------------------------------
! I( w/ g: }% E: @$ @( w3 Y% 以下程序为屏幕输出处理/ M/ ?% a& A& j7 t# V/ B# R, T# @
disp(' ');
& k+ B6 q4 }: d7 Gdisp(' Input:1-print Node displacement ');
$ e A1 _6 M0 Z B0 t9 Qdisp(' Input:2-print strain ');
0 k: m+ k9 B2 x* [& Gdisp(' Input:3-print stress ');
2 F1 d) X. A& H9 Bdisp(' Input:q-quit or use ''ctrl+c'' Shortcut to end the program');
% c o9 a) x. H$ M8 b5 y9 `2 f: j" g, B( o
while 11 b. u( z& w" r+ P9 |
ii=input('Please input1 or 2 or 3:','s');
. k7 c) d/ M$ D6 o6 @/ u0 Q switch(ii)* k: s. I7 U7 A) s. ?) ?& C
case '1'
; k0 i+ o9 ^6 B" T9 @2 E% w disp('Node displacement');* ]7 z9 D$ C3 q
disp(u');
2 T. N) b/ ~6 Y! e* I" f% z case '2'
& { ]& F, K$ e: e1 @) G disp('element strain');4 z0 [# n: }# u; Q$ E
disp(Strain);* z& T$ X! y% A5 q* Q. {
case '3'- [9 y) o* l: s+ [" ]2 ] t. A
disp('element stress');. k2 o+ X) J9 o( H9 O* a( Z8 e# j
disp(Stress);
' y/ o K2 \3 O* d case 'q'
. @ S! {% h. \5 w0 b% v7 n8 \ disp('End of program');3 r% q ^7 X5 U0 G8 H J
break;4 P. D: E( d8 E$ J8 m0 O
otherwise
! X/ d- z+ M" ]6 d: q- Z' i1 J disp('error!Please input again');
. R" @4 E9 j- O% Z* [ continue;
& ^7 @4 Q6 h$ {6 J9 t end- ~. G6 H9 P$ q; b& ^
end8 S# x! k ?. V" W
0 g- m, P: ?/ J7 Q; p8 o
) f( M1 h4 t1 Q ]- e( n
|
|