tana19 numeriska metoder

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