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
© Copyright 2024