NUMPROG, 2D1212, vt 2005 Föreläsning 9, Numme-delen Stabilitet vid numerisk behandling av diffekvationer Linjära och icke-linjära ekvationssystem Då steglängden h är tillräckligt liten erhålles en noggrann numerisk lösning. Hur liten h måste vara beror på vilken ordning p metoden är av. För Eulers metod är ordningen p =1vilken kräver liten steglängd. För Runge-Kuttas metod är ordningen p =4, varvid större steg kan tas. Vad händer då om steglängden blir stor? Här visar det sig att det beror på metoden om den numeriska lösningen blir stabil eller instabil, dvs om lösningen blir begränsad eller om den växer obegränsat. Exempel. Eulers framåtmetod tillämpad på den enkla differentialekvationen dx = x, x(0) = 1, x(t) =e t dt Följande graf visar den exakta lösningen tillsammans med den numeriska lösningen för 2 olika steglängder, nämligen h =0.5 och h =2.5 2.5 Eulers framaatmetod, stsbilitet med avseende paa steget h 2 1.5 1 x 0.5 exakt loesning 0 h=0.5 0.5 1 h=2.5 1.5 0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 t 1
För h =2.5 blir lösningen instabil, i detta fall oscillerande med växande amplitud. För h =0.5 är lösningen stabil och ger hyfsad noggrannhet. För denna enkla differentialekvation går det att beräkna exakt för vilket värde på h som lösningen blir instabil. Eulers framåtmetod ger nämligen rekursionsformeln x k+1 = x k hx k =(1 h)x k =(1 h) 2 x k 1 =...(1 h) k+1 x 0 Vi ser att talföljden x k är stabil (begränsad) om 1 h 1 0 h 2 Lösningen blir alltså instabil om h>2 Om Eulers bakåtmetod används ser grafen ut på följande sätt 1 Eulers bakaatmetod, stabilitet med avseende paa steget h 0.9 0.8 0.7 0.6 h=2.5 x 0.5 0.4 h=0.5 0.3 0.2 exakt loesning 0.1 0 0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 t Eulers bakåtmetod ger alltså stabila lösningar för bägge steglängderna, även om noggrannheten blir sämre för ökande steglängd. Implicita metoder som Eulers bakåtmetod är nödvändigt att använda för en vanlig typ av system av differentialekvationer som kallas styva. Dessa uppträder i många olika tillämpningar: mekaniska system, kemiska reaktioner, värmeledningsproblem, etc. Om en explicit metod såsom Ringe-Kuttas metod används måste extremt små steglängder användas för att lösningarna ska bli stabila. 2
Linjära ekvationssystem Den vanligaste metoden för lösning av ett linjärt ekvationssystem Ax = b där A är en n n-matris, är Gausselimination. Denna metod presenteras i kursen i Linjär Algebra och tas därför inte upp här. Det är dock viktigt att känna till hur tidskrävande denna metod är vid datorräkning samt vilka möjligheter som finns att göra metoden effektivare när matrisen A har speciell struktur Speciellt viktigt är det att veta hur ett beräkningsprogam som Matlab reagerar då matrisen A är exakt singulär (dvs det(a) =0) eller nästan singulär (dvs kolumnerna är nästan linjärt beroende, men det(a) behöver inte nödvändigtvis vara liten). Nedan ges två exempel på detta. Singulär matris. I nedanstående ekvationssystem är A singulär 1 2 3 1 2 4 6 x = 2 4 8 12 3 Ett Matlabprogram för lösning av systemet A=[1 2 3;2 4 6;4 8 12]; b=[1 2 3] ; x=a\b ger följande resultatutskrift Warning: Matrix is singular to working precision Resultatet blir odefinierat på grund av att det(a) =0 Nästan singulär matris. Ett illa-konditionerat interpolationsproblem Bestäm det tredjegradspolynom y = c 1 x 3 + c 2 x 2 + c 3 x + c 4 som går genom punkterna (1000, 2), (1001, 4), (1002, 5) och (1003, 1). Matlabprogrammet blir x=[1000,1001,1002,1003] ;y=[2,4,5,1] ; A=[x.^3 x.^2 x ones(size(x))];c=a\y Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. Ovanstående varningsutskrift betyder att resultatet inte är att lita på. Orsaken är att avrundningsfelen bestämmer vilket resultat vi får. Exempelvis kan ett mellanresultat som egentligen ska bli noll i stället blir ett mycket litet tal (säg 10 17 ) på grund av avrundningsfelens inverkan, vilket kan ge helt fel slutresultat. 3
Det arbete (den datortid) som krävs för att lösa ett linjärt ekvationssystem med n obekanta växer proportionellt mot n 3.Dettakanviseav följande Matlabexperiment tidres=[];nvalues=[200,400,600,800]; for n=nvalues tid=cputime; A=rand(n,n);b=rand(n,1);x=A\b; tid=cputime-tid;tidres=[tidres tid]; end en loglog-graf över tidsåtgången som funktion av antalet obekanta ger följande (nästan) räta linje, som har lutningen 3. 10 0 Tidsaatgaang foer Gausselimination som funktion av n tid (s) 10 1 10 2 10 2.4 10 2.5 10 2.6 10 2.7 10 2.8 10 2.9 n (antal obekanta) Vi har alltså experimentellt visat att tid = Cn 3 för Gausselimination, dvstidenväxerkubisktmedantaletobekanta.c är en konstant som beror på vilken dator vi använder. Ur detta resultat kan vi uppskatta tidsåtgången. Om det tar 5 ms att lösa ett ekvationssystem med 500 obekanta på en viss dator, hur lång tid tar det då att lösa ett system med 1000 obekanta på samma dator? Svar: 40 ms 4
Om matrisen A inte har någon speciell struktur utan har de flesta elementen a ij 0, kallas den en full matris. En matris där de flesta elementen a ij =0kallas en gles matris. För sådanan matriser kan både lagringen av matrisen i datorns minne och Gausseleminationen göras effektivare, dvs mindre lagringsutrymme och snabbare lösning än O(n 3 ). Exempel på en gles matris är en diagonalmatris D, där endast diagonalelementen d ii 0. d 11 0 0 0... 0 d 22 0 0... D =...... 0 0 d n 1n 1 0... 0 0 0 d nn För att lösa ett linjärt ekvationssystem med en diagonalmatris Dx = b behövs endast n divisioner, dvs arbetet växer linjärt med n, eller tid = C D n där C D är en konstant som beror på vilken dator vi använder. Ett annat exempel på gles matris är den matris A som bildas då ett randvärdesproblem löses med finita differensmetoden (se föreläsning 8): A = 2 1 0 0... 1 2 1 0......... 0 1 2 1... 0 0 1 2 Denna matris kallas tridiagonal och är gles eftersom endast 3n 2 element är 0av de totalt n 2 elementen. Vi kan se denna matris som uppbyggd av 3 vektorer, subdiagonalen är n 1 n 1-vektorn ( 1, 1,..., 1), diagonalen är n n-vektorn (2, 2,...,2) och superdiagonalen är n 1 n 1-vektorn ( 1, 1,..., 1). Ovanstående tridiagonala matris är ett specialfall en godtycklig tridiagonal matris a 1 c 1 0 0... e 2 a 2 c 2 0... A =...... 0 e n 1 a n 1 c n 1... 0 0 e n a n 5
därvianvänt3vektorere,a och c för att representera de 3 diagonalerna. Observera numreringen av elementen; index för ett element anger i vilken rad det står. För en tridiagonal matris behöver endast 3n 2 element lagras i datorminnet(iställetförn 2 om matrisen vore full) och arbetet att lösa ett tridiagonalt ekvationssystem växer linjärt med antalet obekanta, dvs tid = C T n där C T är en konstant som beror på vilken dator vi använder. För lagring av glesa matriser i Matlab används en datastruktur där matrisen A s nollskilda element och dessa elements radindex resp kolumnindex lagras i 3 vektorer av samma längd, nämligen lika med antalet element 0. I denna kurs går vi dock inte in på detaljerna i gles lagring och gles lösning. I Matlab finns en uppsättning funktioner för hantering av glesa matriser. Nedan ges några exempel. A betecknar en matris lagrad på vanligt sätt, dvs alla n 2 element lagras, medan a betcknar en glest lagrad matris. a=sparse(a); A=full(a); lagrar matrisen A som en gles matris lagrar den glest lagrade matrisen a som en full matris spy(a); visar strukturen hos a, element 0visas med * x=a\b; gles Gausselimination (dvs effektiv) av ax=b ett=ones(n,1);a=spdiags([-ett 2*ett -ett],-1:1,n,n); a=sprand(n,n,p); bildar en gles matris av slumptal,p=andelen 0 För fler glesa kommandon, gör help sparse. Newtons metod för system av algebraiska ekvationer Se det kompletterande häftet 6