TAIU07 Matematiska beräkningar med Matlab

TAIU07 Matematiska beräkningar med Matlab
Laboration 3. Linjär algebra
Namn:
Personnummer:
Epost:
Namn:
Personnummer:
Epost:
Godkänd den:
Retur:
Sign:
1
Introduktion
2
En Komet
Kometer rör sig enligt ellipsformade banor. När man först ser en ny komet så vill man uppskatta dess
bana. Det görs genom att man samlar in observerade positioner för kometen. Man kan sedan anpassa
en ellips så bra som möjligt till de observerade positionerna med hjälp av minsta kvadratmetoden.
En punkt (x, y) ligger på en ellips om ekvationen
c1 x2 + c2 xy + c3 y 2 + c4 x + c5 y + 1 = 0.
är uppfylld för en specifik uppsättning parametrar c = (c1 , c2 , c3 , c4 , c5 )T . Det är inte säkert att en
uppsättning parametrar ger en ellips. Man kan även få parabler eller hyperbler.
Uppgift 2.1 Antag att ett antal observationer (xk , yk ), k = 1, .., n, för kometen finns. Skriv ner det
överbestämda ekvationssystem Ac = b som uppstår då vi försöker bestämma ellipsen med minsta
kvadrat metoden. Visa tydligt hur matrisen A och högerledet b skall se ut.
Svar:
Uppgift 2.2 Programmet CometObservation simulerar observationer av kometen. Använd programmet genom att skriva
>> Times = 0:0.05:0.5;
>> PositionData=CometObservation(Times);
så skapas en matris PositionData med observerade positioner för kometen vid tiderna som sparats
i vektorn Times. Första raden i matrisen, dvs PositionData(1,:), innehåller x-koordinater och
andra raden innehåller y-koordinater.
Använd de observationer som finns i PositionData-matrisen för att hitta vektorn c som bestämmer
ellipsen. I ditt program skall du först skapa två kolumnvektorer x och y, och använda dessa för att
bygga upp matrisen A och högerledet b. Du löser sedan minsta kvadratproblemet och hittar vektorn
c som innehåller koefficienterna i ellipsens ekvation.
1
Använd slutligen programmet DisplayComet för att rita upp ellipsen och de observationer som
användes. Programmet anropas enligt
>> DisplayComet( Coefs , PositionData )
där Coefs är en vektor som innehåller coefficienterna c1 , c2 , c3 , c4 och c5 ovan. Blev resultatet bra?
Svar:
Kommentar Med Times=0:0.05:0.5 använder vi n = 11 punkter som endast täcker en liten del
av ellipsen. Det gör att det är svårt att hitta bra värden på koefficienterna. Tittar vi endast på en
liten del av ellipsen döljer fel i obeservationerna helt kurvans krökning.
Uppgift 2.3 Försök förbättra ellipsen genom att lägga till fler observationer. Ändra tiderna då
observationerna görs till
>> Times =
0:0.05:3.0;
Hur många observationer används nu för att bestämma ellipsen? Blev resultatet bra?
Svar:
Uppgift 2.4 Ett alternativ till fler observationer är att sprida ut observationerna bättre. Använd
observationstider
>> Times =
0:0.5:5.0;
Hur många observationer används nu? Blev resultatet bra?
Svar:
Uppgift 2.5 Vad är viktigast: Att ha många observationer eller att observationerna är väl utspridda?
Svar:
Redovisa Skriv ut ditt program samt den sista grafen för det sista fallet, dvs Times = 0:0.5:5.0;.
2
y
P′
α
O
P
x
Figur 1: Rotation av punkten P = (5 , 1)T , kring origo O = (2 , 2)T , med en vinkel α. Efter
rotationen fås den nya punkten P ′ = (2 , 5.16)T .
3
Rotationer och Speglingar
Geometriska operationer som speglingar och vridningar har många tillämpningar inom exempelvis datorgrafik. I denna övning skall vi träna på att använda linjär algebra för att utföra sådana
operationer en enkel bild.
Vi börjar med att beskriva hur en rotation i (x, y)-planet kan gå till. Låt P = (P1 , P2 )T representera
en punkt i (x, y)-planet. Vill vi rotera punkten P kring origo (0 , 0)T , med en given vinkel α, så kan
vi beräkna,
cos(α) sin(α)
′
P = G · P, där G =
.
− sin(α) cos(α)
Den roterade punkten P ′ får vi alltså genom multiplikation med den matris G som beskriver vridning
i planet.
Vill vi istället välja ett annat origo O = (O1 , O2 )T att rotera kring så bildar vi först vektorn
~ = P − O. Det är vektorn OP
~ som skall roteras. Vi får då
OP
P ′ = O + G · (P − O).
där P , O, och P ′ är punkter i (x, y)-planet. Rotationen illustreras i Figur 1.
Uppgift 3.1 Skriv en funktion RoteraPunkt som roterar en punkt P kring ett orgio O med vinkel
α. Funktionen skall anropas
>> P = RoteraPunkt( P , O , alpha );
där P skrivs över med den nya roterade punkten P ′ .
Använd din funktion för att utföra precis den rotation som illustreras i Figur 1. Punkten P = (5, 1)T
skall alltså roteras så att den hamnar vid position P ′ = (2, 5.16)T . Använd formeln
~ ′ = |OP
~ ′ | cos(α)
~ · OP
~ ||OP
OP
3
för att hitta rätt vinkel. Gick det som du tänkt dig? Vilken vinkel använde du?
Svar:
Uppgift 3.2 Filen RitaHuset.m innehåller de Matlabkommandon som behövs för att rita upp en
enkel skiss bestående av ett hus, en man, och ett träd. Varje objekt på bilden består av en 2 × n
matris där varje kolumn motsvarar en hörnpunkt. Exempelvis gäller att
>> Gubbe(:,1)’
ans =
13
0
vilket skall tolkas som att mannens vänstra fot är placerad vid koordinater (13 , 0)T . Notera att när
vi ritar upp trädet så ritar vi först en grön heldragen linje och sedan en svart-streckad för att det
skall synas lite bättre.
Vill vi flytta ett objekt i bilden, men i övrigt behålla objektet som det är, så skall vi addera en
konstant vektor till varje hörnpunkt innan vi ritar upp bilden. Vill vi att mannen skall stå på taket
så tittar vi på matrisen Huset och ser att om vänstra foten flyttas med T = (4 , 4.5)T så bör mannen
stå nära högra kanten på taket.
Bilda en matris T som har utseendet
T =
4
4 ... 4
4.5 4.5 . . . 4.5
,
och som är av samma storlek som matrisen Gubbe. Beräkna sedan
Gubbe = Gubbe + T;
precis innan gubben skall ritas upp. Inför ändringarna i filen RitaHuset.m. Varje punkt som bygger
upp gubben borde nu ha förflyttats på ett sådant sätt att gubben istället står på taket. Skriv ner
de Matlab kommandon du behöver för att genomföra förflyttningen. Fungerade det?
Svar:
Tips Du kan använda size för att ta reda på hur stor matrisen Gubbe är och ones för att skapa
vektorn med ettor. Då du är klar så kommentera bort dina programrader så att gubben är tillbaka
på marken.
4
Uppgift 3.3 Nu skall vi se till att trädet blåser omkull. I bilden ser vi att trädets vänstra hörn
står vid punkten (5.9 , 0)T . Inför ett nytt origo vid denna punkt, dvs låt O = (5.9 , 0)T . Använd din
funktion RoteraPunkt för att rotera alla punkterna som sparats i matrisen Trad. Välj vridningsvinkeln α så att trädet precis slår i marken. Inför de Matlab kommandon du behöver för att utföra
vridningen i programet RitaHus. Vilken vinkel valde du?
Svar:
Tips Kommandot Trad(:,k)=RoteraPunkt( Trad(:,k),O,alpha) borde rotera en av punkterna
som bygger upp trädet och skriva över den gamla punkten med den nya i matrisen Trad. Använd
en for loop för att rotera alla punkterna.
Uppgift 3.4 Efter att trädet vält vore det mera naturligt om mannen pekade åt andra hållet. Om
vi antar att mannen hört smällen och precis kommit ut genom dörren så måste han dessutom flyttas.
Detta skall vi åstadkomma med en lämplig spegling.
Antag att vi vill spegla en punkt P = (x , y)T i y-axeln. Hur blir den matris H som beskriver
speglingen? Vi skall alltså kunna beräkna den speglade punkten genom
P ′ = O + H · (P − O).
där O är det origo vi valt. Ange matrisen H.
Svar:
Nästa steg är att välja ett lämpligt origo O mellan dörren och gubben att använda vid speglingen.
Skriv en funktion SpeglaPunkt som utför de beräkningar som krävs för att genomföra speglingen
av punkterna som bygger upp gubben. Inför även lämpliga ändringar i RitaHuset. Ange det origo
du valde.
Svar:
Redovisa Skriv ut bilden med både vält träd samt en gubbe som pekar åt rätt håll. Skriv även ut
dina funktioner RoteraPunkt, SpeglaPunkt och RitaHuset.
Uppgift 3.5 (Frivillig) Antag att vi vill att trädet skall vara lite högre och dessutom luta aningen
åt vänster (innan det blåst ner). Detta kan åstadkommas med en transformation av typen (x, y) 7→
(x − αy, βy), där ett värde α = 0.13 ger en lagom lutning och β = 1.1 ger ett lite högre träd. Beskriv
denna avbildning med en matris B. Vilket origo måste väljas för att avbildningen skall ge önskad
effekt?
Svar:
Genomför beräkningarna för att ändra trädets höjd och lutning. Notera att nu måste även vridningsvinkeln ändras för att trädet precis skall slå i marken.
5
4
Beräkning av Integraler
Integralen
I=
Z
b
f (x)dx,
a
kan approximeras med Trapetsregeln. Vi väljer då (N +1)st jämnt utspridda x-värden
a = x1 < x2 < . . . < xN < xN +1 = b
så att avståndet mellan punkterna blir h = (b − a)/N . Integralens värde approximeras med
f (xN +1 )
f (x1 )
+ f (x2 ) + . . . + f (xN ) +
.
Ih = h
2
2
Givet att ett stort antal x-värden används så bör vi få en bra approximation av integralens rätta
värde.
Uppgift 4.1 Skriv en funktion Trapets som beräknar en integral med trapetsmetoden. Funktionen
skall kunna anropas enligt
>> Ih = Trapets( @funk , a , b , N );
där [a, b] är intervallet, funk är den funktion som skall integreras, och N är antalet x-värden som
skall användas.
Vill du beräkna funktionen f (x) inne i din Trapets-funktion så använd feval.
Uppgift 4.2 Använd funktionen Trapets för att beräkna en approximation Ih av
Z π
sin(x2 )dx
I=
0
Du kan antigen skriva en ny funktionsfil som implementerar f (x) = sin(x2 ) eller skapa ett funktionshandtag. Vilket värde får du om du använder N = 100?
Svar:
Tips Du kan använda integral för att verifiera att din funktion ger rätt resultat.
6
Uppgift 4.3 Vi väljer nu att beräkna
Z
0
1
4
dx = π.
1 + x2
med hjälp av Trapetsregeln och vill undersöka hur felet i den beräknade approximationen av π
beror på antalet delintervall som används. Skriv ett program som beräknar felet E(h) = |I − Ih | i
Trapetsapproximationen för N = 10, 20, 30, . . . , 200.
Då ditt program är färdigt skall du alltså ha två vektorer: en vektor h som innehåller de steglängder
som använts och en vektor E som innehåller felen i trapetsapproximationen för respektive h-värde.
Använd loglog( h , E , ’rx’ ) för att illustrera felets beroende på steglängden. Beskriv grafens
utseende.
Svar:
Uppgift 4.4 Felet vid trapetsapproximation kan härledas genom Taylor utveckling. Det betyder
att felet kan uttryckas som
E(h) = C · hp ,
för något heltal p. Utnyttja att
log(E) = log(C) + p log(h) = c1 + c2 y = p1 (y),
y = log(h).
för att hitta de bästa parametrarna C och p med hjälp av minsta kvadratmetoden. Vi skall alltså
använda polyfit för att anpassa ett förstagrads polynom så bra som möjligt till vektorerna log(h)
och log(E). Bygg ut ditt program så att C och p beräknas enligt ovan.
Vilka värden på C och p får du? Parametern p borde bli ett heltal. Stämmer det med dina resultat?
Svar:
Plotta även de observerade felen (med röda x) och de fel som förutsägs av modellen med dina värden
för C och p. Använd loglog när du plottar.
Redovisa Skriv ut din funktion Trapets.m, huvudprogrammet som undersöker felets beroende på
h, samt grafen som illustrerar felen.
7