Lösningsförslag - Uppsala universitet

Transcription

Lösningsförslag - Uppsala universitet
Uppsala universitet
Institutionen för informationsteknologi
Avdelningen för beräkningsvetenskap
Lösningsförslag
Tentamen i Beräkningsvetenskap I/KF, 5.0 hp, 2015-08-29
Kursmål (förkortade), hur de täcks i uppgifterna och maximalt betyg
Fråga nr
1
2
3
4
5
6
7
Nyckelbegrepp Algoritmer Analys Programmering
3
3
3
3
3
3
3 3
4
5
Del A
1. (a)
i. Falskt. Konditionstalet beror av det underliggande problemets natur (är en
egenskap hos matrisen A) och förändras inte genom val av lösningsmetod.
ii. Sant. Huvudskälet till pivotering är att undvika feltillväxt, dvs för att noggrannheten inte ska försämras.
(b) Använd i båda deluppgifterna
kx − x̂k
kb − b̂k
≤ cond(A) ·
.
kxk
kbk
i. Här är
kb − b̂k
≈ M ,
kbk
dvs ungefär 10−16 . Det innebär att felet i x ≤ 100 · 10−16 dvs väldigt litet.
ii. Här är
kb − b̂k
= 0.01,
kbk
dvs felet i x ≤ 100 · 0.01 = 1 dvs 100% fel, vilket är stort.
1
2. Nedan visas matrisen och pivoteringsvektorn som datastrukturer:


 
1 4 4
1
 −4 8 4 
 2 
Radbyte rad 1 och 2
2 5 8
3


−4 8 4
 1 4 4 
2 5 8

−4 8 4
 −1 6 5 
4
− 12 9 10

l12 = −1/4, l13

2
= −1/2  1 
3



−4 8 4
 − 1 9 10 
2
− 14 6 5
Radbyte rad 2 och 3

2
 1 
3


2
 3 
1

l32 = 2/3


−4 8 4
 − 1 9 10 
2
− 14 32 − 53


2
 3 
1
Detta tolkas som






1 0 0
−4 8 4
0 1 0
L =  − 21 1 0  U =  0 9 10  P =  0 0 1 
− 14 32 1
0 0 − 53
1 0 0
3. Man kan antingen använda Simpsons formel eller Trapetsformeln i uppgiften. Här
visas lösning med Simpson.
S(h = 1) = (60 · 60 · 24 · 8) · 31 (2.05 · 1.02+
4 · 2.22 · 1.03 + 2 · 2.18 · 1.50 + 4 · 2.20 · 1.80 + 2.00 · 1.80)] ≈ 8.5749 · 106 .
För feluppskattning krävs även beräkning med dubbel steglängd:
2
S(h = 2) = (60·60·24·8)· (2.05 · 1.02 + 4 · 2.18 · 1.50 + 2.00 · 1.80) ≈ 8.6497·106 .
3
Feluppskattning med 15-delsregeln:
R=
S(h = 1) − S(h = 2))
(8.5749 − 8.6497) · 106
=
= −4.9859 · 103 .
15
15
Lösningen blir alltså 8.5749 · 106 ± −4.9859 · 103 (betyder att de tre första siffrorna
bör vara korrekta, dvs 3 signifikanta siffror).
2
4. (a) Adaptivitet betyder att metoden själv reglerar steglängden successivt under
beräkningen så att en viss tolerans uppnås. Det medför t ex att det blir tätare
indelning då det krävs finare indelning (t ex då funktionen svänger kraftigt) och
glesare indelningen i de avsnitt då det inte händer så mycket.
(b) Jämför konvergenshastigheten i de två metoderna t ex med
|xk+1 − xk | = C · |xk − xk−1 |r .
För Newton-Raphson gäller kvadratisk konvergens, dvs r = 2 när man är nära
nollstället.
Metod 1 ger feluppskattningar
e6 = |x6 − x5 | = 0.7 · 10−6
e5 = |x5 − x4 | = 1.2 · 10−3
e4 = |x4 − x3 | = 0.0469.
Man kan direkt se att e25 ≈ e6 , så detta kan vara Newton-Raphson. Man kan
också beräkna kvoterna och får då e6 /e25 ≈ 0.5 och e5 /e24 ≈ 0.5. Det tycks
alltså stämma med kvadratisk konvergens (med C ≈ 0.5), så metod 1 kan vara
Newton-Raphson.
Samma kontroll för metod 2 ger
e7 = |x7 − x6 | = 1.091 · 10−4
e6 = |x6 − x5 | = 2.969 · 10−4
e5 = |x5 − x4 | = 8.0919 · 10−4 .
Redan här ser man felet minskar för långsamt. Det kan inte vara kvadratisk
konvergens, och alltså inte Newton-Raphson. Om man vill testa kvoten så ger
det e7 /e26 ≈ 1237.7, e6 /e25 ≈ 453.5 och e5 /e24 ≈ 0.37. Det är alltså inte kvadratisk
konvergens och metod 2 kan inte vara Newton-Raphson.
Slutsatsen är alltså att metod 1 sannolikt är Newton-Raphson.
(Om man testar för linjär konvergens på metod 2 så får man e7 /e6 ≈ 0.4 och
e6 /e5 ≈ 0.4. Det ser alltså snarare ut som linjär konvergens).
5. (a) limit = 4 (vid anropet)
if limit <= 0 ⇒ falskt,
går inte in i if-satsen
programmet
1
fib = [1; 1] ⇒ f ib =
1
n = 3;
f = 2;
while (f <= 4) ⇒ sant, programmet går in i while-loopen
n = n+1 ⇒ n = 3+1 = 4  
1
fib = [fib; f] ⇒ f ib =  1 
2
3
f = fib(3)+fib(2) ⇒ f = 2 + 1 = 3
(3 ≤ 4) ⇒ ytterligare ett varv i while-loopen
n = n+1 ⇒ n = 4+1 = 5  
1
 1 

fib = [fib; f] ⇒ f ib = 
 2 
3
f = fib(4)+fib(3) ⇒ f = 3 + 2 = 5
(5 ≤ 4) är falskt ⇒ slut på while-loop och programmet avslutas.
(b)
function fp = func1(p)
fp = sin(p) - (p^2 - 1)/(2*p);
(Det viktiga här att in- och utparametrar, funktionsnamn och liknande blir rätt,
och inte syntaxen i själva formeln).
Del B
6. Uttrycket xn = a är en ickelinjär ekvation och kan skrivas xn − a = 0. Detta kan då
lösas med en iterativ metod t ex Newton-Raphsons metod. Sätt f (x) = xn − a och
derivatan f 0 (x) = n · x(n−1) .
Algoritmen kan t ex skrivas
tol = 0.5*1e-10;
x0 = ett startvärde
xold = x0;
e = 1 (t ex)
while e >= tol
xnew = xold - (xold^n-a)/(n*xold^(n-1));
e = abs(xnew-xold);
xold = xnew;
end
Här förutsätts att a och n finns definerade. Hur startvärdet väljs på ett bra sätt krävs
inte i uppgiften (men det fungerar att välja a som startvärde).
7. Formuleringen uk = −J(x̄k )−1 · f¯(x̄k ) innebär att man måste beräkna en matrisinvers.
Genom att istället formulera som J(x̄k )ūk = −f¯(x̄k ) så kan man istället lösa det
genom att använda Gausselimination, t ex via LU-faktorisering. Eftersom beräkning
av invers innehåller ungefär dubbelt så många operationer som Gausselimination så
halveras beräkningstiden genom omskrivningen.
Standardmetoden för Gausselimination är genom LU-faktorisering. Här vinner man
4
inget på det eftersom det är en ny matris varje iteration. Man måste alltså utföra en
ny LU-faktorisering varje iteration. Svaret är alltså att man inte tjänar något på det.
Men man förlorar inget på det heller.
5