Projekt Finit Element-lösare Emil Johansson, Simon Pedersen, Janni Sundén 29 september 2 Chalmers Tekniska Högskola Institutionen för Matematik TMA682 Tillämpad Matematik
Inledning Många naturliga fenomen kan modelleras med differentialekvationer. Ofta är dessa mycket svåra eller omöjliga att lösa analytiskt, varför olika approximativa lösningsmetoder används. En av dessa är Finita element-metoden (FEM). Denna rapport behandlar ett projekt beståe av kodning av en FEM-lösare i MatLab samt användandet av denna på två välkända randvärdesproblem, diffusions-reaktionsekvationen och diffusionskonvektionsekvationen. Den erhållna approximativa lösningen jämförs med en analytisk lösning av problemet. 2 Teori 2. Finita element-metoden Differentialekvationens lösning kan approximeras med en styckvis linjär, kontinuerlig, funktion. Detta kallas kontinuerlig Galerkin av grad, cg(). Då denna approximativa lösning är (styckvis) linjär kan den beskrivas som en linjärkombination av styckvis linjära basfunktioner, så kallade hattfunktioner. Att ast behöva undersöka dessa basfunktioner är grunden i lösningsmetoden. Som exempel har vi här behandlat diffusionsreaktionsekvationen, men proceduren är liknande för andra randvärdesproblem. { u (x) + u(x) =, < x < π u (DE) () () =, u(π) = För att problemet ska kunna behandlas, konverterar vi differentialekvationen till motsvarande variationsformulering genom att multiplicera (DE) med en testfunktion v(x) och integrera över det relevanta intervallet. För vårt exempelproblem (ekv. ) blir denna: Finn en funktion u(x) V sådan att: ( u (x) + u(x))v(x) dx = v(x) V := H (,π) := {w : ()v(x) dx ( w(x) 2 + w (x) 2) dx <, w(π) = } Via partiell integration erhåller vi följande förenklade formel: (VF) (2) [ ] x=π u (x)v(x) + u(x)v(x) + u (x)v (x) dx + u(x)v (x) dx = v(x) dx x= v(x) V (3) Insättning av randdata lämnar ast kvar integralerna, då v(pi) = och u () =. u (x)v (x) dx + u(x)v (x) dx = v(x) dx, v(x) V (4) Testrummet V är alltså alla funktioner som är begränsade och har begränsade derivator, samt uppfyller randvillkoren för (DE). Detta testrum är oändligt dimensionellt och testfunktionerna är oändliga till antalet. För att hitta en approximativ lösning behöver vi inskränka oss till ett ändligt dimensionellt rum. Detta är själva finita element-metoden.
Låt T h : = x < x < < x i < x i+ < < x N = π vara en likformig partition av det relevanta intervallet med delintervallängden h. Finn en approximativ lösning U(x) V h sådan att: U (x)v (x) dx + U(x)v (x) dx = v(x) dx, v(x) V h := {w : w är styckvis linjär på T h och kontinuerlig, w(π) = } (5) Den approximativa lösningen sammanbinder nodpunkterna (x, x i osv) med styckvis linjära segment. Vi tillåter härmed vår funktion att avvika från den analytiska lösningen så länge den är lika i nodpunkterna. Eftersom U(x) är styckvis linjär kan den skrivas som en summa av styckvis linjära basfunktioner {ϕ j (x)} N j= med koefficienterna ξ,..., ξ N. U(x) = N ξ j ϕ j (x) = U (x) = j= Insättning i (5) ger oss följande: N ξ j ϕ j(x) (6) j= N j= ξ j ϕ j(x)v (x) dx + ξ j ϕ j (x)v (x) dx = v(x) dx, v(x) V h (7) Vi väljer nu testfunktionerna som hattfunktionerna ϕ (x),...,ϕ (N ) (x). Eftersom ingen homogen dirichletdata finns i intervallets startpunkt krävs också en halv hattfunktion som bas i x. Vårt problem är nu formulerat som följande: N [ ( j= ) ( ϕ j(x)ϕ π ] i(x) dx ξ j + ϕ j (x)ϕ i(x) dx )ξ j = ϕ i (x) dx, Ekvationen kan nu skrivas om på matrisform. Vi får följande samband: S = { s ij } N i,j=, s ij = M = { } N m ij i,j=, m ij = ξ ξ 2 ξ =. ξ N b b N b 2 b =. b i = ϕ j(x)ϕ i(x) dx ϕ j (x)ϕ i(x) dx ϕ i (x) dx i =, 2,..., N Om differentialekvationen hade innehållit en term av första ordningen, hade en konvektionsmatris uppstått vars element är beroe av ϕ j(x)ϕ i (x) dx. Med hjälp av resonemang kring hattfunktionernas stöd och överlapp kommer vi fram till sambandet att (8) (9) 2
s ij = h, i = j = m ij = 2h 6, i = j = s ij = 2 h, i = j > s ij =, i j = h s ij =, i j > m ij = 4h 6, i = j > m ij =, i j = h m ij =, i j > Det vill säga, matriserna S och M får följande utsee: 2 S = 2.. h......... M = h 4.. 6.............. 2... 4 2 4 Eventuell konvektionsmatris är antisymmetrisk och har nollor på huvuddiagonalen. Den ser ut som följande (notera avsaknandet av h-beroe): K =.. 2......... (2).... Styvhets- och massmatriserna är i allt väsentligt lika för alla problem, ast avvikande i elementen (,) och (N,N) om randvillkoret i första respektive sista punkten är nollskilda. Då konvektionsmatrisens huvuddiagonal ast innehåller nollor påverkas den inte av eventuella halvhattfunktioner. De tre matriserna skalas också efter längden på varje delintervall (h) och koefficienterna framför u (x), u (x) och u(x), vilket enkelt ses i variationsformuleringen för problemet i fråga. Med liknande resonemang fås elementen i lastvektorn b. Arean under varje hattfunktion är en triangel med höjden och basen 2h. Integralen ϕ i(x) dx motsvarar denna area och evalueras därför till h, utom i x där vi har en halv hattfunktion, varför basen blir h och integralens värde därför halveras. Lastvektorn ser alltså ut som följande: 2 b = h. Att finna den approximativa lösningen till vårt randvärdesproblem innebär nu att lösa matrisekvationen (S + M)ξ = b. 2.2 Finit element-lösare i MatLab MatLab-koden grundar sig på den inbyggda funktionen för lösning av matrisekvationer av typen Ax = b. Styvhets-, mass- och konvektionsmatriserna byggs upp genom iteration () () (3) 3
och korrigeras för halvhattfunktioner där randvillkoren är nollskilda. Detsamma gäller lastvektorn b. De olika matriserna summeras sedan, och ekvationen (S + M + K)ξ = b löses med MatLabs backslash-operator. Koden i sin helhet finns i bilaga A. Randvärdesproblemen som löses är diffusions-reaktionsekvationen { u (x) + u(x) =, < x < π u (4) () =, u(π) = och diffusions-konvektionsekvationen εu (x) + 2 u (x) =, u() = u(π) = < x < π där ε är en liten, konstant, godtycklig parameter, i koden satt som ε = 3. (5) Figur : Diffusions-reaktionsekvationens analytiska lösning samt cg()-lösning med antalet delintervall N = 4 respektive N = 3. Notera approximationens närhet till den analytiska lösningen redan vid låga värden på N. Approximationen är fixerad vid y = i x = π för att svara mot dirichletdatan. 4
Figur 2: Diffusions-konvektionsekvationens analytiska lösning samt cg()-lösning med antalet delintervall N = 4 respektive N = 3. Notera att den approximativa lösningen här är fixerad i bägge ändpunkterna, vilket svarar mot dirichlet-randvillkoren. A Bilaga: MatLab-kod A. Diffusions-reaktionsekvationen %% D i f f u s i o n s r e a k t i o n s e k v a t i o n e n clc ; c l f ; a = ; % I n t e r v a l l e t : c = pi ; % < x < p i N = 3 ; % Antal d e l i n t e r v a l l = N+ ( Detta ger b ä t t r e approximation ) h = ( c a ) / (N) ; % D e l i n t e r v a l l ä n g d e n x = linspace ( a, c, N+); % Nodpunkter % A n a l y t i s k l ö s n i n g u = @( x ) ( exp( pi x) exp( pi+x)++exp(2 pi ))./(+exp(2 pi ) ) ; fplot (u, [ a c ], k ) ; hold on ; b = ones (N, ) ; % L a s t v e k t o r n % S t y v h e t s m a t r i s S = zeros (N,N) ; for i = :N for j = :N i f ( i==j ) % Phi prim ö v e r l a p p a r h e l t S ( i, j ) = 2 ; e l s e i f ( abs ( i j ) == ) % Halvt ö v e r l a p p S ( i, j ) = ; 5
S (, ) = ; % H a l v h a t t S=/h S ; på x x % Massmatris M = zeros (N,N) ; for i = :N for j = :N i f ( i==j ) % Som ovan f a s t Phi M( i, j ) = 4 ; e l s e i f ( abs ( i j ) == ) %... M( i, j ) = ; M(, ) = 2 ; % H a l v h a t t på x x M=h/6 M; b ( ) = /2; % H a l v h a t t! b = h b ; x i = ( S+M)\ b ; % Lös A x i = b U = zeros (N+, ) ; % Korrigera f ö r randdata U( p i ) = U( :N) = x i ; plot ( x, U, r. ) ; xlabel ( x ) ; ylabel ( y ) ; leg ( y = u ( x ), y = U( x ) ) ; A.2 Diffusions-konvektionsekvationen %% D i f f u s i o n s k o n v e k t i o n s e k v a t i o n e n clc ; c l f ; a = ; % I n t e r v a l l e t : c = pi ; % < x < p i N = 3 ; % Antal d e l i n t e r v a l l = N+ ( Detta ger b ä t t r e approximation ) h = ( c a ) / (N+); % D e l i n t e r v a l l ä n g d e n x = linspace ( a, c, N+2); % Nodpunkter e = 3 ; % G o d t y c k l i g t, l i t e t, e p s i l o n b = ones (N, ) ; % A n a l y t i s k l ö s n i n g u = @( x ) 2 ((exp( pi /(2 e )) ) x pi exp( x /(2 e ))+ pi ) / ( exp( pi /(2 e ) ) ) ; fplot (u, [ a c ], k ) ; 6
hold on ; % S t y v h e t s m a t r i s S = zeros (N,N) ; for i = :N for j = :N i f ( i==j ) % Som ovan S ( i, j ) = 2 ; e l s e i f ( abs ( i j ) == ) % Som ovan S ( i, j ) = ; S=e /h S ; % Ta hänsyn t i l l e p s i l o n % Konvektionsmatris C = zeros (N,N) ; for i = :N for j = :N i f ( ( i j ) == ) % Under diagonalen ( rad > kolonn ) C( i, j ) = ; e l s e i f ( ( j i ) == ) % Över diagonalen ( rad < kolonn ) C( i, j ) = ; C=/2 /2 C; % Glöm i n t e k o e f f i c i e n t e n framför u ( x )! b ( ) = ; % Inga b (N) = ; %... b = h b ; x i = ( S+C)\ b ; h a l v h a t t a r U = zeros (N+2, ) ; % Korrigera f ö r randdata U() = U( p i ) = U( 2 :N+) = x i ; plot ( [ x ], U, r. ) ; xlabel ( x ) ; ylabel ( y ) ; leg ( y = u ( x ), y = U( x ) ) ; 7