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.