|
這是關于梁單元的,可能大家覺得很簡單。。。
0 |5 T8 S* b1 I. M- ?2 |' i今天翻電腦里的東西時發現的,是我大三時有限元時的作業,記得當時花了很多時間研究,學了不少東西,一個簡單的作業可以涉及各方面的知識。
" @* h+ w9 p& s畢業半年了,雖然記不清彈性矩陣、剛度矩陣等,但是只要一看書(好像現在的心境不下來)應該會,學校交的學習方法和理解問題的能力,有些東西不必記,除非每天從事,那該叫熟能生巧。/ Z+ l! X7 Z4 e0 {' L
記得當時編了兩個程序,梁和三維實體的,我分享一下梁的程序吧,起碼有亮點和創意,可以自己選擇劃分個數,在matlab方面花了不少功夫。( L0 l* }# ? L) y1 t9 y2 F- c
非常感謝當時的有限元授課老師“韓清凱”,雖然老師已經到了大工。上課的教材為韓清凱 的《彈性力學及有限元法基礎教程》,書上有個梁單元的例子,在82頁。
6 L+ B- _3 h, ]( T3 A--------------------------------------------------------------------------------* J, X3 ~) ~+ X, M( ?
梁程序如下,名字就不寫了,用昵稱吧“太平島”,這是常用的網絡昵稱& C v+ X% v4 j1 |/ t; m8 X
Q. |- N) V r7 i
: z9 j% ^; @2 m+ S8 a1 B%------------------------ BEAM2 ----------------
( j* h: q5 l, u9 [3 ~& Gdisp('========================================');
& q& Y4 t. D# A# Odisp(' PROGRAM BEAM2 ');4 b9 `4 S4 a2 `, O0 @( L
disp(' Beam Bending Analysis ');- M% I7 n* S; t4 ?
disp(' The programmer:太平島 ');" @2 o. ^ Q n! W
disp('========================================');* H0 @/ c5 D1 b- @
disp(' '); %輸出空行
# k. H: a& S; d& w8 Iwarning off all %關閉所有警告提示(求積分時,警告信息比較多). P4 v7 m8 k2 L9 k% ^
Ne=input('Please input the number of elements:'); %Ne為劃分的單元數
+ H9 K- D0 }% L* m8 S. C1 pNJ=Ne+1; %NJ為節點數
' `, z2 _9 Q7 Qx1=0;
5 f3 R8 F' u4 \+ a. h# f/ |7 Fx2=sym('L');
5 c% U* _% x4 g& a- c2 w9 gx=sym('x');
' `* d9 Q% ]8 n4 A. yj=0:3;
4 D8 S! j+ ?0 s1 Rv=x.^j;
. g: V, g* M9 _+ }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]; a) E6 e. q/ v7 S+ o, B
N=v*inv(A); %形函數4 e2 n7 ?0 [4 Z' @5 Y" A
%-----------------------------------------------
* X1 h# W& I6 p4 e% 求單元剛度矩陣1 p& \9 q% [: f2 n( C
E=4.0e11;/ M+ q- x% U1 Q) m: v) n8 y, K
I=5.2e-7; %I=bh^3/12=5.2e-7;
: E9 \. O s- p5 W5 ?1 mEI=4.0e11*5.2e-7;
$ K7 a2 Q' B' y$ i, a6 U6 r* I" QB=diff(N,2);) [. }+ B. z# Y- ]' F( g
k=B'*B;1 P! h' ?' Y, l$ D1 x
Kee=EI*int(k,x,0,'L');7 ?$ ?1 H5 b, |& \9 b! y
Ke=sym(zeros(4,4,Ne)); %用三維矩陣存放單元剛度矩陣,每頁存一個,并初始化0
; Z) W% X, Z* u; I& PKe(:,:,1)=subs(Kee,'L',(10/Ne));- v9 E. i+ d9 j) n5 x
T=eye(4); % 因為梁于x軸的夾角為0,所以坐標變換矩陣為T=eye(4)
% a1 h7 b0 h! v1 zKe(:,:,1)=T*Ke(:,:,1)*T';
$ F1 o$ j- I+ D' z/ wfor ii=2:Ne' e4 I) Y' S; s
Ke(:,:,ii)=Ke(:,:,1);
5 U" b) t0 R8 C+ Y Z+ X# kend * \% I8 B$ v7 V% H
Ke=double(Ke);, Z3 N. y8 `5 W% U( ]: [, s4 z% o
%------------------------------------------------9 S/ T6 k6 \; t3 J3 L
% 由矩陣裝換法求整體剛度矩陣, ]* B0 D1 ]* ~
% 自由度Ndof=2*NJ
9 T) Y1 |$ `0 |6 R D' c' lNdof=2*NJ; l$ @+ v1 @9 j2 p
K=zeros(Ndof);( T% U& d' Z" ~* f, m* A! `
for ii=1:Ne
; V( X7 o2 @2 |" @ G=[zeros(4,2*(ii-1)),eye(4,Ndof-2*(ii-1))];. c& K# G: `- s' ~- T1 a0 L
KK=G'*Ke(:,:,Ne)*G;
3 Z, ]+ }: B: s! k+ I k, v K=K+KK;& j1 n6 }0 t+ K
end z6 o: R1 S: l# g% c. e0 u! x, H
%------------------------------------------------
8 ~: D* ^' e' \% 約束條件,對整體剛度矩陣進行修正,以便計算4 {$ Y: ]0 h' r: q. |1 J1 ~
F=zeros(Ndof,1);
" r3 q- q0 H/ |$ a- h' lF(Ndof-1)=-100;% f3 V( w4 O4 D; \( ~
% u=F*inv(K),u=[v1,xta1,v2,xta2,v3,xta3,v4,xta4]',v1=0,xta1=08 @! ]* T# ~# T0 G3 V
K(1, =0; K(:,1)=0; %可以省略
' c7 V7 }7 P. L0 i( f1 iK(2, =0; K(:,2)=0; %可以省略
$ p+ R; C/ }" KKX=K(3:Ndof,3:Ndof);% g! t* ^) H( c4 \& E; f
FX=F(3:Ndof,1);
" n+ V0 i6 N. x# b7 {0 F%------------------------------------------------7 m. Q$ H ?+ A C
%求整體節點位移列陣
1 J, t: c! z5 B$ muu=inv(KX)*FX;
7 B, S! n% h1 {4 D6 v* W5 \u=[0;0;uu];" o; U4 c( c3 g4 L
ii=1:2:2*NJ;' X: K# a; }; i
v=u(ii); %各節點撓度3 T, x+ t4 [. u6 C' a9 N" o" r
xta=u(ii+1); %各節點轉角3 t( r: O) O s- z1 V7 I
%------------------------------------------------
" y/ H$ V- Z+ R7 T0 U% 后處理,計算單元應變應力+ \" J: f6 b1 `9 e6 k/ O( |; d
B=subs(B,x,'L');
3 @# x, Y* i' r( _4 z' ?B=subs(B,'L',10/Ne);
- q4 K1 v7 X( ZStrain=zeros(1,Ne); %單元應變,并初始化
$ N7 U3 V$ H, v# N$ L9 UStress=zeros(1,Ne); %單元應力,并初始化
4 `3 p, I# q# Kfor ii=1:Ne1 {' G3 M6 `" }
Strain(1,ii)=B*u(2*ii-1:2*ii+2,1);: [' x" d3 d' U; V) x
Stress(1,ii)=E*Strain(1,ii);+ [& L- U3 t$ R1 b: }
end
' l$ N& a% R% W1 u: J1 r% w5 ~%--------------------------------------------------
, P- i1 M) w! f, }4 [6 |9 O% 以下程序為屏幕輸出處理0 l p7 v( U, g( Q* {6 y8 {
disp(' ');8 h& W( ?0 D j9 P5 t
disp(' Input:1-print Node displacement ');
# S$ l6 I: ]. A$ Bdisp(' Input:2-print strain ');
+ i# R. [- }2 N; Adisp(' Input:3-print stress ');9 u+ y* I0 _; N1 C' Z0 C7 o: D
disp(' Input:q-quit or use ''ctrl+c'' Shortcut to end the program');
9 @( q; Z$ O( D% h# _, N; ^$ R3 S( ?; q) {7 X' I1 l" _
while 1 h" h% Y- y6 p3 {# a; |, Q
ii=input('Please input1 or 2 or 3:','s');
3 v+ ]2 S; W5 S$ ? switch(ii)
" V+ Z5 `+ D/ p, b. ?4 u case '1') E, [+ R/ R: q0 N x5 I# A
disp('Node displacement'); o: P0 u7 O7 U! E
disp(u');
) F r @3 x& }, i8 ]$ ] case '2', E: _! ^6 C% q
disp('element strain');
- H9 a- m* |( p- g% G) {, `% n disp(Strain);
% O2 B2 O3 h# _' r. i/ F- G case '3'! X# w0 ~2 X, m8 C
disp('element stress');; Y# F- Q, j3 X" G
disp(Stress);# m- u6 ^% c4 }: T
case 'q'6 K* Y- T& _( i1 O1 N
disp('End of program');7 j0 _. C# X C* u
break;
) J4 s6 W b) Y! x/ g& c1 c: F otherwise
l8 `3 _7 a& t) W& F disp('error!Please input again');( S; S% s2 L* R6 [5 l c8 p% c
continue;
# `0 y' F9 n, R4 O end9 V, Q: O( i+ B" b& c- {
end
8 [: s# B/ D% m9 U
! R; a8 G' B, ^& t+ O" e' N _/ z5 K2 z
|
|