|
这是关于梁单元的,可能大家觉得很简单。。。 {! }( S' k7 M, ]4 V+ H* D2 a/ |
今天翻电脑里的东西时发现的,是我大三时有限元时的作业,记得当时花了很多时间研究,学了不少东西,一个简单的作业可以涉及各方面的知识。
6 l: Q# |0 o: q! W毕业半年了,虽然记不清弹性矩阵、刚度矩阵等,但是只要一看书(好像现在的心境不下来)应该会,学校交的学习方法和理解问题的能力,有些东西不必记,除非每天从事,那该叫熟能生巧。8 `! d" I0 l1 y/ l5 q
记得当时编了两个程序,梁和三维实体的,我分享一下梁的程序吧,起码有亮点和创意,可以自己选择划分个数,在matlab方面花了不少功夫。5 s8 `$ W3 g# A A9 q# ]$ U9 n
非常感谢当时的有限元授课老师“韩清凯”,虽然老师已经到了大工。上课的教材为韩清凯 的《弹性力学及有限元法基础教程》,书上有个梁单元的例子,在82页。
' u8 m n+ s, Z- f8 e8 ^1 ~. {--------------------------------------------------------------------------------
" |+ q1 V* u- U R8 W: d, D8 c梁程序如下,名字就不写了,用昵称吧“太平岛”,这是常用的网络昵称$ c0 n* l/ w* m
( F7 Q5 X+ |( \: C) A4 u @. v0 [( t$ e( |' _1 g0 Y- V% C. u+ ]
%------------------------ BEAM2 ----------------
n$ I6 q0 M9 `7 X, }7 l3 vdisp('========================================');" r/ j, R; o4 Y" g, u5 s$ A, ?
disp(' PROGRAM BEAM2 ');
* _5 ?! {. n& x6 B: x' N- Ydisp(' Beam Bending Analysis ');# G+ q4 Z k3 g2 m/ \
disp(' The programmer:太平岛 ');' Q% _7 N) r; {% j$ s, p
disp('========================================');
% M, R t7 F1 L3 ?$ mdisp(' '); %输出空行
) u t% i& F' t: m5 {warning off all %关闭所有警告提示(求积分时,警告信息比较多)$ h! Z, }7 E8 o
Ne=input('Please input the number of elements:'); %Ne为划分的单元数: X ]: _4 ]2 s) o
NJ=Ne+1; %NJ为节点数0 g h2 ?# |0 w, g( O. e5 U
x1=0;+ _; I% P' R7 X3 p
x2=sym('L');/ F4 u7 M* F3 i1 q$ ~# d) ` u
x=sym('x'); : `& Q$ v. Y0 z: _4 ]) F0 |
j=0:3;
1 w0 b3 e' j0 ?v=x.^j;
; a( M, E0 e% e# f+ F1 L& ?; ^; f: s9 zA=[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];* D. T2 k- m& n/ ^6 i! K& K+ o$ {+ p
N=v*inv(A); %形函数- }6 s3 L( Z; Q( ^/ [" _5 S
%-----------------------------------------------$ {4 J5 ?, v1 | \
% 求单元刚度矩阵* _6 a& J/ ~ d& p& ?* I6 x- p( X
E=4.0e11;( {* ]; o3 }/ f$ {, a: T
I=5.2e-7; %I=bh^3/12=5.2e-7;
* q Y6 S) n5 c; F" ~1 PEI=4.0e11*5.2e-7;. i: E, m" L) s, ~8 T
B=diff(N,2);" Q* |( [! ^' H5 b# K4 W; z1 X
k=B'*B;! s4 T0 ^7 j+ d* e
Kee=EI*int(k,x,0,'L');/ {1 C$ z0 `: T6 [& K. z; P
Ke=sym(zeros(4,4,Ne)); %用三维矩阵存放单元刚度矩阵,每页存一个,并初始化06 k) B- N z' Y9 ~+ ~$ p+ z8 R6 n
Ke(:,:,1)=subs(Kee,'L',(10/Ne));: ~ k! }4 k# J j1 x$ s
T=eye(4); % 因为梁于x轴的夹角为0,所以坐标变换矩阵为T=eye(4); s3 R; h1 D/ s% {7 j6 H
Ke(:,:,1)=T*Ke(:,:,1)*T';6 ]0 s% W% l6 v+ ^. _
for ii=2:Ne2 n9 N- c1 F" h- r, L) |# U; K
Ke(:,:,ii)=Ke(:,:,1);
1 s$ O+ l1 U6 x, Yend
; H- k2 _7 l! f; d9 y. _3 C6 LKe=double(Ke);' H, t% g8 m1 X9 J o% w) r$ H
%------------------------------------------------; d: {8 t A; p
% 由矩阵装换法求整体刚度矩阵
, L2 d) x: m3 L% 自由度Ndof=2*NJ
$ k# b$ r: I4 ?5 vNdof=2*NJ;
9 y I4 h5 { [, E: U: JK=zeros(Ndof);" w: i8 `2 @/ ] ^/ j( K
for ii=1:Ne( N+ P5 e9 G" U$ A1 X' H
G=[zeros(4,2*(ii-1)),eye(4,Ndof-2*(ii-1))];
2 E% i9 Q- y% a+ _ j; k0 d% d KK=G'*Ke(:,:,Ne)*G;; H, j2 M+ X) F7 h& C1 O* O0 e
K=K+KK;
! j& U* v$ V0 E6 R3 cend % O# U, p# k+ `- z ?' y
%------------------------------------------------
2 t4 C4 |4 g# Z: Q9 d) W/ d- ^# o% 约束条件,对整体刚度矩阵进行修正,以便计算
' R8 {: |8 C# f' CF=zeros(Ndof,1);( x' Y$ F5 V3 ]2 g" X
F(Ndof-1)=-100;
$ j; q" ?/ A8 ]1 H# u3 T% u=F*inv(K),u=[v1,xta1,v2,xta2,v3,xta3,v4,xta4]',v1=0,xta1=0
7 d* W ^+ d" p) G) qK(1, =0; K(:,1)=0; %可以省略
9 ^% ?7 d1 ?3 \2 I. c# {, I5 ]3 cK(2, =0; K(:,2)=0; %可以省略
7 t' a4 u7 O/ l7 ~" v7 L# cKX=K(3:Ndof,3:Ndof);$ t. Q0 f* [4 h' f* \8 }1 i
FX=F(3:Ndof,1);: F+ s1 d a% o& u/ R$ p9 ?
%------------------------------------------------
} y" c$ Z* ~ }2 w2 A2 [%求整体节点位移列阵; e) H- A& v+ M
uu=inv(KX)*FX;
! h$ i; _( B+ }) J( j; `- Y, Ru=[0;0;uu];: J# G( c7 _& e& D6 @. W7 T) w
ii=1:2:2*NJ;- s) k2 ]1 I# L' L# Y$ ^
v=u(ii); %各节点挠度0 Y" v/ G! r- `+ R; H
xta=u(ii+1); %各节点转角9 v! p1 k6 D0 C) n3 Z- `$ i* V
%------------------------------------------------
" ~3 b% B7 F' R3 T+ h3 Z% 后处理,计算单元应变应力
2 _: [; g: o6 @B=subs(B,x,'L');, O4 \( M2 c0 t
B=subs(B,'L',10/Ne);
3 P3 R+ G$ R9 wStrain=zeros(1,Ne); %单元应变,并初始化
- Z! D" B4 s. _0 x: c: jStress=zeros(1,Ne); %单元应力,并初始化% K; n) _( n; j3 h8 l, L+ E' S4 o
for ii=1:Ne
X1 D5 e# ^1 j' E! p) l Strain(1,ii)=B*u(2*ii-1:2*ii+2,1);
% b( e! s! {0 z Stress(1,ii)=E*Strain(1,ii);
; T+ K2 Q% F9 e5 xend n: g+ i3 ^" f. s3 n# L4 Q
%--------------------------------------------------
+ j$ c1 @' u; X: P. k3 o3 {/ f( X- l! e% 以下程序为屏幕输出处理 a! f' \% K) ?$ X" o
disp(' ');
! W2 G$ J: g. \ r; O# v( ~disp(' Input:1-print Node displacement ');' I" ?9 f2 q" E# c- v
disp(' Input:2-print strain ');
5 c$ E4 i, Y6 Mdisp(' Input:3-print stress ');7 W7 r& W+ }' I& c
disp(' Input:q-quit or use ''ctrl+c'' Shortcut to end the program');: u0 L/ O7 Q0 u8 o- ~. |
3 N! [# ?0 J$ H8 v$ U6 {while 1( W/ Y# ? Z* `
ii=input('Please input1 or 2 or 3:','s');' r; z) T& p' T; b
switch(ii)
: u6 |* K, K2 D! r$ Z case '1'
' B% i3 j$ [( E; O) w disp('Node displacement');
$ U9 y) N0 N0 X8 k) N/ j% h disp(u');7 ?7 Q2 ?" P# }
case '2'
& t5 W! v }5 P; _ disp('element strain');$ u, Y; l5 a2 ^
disp(Strain);9 R3 M6 g8 ~" R, C( r( ~% O6 O
case '3'+ [8 P" y% o5 ]) E
disp('element stress');
1 H) H. _- w5 r" T1 ^ disp(Stress);7 r- }' X! W! J0 S
case 'q'
' W* n' W* m9 Z { disp('End of program');
: |9 @$ u0 }5 `( F2 Z9 M& ]. W" G break;6 T. r+ Y, M p, F# i* n1 X( h
otherwise; \& j, I8 g- w: C6 h+ F2 U
disp('error!Please input again');
7 \$ } i1 o) q* \+ t" y N continue;; P3 I; g& b* Y; l/ M! d
end @5 O: i0 u. c- _
end
+ r( p; ^! `2 U/ @" z+ e( N
: B. x3 \ W9 l* J2 g8 r
0 Z- ^5 a6 x! q |
|