TVB I - Beräkningsbekyymer

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.
mn
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.
33
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