|
這是關于梁單元的,可能大家覺得很簡單。。。
5 k# Z* n! {. S! h今天翻電腦里的東西時發現的,是我大三時有限元時的作業,記得當時花了很多時間研究,學了不少東西,一個簡單的作業可以涉及各方面的知識。* r7 p% U+ K# w& O( F6 O
畢業半年了,雖然記不清彈性矩陣、剛度矩陣等,但是只要一看書(好像現在的心境不下來)應該會,學校交的學習方法和理解問題的能力,有些東西不必記,除非每天從事,那該叫熟能生巧。
# O; |+ v8 I! j+ k記得當時編了兩個程序,梁和三維實體的,我分享一下梁的程序吧,起碼有亮點和創意,可以自己選擇劃分個數,在matlab方面花了不少功夫。* t5 w& k' d6 G' l3 w1 [/ O. r! X- U
非常感謝當時的有限元授課老師“韓清凱”,雖然老師已經到了大工。上課的教材為韓清凱 的《彈性力學及有限元法基礎教程》,書上有個梁單元的例子,在82頁。
; C" k3 T2 G% U1 v5 {8 [--------------------------------------------------------------------------------$ F7 T/ N4 l! ^; w
梁程序如下,名字就不寫了,用昵稱吧“太平島”,這是常用的網絡昵稱7 c4 [+ W: U2 w2 I* `$ V
- l( @7 l; e# _) ?4 ~& Y) S) c% `3 R
) k& b% B* M! l J+ f) S%------------------------ BEAM2 ----------------
) a2 _& r, r9 d# \disp('========================================');4 D1 v( P9 H" ]
disp(' PROGRAM BEAM2 ');
& y2 M$ H% |# W2 I9 ^& w1 Ldisp(' Beam Bending Analysis ');/ `" y+ h7 k. Y( Q3 w0 v, ]7 i
disp(' The programmer:太平島 ');
# @, | X7 R l' |disp('========================================');
( G: g/ V" h6 }! e. q! K5 l- I9 `disp(' '); %輸出空行7 G& v2 A# A# L: E) x! b% R
warning off all %關閉所有警告提示(求積分時,警告信息比較多)6 v/ }6 N/ y/ _+ b& r) x
Ne=input('Please input the number of elements:'); %Ne為劃分的單元數
s* e# x2 f4 ^* b. g+ }0 n& `' sNJ=Ne+1; %NJ為節點數, u/ d. _: Q3 Q$ O: O% n0 u
x1=0;+ `6 k9 Q+ _+ y' Q1 T. {! a/ @
x2=sym('L');
$ e' n5 p; ]5 x3 l, R: ?+ R+ [* ^, v$ vx=sym('x');
% o2 r* B% P. @/ O' j1 c% L+ bj=0:3;
- j1 O6 C; ?/ ^. {v=x.^j;
( e5 q, p G6 I) x7 bA=[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];
5 `) [# E- i6 Q# `3 H+ F8 iN=v*inv(A); %形函數
5 t/ a/ D* X! h5 @%-----------------------------------------------
# y: y+ Z' l( `. F% 求單元剛度矩陣' F" W; d6 o+ X& s3 P9 V
E=4.0e11;
2 m1 r- H6 M% w- k2 q y1 VI=5.2e-7; %I=bh^3/12=5.2e-7;/ l0 |! i R9 B
EI=4.0e11*5.2e-7;
" ^- J( Q: X+ M; R$ VB=diff(N,2); {# _; w) Y8 n+ z( M, }
k=B'*B;
( @& v% c6 S0 { s5 a7 M, DKee=EI*int(k,x,0,'L');7 P# T* U5 P5 }& U7 `
Ke=sym(zeros(4,4,Ne)); %用三維矩陣存放單元剛度矩陣,每頁存一個,并初始化01 t% h/ F1 S8 t- N+ b! ]5 b
Ke(:,:,1)=subs(Kee,'L',(10/Ne));0 a" U6 n* C! R( a3 x$ C
T=eye(4); % 因為梁于x軸的夾角為0,所以坐標變換矩陣為T=eye(4)
/ ]* s8 U6 f$ L* ?Ke(:,:,1)=T*Ke(:,:,1)*T';
( \4 o& F4 Q) R1 _for ii=2:Ne
9 D5 X. W8 p6 ~' O. }8 N Ke(:,:,ii)=Ke(:,:,1);
2 f7 ?3 n: Q6 F+ Kend ) M! M/ C2 c O+ o5 h3 j7 f$ j+ T
Ke=double(Ke);' o% L0 W1 g* v
%------------------------------------------------0 ]% o: p, W5 m0 E, g
% 由矩陣裝換法求整體剛度矩陣% Y' t$ s- [4 J% g) R# [# @
% 自由度Ndof=2*NJ2 P! Z' y% l* v+ ]5 I% H
Ndof=2*NJ;
% _$ {) ~+ K1 C; j8 u& h2 NK=zeros(Ndof);
8 K$ k, Z# a8 R4 _! U- Hfor ii=1:Ne+ R6 F' z: F' f4 `5 c% m" x
G=[zeros(4,2*(ii-1)),eye(4,Ndof-2*(ii-1))];
8 w1 W/ i) x2 m7 B, \, y; e- O KK=G'*Ke(:,:,Ne)*G;- ?4 e, {! s; p& a& C% q
K=K+KK;
! ], P7 A) t: ] F4 Nend " [' S6 r% A% i7 H7 W4 L# T
%------------------------------------------------
7 l. q5 |: e I2 g+ l$ ?% 約束條件,對整體剛度矩陣進行修正,以便計算: e+ i" C$ G. ?: J' O' ?: a
F=zeros(Ndof,1);
: f4 r3 k8 G; `! gF(Ndof-1)=-100;1 u8 i) q# K9 k0 I. M9 \, r q
% u=F*inv(K),u=[v1,xta1,v2,xta2,v3,xta3,v4,xta4]',v1=0,xta1=0
* l1 X# O; j% j# L% i5 nK(1, =0; K(:,1)=0; %可以省略
$ J5 i, t% u4 ?, eK(2, =0; K(:,2)=0; %可以省略
# v4 D% l8 b b# oKX=K(3:Ndof,3:Ndof);
i- ?( X6 ]4 g8 DFX=F(3:Ndof,1);0 F/ c$ G# f, u R
%------------------------------------------------
$ C& E7 Z' w; r0 j* f5 {# ~%求整體節點位移列陣8 u4 x& T0 f5 V% ?! o, a
uu=inv(KX)*FX;
; K( R% R8 ]9 X) A3 S( yu=[0;0;uu];
' @' M8 k& b4 B# P: L# [- d/ V2 ?& Yii=1:2:2*NJ;
* s( B* _$ q1 l4 yv=u(ii); %各節點撓度
/ `; A: v4 D t* M+ s2 ?xta=u(ii+1); %各節點轉角
) p5 L9 b7 H* S$ n: C%------------------------------------------------
* O1 b# W$ L- S% 后處理,計算單元應變應力( ~" _2 A. @4 @7 \0 I0 R3 T4 _
B=subs(B,x,'L');+ f: @/ B4 A* A( ^6 X+ r, Y' p0 r* s# A
B=subs(B,'L',10/Ne);% e, R/ @: |' ?9 ?. {
Strain=zeros(1,Ne); %單元應變,并初始化3 ~0 Z- L I! K( h4 Q, m
Stress=zeros(1,Ne); %單元應力,并初始化
) ]- w3 _. g8 P( s) Ufor ii=1:Ne; s0 `, m. H/ y- U; Y
Strain(1,ii)=B*u(2*ii-1:2*ii+2,1);
& q; r. v) u1 _6 L( ^& {( M Stress(1,ii)=E*Strain(1,ii);1 J& R) i1 l' z' |0 a
end9 `4 m; o: y1 i5 k' n, h
%--------------------------------------------------
4 M5 u6 F( b, k$ e, O% 以下程序為屏幕輸出處理& L# V6 _/ g2 \# x: ~
disp(' ');- y% x# S: w) L4 c: s
disp(' Input:1-print Node displacement ');
* G' u6 t0 G9 O$ k5 w0 \2 qdisp(' Input:2-print strain ');
. `7 x8 O e- u3 G4 e" hdisp(' Input:3-print stress ');
: V7 a) c9 r2 d ], Y4 `! Bdisp(' Input:q-quit or use ''ctrl+c'' Shortcut to end the program');
+ h! v- ^6 N9 Z' u* L
$ R1 s) u, G2 Y$ c2 Qwhile 1
/ I5 Q( @, s5 W* Y6 c8 z1 Y- G4 M& w ii=input('Please input1 or 2 or 3:','s');6 S3 q9 P5 C5 U4 e
switch(ii)
. y2 D7 d7 K+ `8 p& f1 V case '1'1 ?& N; a7 T1 G" D
disp('Node displacement');
* {8 z, L% o( i" \; ?* g disp(u');
* c; X8 t; h' T6 p2 Q case '2', E" m- ^* `' c6 h
disp('element strain');
: c* @* S* L1 B3 C" H disp(Strain);
2 C9 {% ` p3 J( ~' G case '3'
! v5 d( I# A5 Q+ X/ O disp('element stress');
# u4 m: J! u7 S" s; _ disp(Stress);
) p2 s) D& }9 W$ R& q4 M5 H4 \ case 'q'
2 A" y: k% Z) ^0 O+ `! D* Q* v disp('End of program');# V/ L" `2 ^. V# E: a
break;
7 h( H/ k( O8 @4 v9 y. g1 S otherwise" P* [$ ]1 D/ d5 ^! ?% ]( s
disp('error!Please input again');
& x3 r; Q s. |' q9 E continue;
; w; V8 F0 j) {9 J0 @ end) P/ x2 y' p. _6 s1 N
end0 F) _% g5 S, u/ ~& j0 O' k! X
- p; b8 G7 q+ W0 ]8 ~7 z
7 N* M! h; `7 c |
|