UMEÅ UNIVERSITET Datavetenskap Per Lindström Mars 2001 Obligatorisk uppgift 1: TVB 1 för C-prog vt-01. Beräkningsbekymmer, linjär algebra och ett speciellt linjärt ekv-system Redovisning Försättsblad Diskussion kring respektive deluppgift, Testkörningar med lämpliga utskrifter och figurer. Prydligt indenterad och kommenterad källkod (icke-proportionellt typsnitt, t.ex. courier, stl. 10) Egna reflexioner och synpunkter (inte minst viktigt!) Uppgiften löses i grupper om maximalt 2 personer och inlämnas senast Måndag 9/4 2001 kl. 12.00 Rapporten lämnas i röda brevlådan märkt A-kurser utanför institutionen eller i Dan Iregrens/Johan Lindströms postfack. UMEÅ UNIVERSITET 901 87 UMEÅ Tel.: 090-786 6124 Fax: 090-786 61 26 e-mail: [email protected] TVB 1 för C-prog Obligatorisk uppgift 1 vt-01 Syfte Syftet med Del 1 är att se hur till synes likvärdiga beräkningar kan ge olika resultat och vad det är som inverkar på resultatets trovärdighet. Del 2 är tänkt att ge lite övning i geometrin kring matriser och Del 3 handlar om att konstruera en egen algoritm för lösning av ett speciellt linjärt ekvationssystem. Introduktion Man kan dela in de praktiska beräkningsbekymren i två typer, avrundningsfel och trunkeringsfel. Avrundningsfel är de fel i bräkningarna som hör samman med att vi i datorerna inte kan räkna exakt utan har ändlig aritmetik. Trunkeringsfel är de fel vi introducerar när vi approximerar storheter t.ex. en oändlig serie med en ändlig del av serien. Ett annat bekymmer är att de indata vi räknar på ofta har ett visst fel (mätvärden t.ex.) vilket ger upphov till fortplantade fel, dvs. att indatafelen följer med och växer i beräkningarna. Felen i indata kan vara svåra att göra något åt så det är upp till oss att se till att tillväxten är minimal. Del 1 - Försvinnande noggrannhet Givet är de tre punkterna (0,0), (1,0) och (2, ). Du ska undersöka hur de båda skärningspunkterna mellan en parabel genom dessa punkter och en given linje varierar med värdet 0 som bestämmer krökningen på parabeln. 2 a) Bestäm koefficienterna a, b och c uttryckta i till den andragradskurva y ax bx c som går genom dessa punkter. b) Denna parabel skär linjen y 2x 1 i två punkter, vilka alltså kan bestämmas ur ekvationen 2x 1 ax 2 bx c genom att utnyttja det välkända faktumet att ekvationen Ax 2 Bx C 0 har rötterna B B2 4AC . x 2A Ge uttryck för A, B och C. Parabeln med eps =1 10 8 6 4 2 c) Skriv en funktion i MATLAB som tar som parameter och som plottar kurvan och linjen i intervallet 1 x 2 . Rita även ut y 0 i samma figur. 0 -2 -4 -1 0 1 2 3 4 5 2 TVB 1 för C-prog Obligatorisk uppgift 1 vt-01 d) Skriv en funktion function [x1,x2] = bad(epsilon) i MATLAB som beräknar de två rötterna x1 och x2 med hjälp av formeln i b). e) Den ena skärningspunkten närmar sig (0.5,0) då 0 . Detta syns enkelt om du tar funktionen i c) och låter vara någorlunda litet, t.ex. 0.01. Skriv ett program i MATLAB som skriver ut de två rötterna beräknade med formeln i b) k i tabellform genom att anropa funktionen från uppgift d) med 10 , k 0,1,2,3, , tills den mindre roten blir noll eller k=20. Skriv ut rötterna med format long för att få se små förändringar. f) Skriv om formeln i b) så att den mindre roten kan beräknas med större numerisk noggrannhet. Använd omskrivningen i en funktion function [x1,x2] = good(epsilon) som beräknar de två rötterna x1 och x2 med en bättre algoritm. Testkör denna funktion med programmet i e). g) Vad är det som händer i beräkningarna, kan man veta vilken beräkning man ska använda? 3 TVB 1 för C-prog Obligatorisk uppgift 1 vt-01 Del 2 - Matriser, vektorer och geometri Matriser representerar en linjär avbildning mellan olika rum. I olika problemområden har man anledning att resonera med hjälp av geometrin kring avbildningarna. mn T Till varje matris A R hör fyra grundläggande underrum, R(A),N (A),R (A ) och T N (A ) . a) Beskriv hur de fyra rummen bestäms av matrisen och hur de förhåller sig till varandra. 33 3 Det kvadratiska linjära ekvationssystemet Ax b, A R , x,b R kan hjälpa oss att förstå sambanden mellan rummen så att vi senare kan generalisera och förstå egenskaper hos en godtycklig matris. 1 2 1 Utgå från matrisen A 2 3 1 3 4 1 b) Ange dimensionerna för underrummen till denna matris. c) Ange en bas för A's värderum, dvs. det rum till vilket en godtycklig vektor v avbildas när A appliceras : Av . d) Är denna bas unik? Ge exempel/motexempel som verifierar ditt svar. 0 1 3 Tag vektorerna b1 1 , b2 2 och b3 5 . 2 1 3 e) Kontrollera för respektive vektor om den tillhör något av matrisens underrum? Tänk efter först så att du slipper en massa onödigt arbete. Kontrollera dina svar med MATLAB . För lösning av linjära minsta kvadratproblem kan man övertyga sig om att b Ax m n m T 2 (med T A R ,m n , b R ) verkligen har sitt minsta värde för lösningen till A Ax A b med hjälp av geometrin. 3 f) Utgå från R och troliggör detta, stöd ditt resonemang både algebraiskt och med figur. g) Är minsta kvadratlösningen unik? 4 TVB 1 för C-prog Obligatorisk uppgift 1 vt-01 Del 3 – Ekvationssystem: algoritm och implementation I denna deluppgift ska du/ni öva på att formulera en algoritm för lösning av ett speciellt linjärt ekvationssystem samt implementera denna algoritm på två olika sätt i Matlab. Det ena sättet, där man använder for-loopar ska visa sig ta betydligt längre tid att exekvera än då implementationen görs utan for-loopar – då Matlabs elementvisa operationer på vektorer används i stället. Man önskar ett program för effektiv lösning av glesa linjära ekvationssystem av typen Ax=b där A är kvadratisk n*n och har strukturen * 0 0 0 * 0 * 0 0 * A= 0 0 * 0 * 0 0 0 * * * * * * * * De nollskillda elementen i A finns alltså i diagonalen (d n ), i sista raden r n 1 ) och i sista kolumnen (k n 1 ). Högerledet b n får inte vara nollvektorn. a) Uppgiften är att använda Gausselimination utan pivotering följt av bakåtsubstitution för att formulera en algoritm som löser ekvationssystemet Ax=b ovan. b) Implementera algoritmen du formulerat i a)-uppgiften under förutsättning att A’s diagonal finns lagrad i vektorn d, sista raden i A finns lagrad i vektorn r och att A’s sista kolumn finns lagrad i vektorn k. Du/ni ska alltså skriva en funktion i Matlab med huvud function [x, time] = SlowSolve(d,r,k,b) där x är den lösning som beräknas i funktionen och time är den tid som ”spenderas” i funktionen SlowSolve. Ta tid mha den fördefinierade funktionen cputime.I denna implementation ska du använda for-loopar för att realisera algoritmen. c) Implementera algoritmen du formulerat i a)-uppgiften under förutsättning att A’s diagonal finns lagrad i vektorn d, sista raden i A finns lagrad i vektorn r och att A’s sista kolumn finns lagrad i vektorn k. Du/ni ska alltså skriva en funktion i Matlab med huvud function [x, time] = FastSolve(d,r,k,b) där x är den lösning som beräknas i funktionen och time är den tid som ”spenderas” i funktionen FastSolve. Ta tid mha den fördefinierade funktionen cputime. I denna implementation ska inga forloopar (inte while heller) användas. Gör implementationen mha de elementvisa operationer som Matlab erbjuder samt använd fördefinierade funktioner. Innan du börjar köra tester där n=10000(100000) ska du redovisa tester där man enkelt kan se att SlowSolve resp Fast Solve ”räknar rätt”. Enklast är att slumpa fram värden på d, r, k och b då tex n=5. Plocka in d, r och k i en matris A och lös med \-operatorn. Det blir facitlösningen som du jämför mot de lösningar som FastSolve resp SloveSolve beräknar. Redovisa också sedan medelvärdet av de tider du får om du löser 10 gånger med 5 TVB 1 för C-prog Obligatorisk uppgift 1 vt-01 FastSolve resp SlowSolve då n=100000. 6