Elementi finiti: esempio in MATLab
®Giovanni Miano
Corso di Modelli Numerici per i Campi
Problema
Ω
∂Ω
∇
2u = f P ( )
u
∂Ω= g
⎧
⎨ ⎪
⎩⎪
% Matrice p: matrice dei nodi della mesh [2xNp], dove Np è il numero dei nodi della mesh (interni + quelli di fron>era). La prima riga con>ene le ascisse dei nodi, la seconda le ordinate. I nodi sono numera> in base all’indice di colonna.
% Matrice p: matrice dei nodi della mesh [2xNp], dove Np è il numero dei nodi della mesh (interni + quelli di fron>era). La prima riga con>ene le ascisse dei nodi, la seconda le ordinate. I nodi sono numera> in base all’indice di colonna.
% Matrice e: matrice del contorno della mesh [7xNe], dove Ne è il numero di nodi di fron>era. La prima e la seconda riga contengono gli indici dei nodi iniziali e finali dei la> di fron>era; la terza e la quarta riga contengono i valori iniziali e finali di un parametro non rilevante ai fini della nostra traKazione; la quinta riga con>ene il numero che iden>fica il lato di fron>era, la sesta e la seLma contengono i numeri che iden>ficano i soKodomini a destra e a sinistra del lato di fron>era.
1
2
…
N
e% Matrice e: matrice del contorno della mesh [7xNe], dove Ne è il numero di nodi di fron>era. La prima e la seconda riga contengono gli indici dei nodi iniziali e finali dei la> di fron>era; la terza e la quarta riga contengono i valori iniziali e finali di un parametro non rilevante ai fini della nostra traKazione; la quinta riga con>ene il numero che iden>fica il lato di fron>era, la sesta e la seLma contengono i numeri che iden>ficano i soKodomini a destra e a sinistra del lato di fron>era.
% Matrice t: matrice dei triangoli della mesh [4xNt], dove Nt è il numero di triangoli. La colonna r-‐ma corrisponde al r-‐mo triangolo e con>ene la terna an>oraria degli indici dei suoi ver>ci i, j, k. Il valore nella quarta riga è il numero che idenfica il soKodominio al quale appar>ene il triangolo. E’ u>le per problemi con parametri costan> a traL (ad esempio dieleKrici con diverse permiLvità, ecc.).
T
nV
( )iV
( )jV
( )k% Matrice t: matrice dei triangoli della mesh [4xNt], dove Nt è il numero di triangoli. La colonna r-‐ma corrisponde al r-‐mo triangolo e con>ene la terna an>oraria degli indici dei suoi ver>ci i, j, k. Il valore nella quarta riga è il numero che idenfica il soKodominio al quale appar>ene il triangolo. E’ u>le per problemi con parametri costan> a traL (ad esempio dieleKrici con diverse permiLvità, ecc.).
% Dimensioni delle matrici t, p, e Np=size(p,2); % numero di nodi
Ne=size(e,2); % numero di nodi di fron>era Nt=size(t,2); % numero di triangoli della mesh
% Dichiarazione delle matrici K, F, U, FR K=sparse(Np,Np); % matrice di s>ffness F=zeros(Np,1); % termine noto
U=zeros(Np,1); % veKore delle incognite nodali Fr=e(1,:); % indici dei nodi di fron>era
% Condizione al contorno
U(Fr)=g_fun(p(1,Fr),p(2,Fr)); % impone U = g sulla fron>era del dominio.
% Assemblaggio matrice di s>ffness e termine noto “f”
for n=1:Nt
% indici dei nodi del triangolo n-‐mo ni=t(1,n);
nj=t(2,n);
nk=t(3,n);
% coordinate dei ver>ci del triangolo n-‐mo xi=p(1,ni);
yi=p(2,ni);
xj=p(1,nj);
yj=p(2,nj);
xk=p(1,nk);
yk=p(2,nk);
y
x T
nV
( )iV
( )jV
( )kr
Area ( ) T
n= 1 2 det D ( )
nElemento
D
n=
1 x
( )iy
( )i1 x
( )jy
( )j1 x
( )ky
( )kl
n( )r( ) r = a
n( )r
x + b
n( )ry + c
n( )ra
n( )r= 1
2A ( ) T
n( y( )s − y
( )t ) bn( )r = − 2A 1 T
= − 2A 1 T
( )
n( x( )s − x
( )t )
c
n( )r= 1
2A ( ) T
n( x( )s y
( )t − x
( )t y
( )s )
r = i, j,k s = j,k,i t = k,i, j Polinomi Lagrangiani di Grado 1
y
x T
nV
( )iV
( )jV
( )kr
D=[1 xi yi; 1 xj yj; 1 xk yk];
A=det(D)/2; % area del triangolo n-‐mo ai=(yj-‐yk)/A/2;
bi=-‐(xj-‐xk)/A/2;
aj=(yk-‐yi)/A/2;
bj=-‐(xk-‐xi)/A/2;
ak=(yi-‐yj)/A/2;
bk=-‐(xi-‐xj)/A/2;
A
ii= A
ii+ ∇ϕ
i 2dS
Tn
∫
Contributo del triangolo T
nalla matrice di stiffness
T
nV
( )iV
( )jV
( )kϕ
i Tn= a
n( )ix + b
n( )iy + c
n( )i∇ϕ
i Tn= a
n( )iˆx + b
n( )iˆy Contributo del triangolo T
nalla matrice di stiffness
T
nV
( )iV
( )jV
( )kA
ii= A
ii+ ∇ϕ
i 2dS
Tn
∫
∇ϕ
i Tn 2= a ( )n( )i 2 + b ( )n( )i 2
ϕ
i Tn= a
n( )ix + b
n( )iy + c
n( )i∇ϕ
i Tn= a
n( )iˆx + b
n( )iˆy Contributo del triangolo T
nalla matrice di stiffness
T
nV
( )iV
( )jV
( )kA
ii= A
ii+ ∇ϕ
i 2dS
Tn
∫
∇ϕ
i Tn 2= a ( )n( )i 2 + b ( )n( )i 2
ϕ
i Tn= a
n( )ix + b
n( )iy + c
n( )i∇ϕ
i Tn= a
n( )iˆx + b
n( )iˆy
∇ϕ
i 2dS
Tn
∫ = a ⎡⎣
n( )i 2+ b
n( )i 2⎤⎦A T ( )
nContributo del triangolo T
nalla matrice di stiffness
T
nV
( )iV
( )jV
( )kA
ii= A
ii+ ∇ϕ
i 2dS
Tn
∫
∇ϕ
i Tn 2= a ( )n( )i 2 + b ( )n( )i 2
ϕ
i Tn= a
n( )ix + b
n( )iy + c
n( )i∇ϕ
i Tn= a
n( )iˆx + b
n( )iˆy
A
ii= A
ii+ a ⎡⎣
n( )i 2+ b
n( )i 2⎤⎦A T ( )
nContributo del triangolo T
nalla matrice di stiffness
T
nV
( )iV
( )jV
( )kA
ii= A
ii+ ∇ϕ
i 2dS
Tn
∫
% contribu> del triangolo n-‐mo alla matrice di s"ffness K(ni,ni) = K(ni,ni) + (ai*ai+bi*bi)*A;
K(nj,nj) = K(nj,nj) + (aj*aj+bj*bj)*A;
K(nk,nk) = K(nk,nk) + (ak*ak+bk*bk)*A;
Contributo del triangolo T
nalla matrice di stiffness
T
nV
( )iV
( )jV
( )kA
ji= A
ji+ ∇ϕ
j⋅∇ϕ
idS
Tn
∫
Contributo del triangolo T
nalla matrice di stiffness
T
nV
( )iV
( )jV
( )kA
ji= A
ji+ ∇ϕ
j⋅∇ϕ
idS
Tn
∫
ϕ
i Tn= a
n( )ix + b
n( )iy + c
n( )iϕ
j Tn= a
n( )jx + b
n( )jy + c
n( )j∇ϕ
j⋅∇ϕ
i= a
n( )ja
n( )i+ b
n( )jb
n( )iContributo del triangolo T
nalla matrice di stiffness
T
nV
( )iV
( )jV
( )kA
ji= A
ji+ ∇ϕ
j⋅∇ϕ
idS
Tn
∫
ϕ
i Tn= a
n( )ix + b
n( )iy + c
n( )iϕ
j Tn= a
n( )jx + b
n( )jy + c
n( )jϕ
i Tn= a
n( )ix + b
n( )iy + c
n( )iA
ji= A
ji+ a ⎡⎣
n( )ja
n( )i+ b
n( )jb
n( )i⎤⎦A T ( )
nContributo del triangolo T
nalla matrice di stiffness
T
nV
( )iV
( )jV
( )kA
ji= A
ji+ ∇ϕ
j⋅∇ϕ
idS
Tn
∫
∇ϕ
j⋅∇ϕ
i= a
n( )ja
n( )i+ b
n( )jb
n( )iϕ
j Tn= a
n( )jx + b
n( )jy + c
n( )j% contribu> del triangolo alla matrice di s"ffness K(ni,ni) = K(ni,ni) + A*(ai*ai+bi*bi);
K(nj,nj) = K(nj,nj) + A*(aj*aj+bj*bj);
K(nk,nk) = K(nk,nk) + A*(ak*ak+bk*bk);
K(ni,nj) = K(ni,nj) + A*(ai*aj+ai*aj);
K(ni,nj) = K(ni,nj) + (ai*aj+bi*bj)*A;
K(nj,ni) = K(ni,nj);
K(ni,nk) = K(ni,nk) + (ai*ak+bi*bk)*A;
K(nk,ni) = K(ni,nk);
K(nj,nk) = K(nj,nk) + (aj*ak+bj*bk)*A;
K(nk,nj) = K(nj,nk);
Contributo del triangolo T
nalla matrice di stiffness
T
nV
( )iV
( )jV
( )kF
i= F
i+
Tϕ
i( ) r f r ( ) dS
∫
nϕ
i( ) r ⋅ f r ( ) dS
Tn
∫ ≅ ϕ
i( ) r
bnf r ( )
bnA ( ) T
nϕ
i( ) r
bn= 1 3
Contributo del triangolo T
nalla matrice di stiffness
T
nV
( )iV
( )jV
( )kF
i= F
i+
Tϕ
i( ) r f r ( ) dS
∫
nϕ
i( ) r
bn= 1 3
F
i≅ F
i+ 1
3 ˆf r ( )
bnA ( ) T
nContributo del triangolo T
nalla matrice di stiffness
T
nV
( )iV
( )jV
( )kF
i= F
i+
Tϕ
i( ) r f r ( ) dS
∫
nϕ
i( ) r ⋅ f r ( ) dS
Tn
∫ ≅ ϕ
i( ) r
bnf r ( )
bnA ( ) T
n% contribu> del triangolo al termine noto
% coordinate del baricentro del triangolo n-‐mo xc = (xi+xj+xk)/3; yc=(yi+yj+yk)/3;
F([ni nj nk]) = F([ni nj nk])+f_fun(xc,yc)*A/3; % assemblaggio termine noto end % “end ciclo for sui triangoli”
% Contributo fron>era for h=1:Np % ciclo sui nodi
F=F + K(1:Np,h)*U(h); % completo termine noto
if any(h==e(1,1:Ne)) % se il nodo "h" è di fron>era allora K(h,1:Np)=zeros(1,Np); % azzero riga h-‐ma di K
K(1:Np,h)=zeros(Np,1); % azzero la colonna h-‐ma di K end
end
Matrice K
Ni numero dei nodi interni; Ne numero dei nodi di fron>era;
Np = Ni + Ne numero totale di nodi.
K = A A
∂A
∂TA
∂∂Np righe
Np colonne Ne
( ) A
ij= ∇ϕ
i, ∇ϕ
ji, j = 1,2,..., N
iA
∂∂( )
mn= ∇ϕ
m, ∇ϕ
nm,n = 1,2,..., N
eNi
A
∂( )
in= ∇ϕ
i, ∇ϕ
ni = 1,2,..., N
in = 1,2,...N
eMatrice K
Ni numero dei nodi interni; Ne numero dei nodi di fron>era;
Np = Ni + Ne numero totale di nodi.
K = A A
∂A
∂TA
∂∂ Ne righe corrisponden>ai nodi di fron>era
Ne colonne corrisponden>
ai nodi di fron>era
Matrice K, termine noto F
Ni numero dei nodi interni; Ne numero dei nodi di fron>era;
Np = Ni + Ne numero totale di nodi.
K = A A
∂A
∂TA
∂∂F = F
iF
∂K1 = sparse(Np-‐Ne,Np); % matrice di s>ffness ausiliaria ridoKa A = sparse(Np-‐Ne,Np-‐Ne); % matrice di s>ffness ridoKa
FI = zeros(Np-‐Ne,1); % termine noto ridoKo ai soli pun> interni
w=1;
for h=1:Np % ciclo di eliminazione righe di K corrisponden> ai nodi di fron>era if K(h,h)~=0
K1(w,1:Np)=K(h,1:Np);
FI(w)=F(h);
w=w+1;
end end
w=1;
for h=1:Np % ciclo di eliminazione colonne di K corrisponden> ai nodi di fron>era if K(h,h)~=0
A(1:Np-‐Ne,w) = K1(1:Np-‐Ne,h);
w=w+1;
end end
UI=A\-‐FI; % soluzione del problema ridoKo
w=1;
for h=1:Np % ricostruzione dell'incognita su tuL i nodi if not(any(h==e(1,1:Ne)))
U(h)=UI(w);
w=w+1;
end end
pdeplot(p,e,t,'xydata',U,'contour','on'); % plot della soluzione
A A
∂0 I
U
iU
e= − F
i−G
eUn modo diverso di imporre le condizioni al contorno
K U F
I
e’ la matrice iden>tà Ne x Ne.e’ il veKore dei campioni della funzione g (condizione al contorno) nei nodi del contorno.
G
e% Contributo fron>era
K(Fr,1:Np)=0; % implementazione delle condizioni al contorno >po Dirichlet
% nel nodo h-‐mo di fron>era l’equazione è U(h)=g(h) for h=1:Ne
K(Fr(h),Fr(h))=1;
end
F(Fr)=-‐U(Fr);
Un modo diverso di imporre le condizioni al contorno
% Soluzione del sistema lineare U=K\-‐F;
% plot della soluzione
pdeplot(p,e,t,'xydata',U,'contour','on');