HT2/2016 LINJE+ÅK+KLASS : TANA19 NUMERISKA METODER Laboration 1 Felanalys Namn : Personnummer : E-post : @student.liu.se Namn : Personnummer : E-post : @student.liu.se Godkänd datum : Sign : Retur : 1 23 september 2016 LAB 1 FELANALYS 1 Inledning I laborationerna används matrishanteringsprogrammet MATLAB. MATLAB är ett interaktivt program speciellt avsett för laborativa experiment i linjär algebra. Programmet är skrivet i ”C” och Java och utnyttjar subrutinpaketen LINPACK och EISPACK. Matrisoch vektor-operationer kan utföras på ett enkelt sätt. Det finns också kommandon för tvåoch tre-dimensionell grafik, programmeringsmöjligheter samt tillgång till ett stort antal programpaket. MATLAB använder genomgående dubbel precision vid beräkningarna. Information om vissa enkla grundläggande MATLAB-kommandon finns i Kort MATLABguide, som finns på kursens hemsida. Hjälpinformation för viss MATLAB-rutin kan fås via help. Med help rutin ges information om rutinen, exempelvis help plot. Program kan listas genom att skriva type rutin, t.ex type sinus Mer avancerad hjälp finns via MATLAB:s grafiska hjälprutiner (klicka på ”?” eller help). 1.1 Att komma igång Öppna ett terminalfönster. Skriv: TANA79setup cp $kursbib/sinus.m . matlab & 1.2 (vilket definierar kursbiblioteket och sökvägar) (vilket kopierar filen sinus.m till din egen area) (vilket gör att MATLAB startas i eget fönster) Mål Du ska 1. bestämma den avrundningsenhet µ, som MATLAB använder (dubbel precision). 2. bestämma största och minsta tal som kan lagras. 3. studera hur beräkningsfelen påverkar resultaten i olika situationer. 4. använda MATLAB:s grafik för att illustrera. 5. tolka praktiska resultat och göra jämförelser mellan teori och praktik. 1.3 Lämpliga förkunskaper Kapitel 2.1 – 2.5, 2.8 i Eldén / Wittmeyer-Koch. Exemplen 1.1, 1.2, 1.6 och 1.9 i exempelsamlingen. Avsnitt 1 och 2 i “Komplettering till kursboken”. Förkortas Kompl. i labtexten. 2 2 Flyttal Ett binärt flyttal (basen β = 2) representeras som en följd av nollor och ettor i ett s.k. ord. I MATLAB används 64 binära positioner (dubbel precision) för att lagra ett flyttal. Exponentdelens storlek bestämmer hur stort talområde som kan användas. Alla tal större än ett visst tal lagras som inf medan tal vars absolutbelopp är mindre än ett visst tal sätts till noll. Taldelens storlek bestämmer vilken noggrannhet som kan erhållas. 2.1 Avrundningsenheten, µ Ett flyttal, x, i basen β = 2, kan skrivas som x = m·2exp , där m är taldelen och 1 ≤ |m| < 2. Om t bitar används för att lagra taldelens bråkdel blir övre gränsen för relativa felet vid flyttalslagring av x |∆x| ≤ µ = 0.5 · 2−t , (1) |x| där µ är avrundningsenheten. Eftersom endast ett begränsat utrymme finns för att lagra taldelen blir 1 + x = 1 vid flyttalslagring om |x| är alltför litet. I IEEE-standarden, som används av MATLAB, gäller att 1+x = 1 om x är positivt och x ≤ µ. Detta kan användas för att praktiskt bestämma µ. Uppgift 2.1 Bestämning av t och µ Beräkna a = 1 + 0.5 · 2−n . (Upphöjt skrivs ∧ följt av mellanslag). Pröva med olika positiva heltal n (mellan 50 och 60) och bestäm det minsta n för vilket a = 1, dvs. enbart 1 skrivs ut och a − 1 blir exakt 0. Så länge a > 1 skrivs det avrundade värdet ut, t.ex. 1.0000 skrivs ut och a − 1 blir 6= 0. Ange t, som är det minsta n för vilket a = 1? Beräkna värdet på avrundningsenheten µ = 0.5 · Svar: t = 2−t . Svar: µ = Uppgift 2.2 Bestämning av felgräns för flyttal Följande värden lagras som flyttal i MATLAB: b = e30 ( i MATLAB: b=exp(30) ) och c = 0.1318 . Ange b och c med felgränser. [Tänk efter hur µ ska utnyttjas, se (1)]. Svar: b = c= Förberedelse 2.3 Antal signifikanta siffror för ett flyttal Hur många decimala signifikanta siffror får man ungefär för ett godtyckligt flyttal i MATLAB? Se tumregeln i slutet på kap 2.5 i Eldén/Wittmeyer-Koch. Observera att antalet decimala signifikanta siffror är s + 1. Svar: 3 Efterarbete 2.4 Jämförelse Stämmer detta för b och c? Motivera svaret genom att bestämma antalet korrekta decimaler och signifikanta siffror för b och c. Utnyttja definitionerna av korrekta decimaler respektive signifikanta siffror [boken, sid. 13]. Visa hur du kommer fram till svaret. Svar: b har korr.dec. och sign.siffror. Svar: c har korr.dec. och sign.siffror. Uppgift 2.5 Bestämning av det största flyttalet som kan lagras Studera a = 2n , där n är ett positivt heltal (större än 1000). Bestäm det största n, som ger ett värde på a. Ange i decimal form ett ungefärligt värde på det största talet som kan lagras. Svar: Uppgift 2.6 Bestämning av det minsta positiva talet som kan lagras Bestäm på motsvarande sätt det minsta positiva tal som kan lagras genom att använda a = 2−n . Svar: Det går att skriva ut tal hexadecimalt i MATLAB, däremot finns inte binär utskrift. Använd format hex i uppgifterna 2.7 till 2.9 och översätt till binär form (0=0000, 1=0001, 2=0010, 3=0011, 4=0100, 5=0101, 6=0110, 7=0111, 8=1000, 9=1001, a=1010, b=1011, c=1100, d=1101, e=1110, f=1111). Återgå sedan till standardformat med format. Uppgift 2.7 Binär lagring Studera hur talen 1, 1.5 och −1.5 lagras binärt. I vilka bitar lagras tecken, taldel och exponent? Svar: Uppgift 2.8 Kontroll av t Kontrollera att du fick rätt värde på t i uppgift 2.1 genom att låta en etta vandra genom positionerna i taldelen. Skriv i MATLAB: 1 + 2−1 , 1 + 2−2 , ... 1 + 2−20 , ... vilket innebär att en etta finns i bit 1,2,..,20,... i taldelen. Stämmer ditt tidigare t? Svar: Uppgift 2.9 Successivt underspill Låt a = (2/3) ∗ 2−1074 och ā = flyttalsapproximationen till a. (a) Kontrollera att ā = 2−1074 . (b) Hur lagras ā binärt? Svar: (c) Räkna ut relativa felet i ā för hand, dvs beräkna: ā − a a = (d) Varför blev det relativa felet mycket större än µ? [Boken, sid. 37] Svar: 4 3 Stegning Vi vill bestämma sin(b), genom att stega oss fram från x = a till x = b med steglängden h. Vi förutsätter att (b − a)/h är ett heltal. Denna typ av “stegning” förekommer ofta vid beräkning av värden med någon numerisk metod, t.ex vid lösning av differentialekvationer. I detta fall vill vi bara illustrera effekten av stegningen och utför beräkningen med MATLAB:s standardfunktion: sin(x). Funktionen sinus.m, se programmet nedan, ger sista beräknade sinus-värde som utdata, vilket bör vara sin(b). Uppgift 3.1 MATLAB-körning Använd format long e. Kör sinus(a,b,h) med följande värden: Exempel nr a (startvärde) b (slutvärde) h (steglängd) 1 0 1 0.1 2 0 2 0.1 Jämför med värdet av sin(b). Blev båda värdena korrekta? Om inte, vilket exempel blev fel? Svar: Uppgift 3.2 Undersökning av programmet Vi ska undersöka varför inte vi får rätt resultat, genom att skriva ut mellanresultaten. Detta görs genom att ta bort kommentartecknet, %, framför disp i sinus.m. Använd någon editor t.ex emacs, ändra och spara sedan filen. Kör båda exemplen igen och studera vad som händer. Ange vad som gick snett och förklara varför. Svar: Uppgift 3.3 Korrigering av programmet Ändra villkoret i while-satsen, så att ett korrekt resultat beräknas för alla indata. Testkör och kontrollera att båda exemplen fungerar. För in ändringen i programmet nedan. Detta program ska senare användas i Lab 4. 3.1 Programmet sinus function y=sinus(a,b,h) % beräknar sin(b) genom att stega från a till b med steglängden h % Anrop: y=sinus(a,b,h) x=a; while x<b x=x+h; y=sin(x); % disp([x, y]) end disp(’ ’) disp(’beräkningen utförd !’) 5 4 Noggrannhet vid flyttalsberäkningar, ett enkelt exempel Vi ska använda x = 6/7 = 0.857142 . . . och studera vad som händer då vi beräknar z = (x + 2k ) −2k | | {z a } {z b } för några olika heltal k. Matematiskt ska ju z = x gälla. Förberedelse 4.1 Beräkningsfelsanalys Gör en beräkningsfelsanalys [Kompl., avsnitt 1] för att få fram en formel för övre gränsen för beräkningsfelet i z, då vi antar att varje beräkning sker med ett relativt fel som är mindre än µ. Vi betraktar x som exakt och beräkningen av 2k som exakt så ta bara hänsyn till felen från beräkningarna av a och b. Redovisa beräkningsfelsanalysen som ger det teoretiska RB . Uppgift 4.2 Praktiskt fel jämfört med teoretisk felgräns Använd format short e. Mata in x = 6/7 och bestäm z för angivna k-värden. Räkna ut beräkningsfelet (RB ) teoretiskt (uträknat med formeln som du tog fram i föregående uppgift) och praktiskt (genom att subtrahera x). k z Teoretiskt RB Praktiskt RB 40 45 53 Jämför teoretiska och praktiska värdet på beräkningsfelet och kommentera. Svar: Ge en förklaring till varför noggrannheten blir sämre då k blir större. Svar: 6 5 Andragradsekvationer Rötterna till ekvationen ax2 + bx + c = 0 ges av följande uttryck x1 = −b + √ b2 − 4ac , 2a x2 = −b − √ b2 − 4ac . 2a Uppgift 5.1 MATLAB-körning Använd format long e, som skriver ut 16 siffror. Låt a = 1.1 och c = 0.7 hela tiden medan vi ska använda två olika värden på b (se tabellen). Ge a, c och b värden, räkna sedan ut x1 och x2 med formeln. Bestäm också de “exakta” värdena på rötterna med hjälp av MATLAB-funktionen roots som anropas med roots([a,b,c]) Fyll i antalet signifikanta siffror i tabellen nedan. Det fungerar om ni tittar på hur många siffror som överensstämmer. Antal sign. siffror i x1 b Antal sign. siffror i x2 8.48 · 105 8.48 · (i MATLAB: b=8.48e5) 107 Uppgift 5.2 Tolkning av resultaten Vilken rot (x1 eller x2 ) får dålig noggrannhet? Svar: Förklara varför just den roten får dålig noggrannhet. Svar: Förklara varför problemet med dålig noggrannhet ökar när beloppet av b blir större. Svar: Uppgift 5.3 Alternativ formel Ta fram en alternativ formel för att beräkna rötterna (se boken, sid 20). Svar: Uppgift 5.4 MATLAB-resultat med den alternativa formeln Räkna ut båda rötterna med den nya formeln och fyll i tabellen: b Antal sign. siffror i x1 Antal sign. siffror i x2 8.48 · 105 8.48 · 107 Vilken rot får sämst resultat i detta fall ? Svar: Jämför med körningen i Uppgift 5.1 och förklara skillnaden. Svar: 7 6 Beräkningsfel Vi skall jämföra följande algoritmer för beräkningen av y(x), x ≈ 0. Algoritm 1: y1 = ex − 1 . x Algoritm 2: y2 = ex − 1 . ln(ex ) Förberedelse 6.1 Kan vi förvänta oss att täljaren i de båda uttrycken beräknas noggrant? Varför? Svar: Förberedelse 6.2 Beräkningsfel i Algoritm 1 Funktionen ex måste beräknas. I flyttalsaritmetiken utförs denna beräkning med ett relativt fel ≤ µ. Vi sätter a = ex och får y1 = a−1 , x där a = ex och |x| ≪ 1. Uppskatta hur just detta fel i a påverkar resultatet och försumma därvid felen från de övriga beräkningarna. Uttryck resultatet med hjälp av µ och x. (Förenkla genom att utnyttja att |x| ≪ 1.) Redovisa beräkningarna. Svar: Förberedelse 6.3 Beräkningsfel i Algoritm 2 Vi ska även här se hur beräkningen av ex påverkar resultatet. Vi sätter a = ex och får y2 = a−1 , ln(a) där a = ex och |x| ≪ 1. Uppskatta felet i y2 under samma förutsättningar som vid beräkningen av felet i y1 . Uttryck resultatet med hjälp av µ och x. (Derivera med avseende på a, ersätt a = ex och förenkla sedan genom att serieutveckla ex och utnyttja att |x| ≪ 1. ) Redovisa beräkningarna. Svar: 8 Förberedelse 6.4 Vilken av de båda algoritmerna bör användas? Motivera svaret! Svar: Uppgift 6.5 Praktiska resultat Beräkna y enligt båda algoritmerna i MATLAB. Använd x-värdena i tabellen. Värdet av |y1 − y2 | kan användas för att uppskatta det praktiska felet i det sämre av de båda värdena (ange vilket i rubrikens sista kolumn). Bestäm även det teoretiska felet, med hjälp av formeln du tog fram i förberedelseuppgifterna. x y1 y2 abs(y1-y2) Teoretisk felgräns för ..... 10−4 10−13 10−15 1.2 · 10−16 Hur väl stämmer teori och praktik? Motivera svaret! Svar: 7 Praktisk beräkning av ett gränsvärde Vi ska studera f (x) = 1 − cos x . x2 Förberedelse 7.1 Gränsvärdet teoretiskt Maclaurinutveckla cos x, sätt in i f (x), ange de tre första termerna i f (x) och bestäm gränsvärdet för f (x) då x → 0. Redovisa uträkningarna. lim f (x) = Svar: f (x) ≈ x→0 9 Uppgift 7.2 MATLAB-beräkningar Räkna ut f (x) för x = 1, 10−1 , 10−2 , . . . , 10−16 , för att se om de praktiskt bestämda f (x)-värdena närmar sig gränsvärdet när x minskar. Skriv i MATLAB: format long e x=logspace(0,-16,17) x=x’ f=(1-cos(x))./x.^2 [x f f-gränsvärdet ] format ställer om utskriftsformatet. ger de önskade x-värdena. ger en kolumnvektor. ./ och .^ gör elementvis division resp upphöjt till. genererar en tabell. ställer tillbaks utskriftsformatet. Svara på följande frågor: För vilket x hamnade vi närmast gränsvärdet? Svar: Hur stor är avvikelsen från gränsvärdet i detta fall? Svar: Uppgift 7.3 Illustrationer Studera lite noggrannare hur nära gränsvärdet vi kan komma genom att rita f (x) i intervallet x ∈ [3 · 10−5 , 10−3 ] ( x=linspace(3e-5,1e-3,2000); ). Bestäm sedan f för dessa x-värden och plotta: plot(x,f) Tyvärr kan vi inte, med hjälp av skalan på y-axeln, se hur nära gränsvärdet vi har hamnat. Rita därför en bild av felfunktionen ( fel=abs(f-gränsvärdet) ). Ta ut en papperskopia av felkurvan (print). Följ topparna på felkurvan och rita in en kurva genom dem, ange minsta felgräns och motsvarande x-värde= xopt . Minsta felgräns ≈ xopt ≈ Förberedelse 7.4 Teoretisk bestämning av RB och RT Bestäm RB (x), dvs det fel som beror på avrundningar under beräkningarna med en beräkningsfelsanalys. [Kompl., avsnitt 1] Bestäm även trunkeringsfelet |RT (x)| = |f (x) − gränsvärdet |, m.h.a. uppgift 7.1 och utnyttja att serien är alternerande. [Boken, sid. 45] < < Svar: |RB (x)| ∼ |RT (x)| ∼ Efterarbete 7.5 Teoretisk bestämning av RT OT (xopt ) Bestäm det teoretiska totalfelet i xopt , dvs bestäm < |RB (xopt )| + |RT (xopt )| |RT OT (xopt )| ∼ < för det xopt som erhölls i 7.3 Svar: |RT OT (xopt )| ∼ Efterarbete 7.6 Tolkning av resultatet Tolka resultatet. Identifiera RT och RB och markera i figuren var dessa fel dominerar. Jämför det teoretiska och det praktiskt avlästa värdet på |RT OT (xopt )|. Verkar resultatet rimligt. Motivera svaret! Skriv gärna förklaringarna och svaren direkt i figuren, som skall lämnas in. 10 8 Summation Den matematiska konstanten π kan skrivas π= 90 ∞ X 1 i=1 i4 !1/4 (serien kan härledas genom Fourier-serieutveckling). Vi använder oss av approximationen π̄ = 90 N X 1 i=1 i4 !1/4 Uppgift 8.1 Inverkan av olika fel vid summering [Kompl., avsnitt 2] Uppgiften är att beräkna π med hjälp av summan så noggrant det går i MATLAB, dvs lika bra som MATLAB’s värde på π. Det räcker att låta N = 100 000 för att trunkeringsfelet ska bli försumbart. Beskriv hur du löste uppgiften. Svar: 11