Beräkningsvetenskap I januari 2016 Laboration: Linjära ekvationssystem Beräkningstid Längre fram i laborationen kommer du att få exempel på frågeställningar som kan besvaras genom att man löser mycket stora lineära ekvationssystem. Sådana ekvationssystem dyker upp i många tillämpningar och det behövs beräkningsvetenskapliga metoder för att lösa ekvationen och därmed besvara den bakomliggande frågeställningen. Kort introduktion 1. Varje linjärt ekvationssystem med n stycken ekvationer och n stycken obekanta kan skrivas på formen Ax = b, där A är en n×n-matris, x är en kolonnvektor av längd n och b är en kolonnvektor av längd n. 2. Ett sådant ekvationssystem kan representeras i datorn genom att man lagrar koefficientmatrisen A och högerledsvektorn b i minnet. I Matlab lagrar vi A som en Matlab-matris A och b som en Matlab-vektor b. Skillnaden mellan A och A är att A är ett matematiskt objekt, medan A är en datastruktur som här används för att lagra det matematiska objektet A. På motsvarande vis är b ett matematiskt objekt och b en datastruktur. 3. För att lösa systemet Ax = b i Matlab och lagra lösningen x i en Matlab-vektor x skriver man kort och gott x = A\b. Att göra sedan du läst introduktionen ovan 1. Ett litet ekvationssystem För att förstå introduktionen ovan ska du börja med att lösa ett litet ekvationssystem i Matlab, nämligen systemet ⎧ 2x1 + 4x2 − 6x3 = −4 ⎪ ⎨ x1 + 5x2 + 3x3 = 10 ⎪ x + 3x + 2x = 5 1 2 3 ⎪⎩ Det kan överföras på formen Ax=b, där ⎛ 2 4 −6 ⎞ ⎛ −4 ⎞ ⎜ ⎟ A= 1 5 3 , b = ⎜ 10 ⎟ ⎜ ⎟ ⎜ ⎟ ⎜⎝ 5 ⎟⎠ ⎜⎝ 1 3 2 ⎟⎠ Beräkna nu i kommandofönstret i Matlab lösningen x. Använd den metod som beskrivs i introduktionen ovan. I Matlab löser man vanligen stora system som är omöjliga att lösa för hand. Du kommer i resten av den här laborationen att arbeta och undersöka lösning av sådana ekvationssystem. Då får beräkningstiden betydelse och det blir viktigt att använda metoder som är effektiva. Beräkningsvetenskap I januari 2016 2. Problemstorlek och beräkningstid Ladda ner Matlab-filen ekvsystest1.m från kurshemsidan. Med programmet ekvsystest1 kan du undersöka hur lång tid det tar för Matlab att lösa ekvationssystem av olika storlek. Den tid som mäts är CPU-tid, det vill säga hur lång tid datorns processor behövde arbeta för att lösa problemet. När du har provat med en problemstorlek kommer du att få möjlighet att fortsätta med en annan problemstorlek. När du har provat de problemstorlekar du önskar, så kommer programmet att rita upp en graf över CPU-tiden som funktion av problemstorleken. Du ska nu köra programmet ekvsystest1. Börja t ex med problemstorleken 1000 ekvationer och öka sedan problemstorleken med 500 ekvationer åt gången, tills beräkningstiden överstiger 30 sekunder. Observera att - programmet inte skriver ut lösningarna till de olika ekvationssystemen, eftersom det bara är beräkningstiden vi är intresserade av i det här experimentet. - Du behöver inte öppna programmet i Matlabs editor, utan det räcker med att skriva ut hjälptexten i kommandofönstret i Matlab (med help ekvsystest1) och sedan köra programmet genom att skriva ekvsystest1 i kommandofönstret. 3. Ungefär hur mycket ökar beräkningstiden när problemstorleken ökar? Ökar den linjärt? kvadratiskt? Något annat? Försök uppskatta detta i grafen du fick fram i 1) genom att uppskatta hur mycket beräkningstiden ökar när problemstorleken fördubblas (t ex från 4000 till 8000 ekvationer). 4. Beräkningsmetod och beräkningstid Ladda ner Matlab-filen ekvsystest2.m från kurshemsidan. Detta program mäter också beräkningstid, men denna gång testas två olika metoder för att lösa linjära ekvationssystem. Man kan förutom backslash, dvs x = A\b även tänka sig använda matrisinvers x = A-1b när man löser linjära ekvationssystem. Kör programmet ekvsysttest2 och undersök vilken av de båda metoderna som går snabbast. Välj några olika problemstorlekar. Det bör vara så pass stort att det åtminstone tar några sekunder att lösa. Vilken metod bör man välja? Anmärkning: Matlabs backslash löser ekvationssystem med Gausselimination. 5. LU-faktorisering och beräkningstid I många tillämpningar har man samma matris A, men många olika högerled bi. Det innebär att man måste lösa många ekvationssystem där matrisen är densamma. Om man t ex har 10 st högerled så måste man alltså lösa Ax = b1 Ax = b2 ! ! Ax = b10 Ett rimligt antagande är att det borde ta 10 gånger längre tid att lösa detta jämfört med att lösa enbart ett system. Stämmer det? Det är detta du ska undersöka här. Ladda ner Matlab-filen LUtest.m från kurshemsidan. Programmet LUtest löser en Beräkningsvetenskap I januari 2016 följd av ekvationssystem där alla systemen har samma koefficientmatris A, men med olika högerled bi precis enligt exemplet ovan. Läs programmets hjälptext (help LUtest) och kör sedan programmet. Du kommer att få ange vilken problemstorlek programmet ska arbeta med. Titta på resultaten från första delen av laborationen och välj en problemstorlek som gör att CPUtiden för lösning av ett ekvationssystem blir ca 3–5 sekunder. Slutsats? Anmärkning: LU-faktorisering är ett sätt att organisera Gausselimination. I vissa fall som ovan kan man utnyttja detta för att vinna tid. Hur det mer exakt fungerar förklaras på kommande föreläsning.