• No results found

Minsta kvadratanpassning med matrismetod

En minsta kvadratanpassning av m¨atdata till ett andragradspolynom y = a + bx + cx2 kan g¨oras om vi formulerar sambandet mellan variabelv¨arden xi, m¨atta v¨arden yi som en matrisoperation Y = X·A:

Minstakvadratmetoden ger d˚a en uppskattning av parametervektorn som ges av

A=(XT V−1 X)−1· (XT V−1 Y), vi f˚ar ¨aven en uppskattning av felen i parameterv¨ardena som ges av A=(XT V−1 X)−1 . Antag till exempel att vi med f¨orsumbart fel i x har m¨att f¨oljande y-v¨arden

7.7. MINSTA KVADRATANPASSNING MED MATRISMETOD 83

x 1 2 3 4 5 6

y 7.9 26.1 58.0 104.0 164.1 238.0

samt att felet i y-m¨atningen ¨ar 0.1. F¨or att finna det anpassade v¨ardet p˚a koefficienterna s¨atter vi in v˚ara v¨arden i matrisformalismen och ber¨aknar enligt receptet ovan. Vi har

Y =

vminus1 = eye(6) * 1/sigma∧2 ;

A=inv(X’ * vminus1 * X) * (X’ * vminus1 * y) DeltaA=inv(X’ * vminus1 * X)

Deltapar=sqrt(diag(DeltaA));

Det finns n˚agra teknikaliteter att begrunda i detta exempel. F¨orst m˚aste vi t¨anka p˚a att inte frestas att inludera ett minustecken i namnet p˚a covariansmatrisen. MATLAB tolkar V-1 som en instruktion att subtrahera V med enhetsmatrisen 1. Giltiga operatorer kan inte vara en del av variabelnamn! Sedan kan vi se hur vi i satsen d¨ar vi tilldelar v¨arden till matrisen X har anv¨ant den genv¨ag som MATLAB ¨oppnar f¨or oss och byggt en matris genom att kombinera kolumnvektorer. Eftersom vektorn x redan existerar s˚a ¨ar det mycket enklare att skapa kolumnvektorn med en rad ettor och kolumnvektorn med kvadraten p˚a elementen i x och sedan bygga matrisen fr˚an dem ¨an att bygga en matris genom att placera ut elementen ett och ett.

7.8 Ovningsuppgifter ¨

1. Pr¨ova att finna vilken matris som l¨oser ekvationen S = O · I givet I = 3 4

−2 1

! och

S = 17 19

22 38.5

! .

2. L¨os f¨oljande ekvationssystem:

4x - 5y + 3z = 22

x + 5y - 6z = -21

3x + y + 4z = 17

Anv¨and dig av att ekvationssystemet kan skrivas p˚a formen AX = B, d¨ar A ¨ar en k¨and matris, B en k¨and kolumnvektor, medan X ¨ar en ok¨and kolumnvektor vars komponenter x, y och z s¨okes.

3. Komplettera m-filen som visas i avsnitt 7.6 s˚a att ¨aven felen i de anpassade paramet-rarna a och b ber¨aknas som i problem 8.19 i Taylor.

Kapitel 8

Programmering

De m-filer som ni skapat tidigare under kursen ¨ar exempel p˚a sm˚a datorprogram. De har varit v¨aldigt arbetsbesparande, kanske mest f¨or att det har varit s˚a enkelt att ¨andra n˚agon liten detalj i en l˚ang ber¨akning utan att beh¨ova g¨ora om hela arbetet. Nu skall vi ta den processen ett steg l¨angre. Den stora arbetsbesparingen1 n¨ar man anv¨ander datorprogram kommer dels av att man kan f˚a en dator att utf¨ora monotona uppgifter utan att beh¨ova skriva ett kommando f¨or varje uppgift som skall utf¨oras, som n¨ar man anv¨ander en for-slinga f¨or att upprepa samma kommando flera g˚anger med olika v¨arden p˚a en variabel. Den andra stora besparingen kommer n¨ar man v¨anjer sig att skriva generella programsnuttar, som till exempel f¨or att ber¨akna normalf¨ordelningen, som sedan kan anv¨andas som delprogram av andra program. I det h¨ar passet skall vi g˚a igenom vad man beh¨over t¨anka p˚a f¨or att skriva bra program, och de viktigaste kommandon som vi kommer att beh¨ova.

8.1 Att programmera

Att programmera ¨ar en konst man beh¨over l¨ara sig. Hur man b¨ast skall g¨ora det ¨ar naturligtvis v¨aldigt individuellt, men de allra flesta kommer ganska l˚angt med att tr¨ana genom att skriva de program man f¨or stunden har behov av. Men det finns ocks˚a en om-fattande litteratur och teoribildning om hur bra datorprogram skall vara konstruerade. Man skall vara medveten om att kunskap om att programmera och kunskap om ett program-meringsspr˚ak inte beh¨over vara samma sak. Man m˚aste sj¨alvklart kunna MATLAB-spr˚aket ordentligt f¨or att kunna skriva bra MATLAB-program, men det ¨ar inte tillr¨ackligt. Omv¨ant kan man p˚a en abstrakt niv˚a designa ett program utan att veta ett dyft om det programmer-ingsspr˚ak programmet sedan implementeras i. Den h¨ar kursen har en praktiskt/pragmatisk inriktning, vi kommer inte att g˚a in p˚a teorin kring programmerandet utan f¨ors¨oker l¨ara genom exempel. Vi skall dock i detta kapitel ta upp vissa saker som ¨ar bra att f¨ors¨oka att h˚alla i huvudet n¨ar vi b¨orjar skriva program. F¨or att exemplifiera de olika elementen skall vi skriva en allm¨an rutin som ber¨aknar primfaktorer f¨or ett givet tal.

8.1.1 Design av programmet

Den viktigaste delen av programmerandet b¨orjar egentligen innan vi skrivit ett enda MATLAB-kommando, n¨amligen design-fasen. Innan vi b¨orjar skriva in en massa MATLAB kommandon b¨or man sitta ned och t¨anka igenom vilka steg programmet skall utf¨ora, i vilken ordning och vad som ¨ar de m¨ojliga utfallen under det att programmet k¨or. Nuf¨ortiden finns det program

1Kom ih˚ag att arbetsbesparingen i m˚anga fall kan vara s˚a stor att den f¨orvandlar n˚agonting som varit fullst¨andigt om¨ojligt att g¨ora till n˚agot som g˚ar att genomf¨ora. Det ¨ar allts˚a inte bara fr˚agan om att g¨ora samma saker snabbare och l¨attare, man kan g¨ora helt nya saker ocks˚a!

85

som hj¨alper till i den h¨ar fasen och som ibland till och med skriver programkoden automa-tiskt n¨ar man v¨al en g˚ang p˚a ett symboliskt s¨att best¨amt vad programmet skall utf¨ora. Men man kommer ganska l˚angt med ett gammalt hederligt fl¨odesschema, en slags ”ritning” ¨over programmet. Det finns v¨al definierade regler f¨or hur man skall rita ett fl¨odesschema, h¨ar skall vi inte g˚a in i n˚agra detaljer2 utan f¨oljer bara konventionen att beslut fattas i rombiska boxar, medan processer sker i vanliga rektanglar. Som exempel visar vi ett fl¨odesschema f¨or ett program som ber¨aknar primfaktorer f¨or ett godtyckligt tal:

Bara genom att g¨ora en s˚adan h¨ar enkel liten skiss dyker det upp m˚anga viktiga aspekter av programmet som man kanske inte t¨anker p˚a fr˚an b¨orjan, som till exempel att vi m˚aste avdela en variabel f¨or att lagra de primfaktorer som poppar upp. Vi ser ocks˚a tydligt vilka data som skall in i programmet (x, det tal vi s¨oker faktorer f¨or) och vad som skall ut (antal primfaktorer och vilka de ¨ar). Vi ser ocks˚a att en viss del av koden kommer att upprepas ett stort antal g˚anger f¨or olika v¨arden p˚a variabeln i.

Studerar man schemat en stund till inser man att programmet, som det ¨ar designat i figuren, kommer att testa alla faktorer udda som j¨amna vilket naturligtvis inte ¨ar n¨odv¨andigt eftersom den enda m¨ojliga j¨amna faktorn ¨ar tv˚a. Det ¨ar d˚a dags f¨or steg 2: omdesign. I det h¨ar fallet v¨aljer man l¨ampligen att f¨orst testa p˚a faktorn tv˚a tills man har ett udda tal kvar, och sedan testa fr˚an 3 och upp˚at med alla udda tal (byt i = i + 1 mot i = i + 2).

Ett bra fl¨odesschema skall bryta ned programmet i avskilda block som utf¨or en specifik uppgift, visa vilka grenpunkter (villkor) som finns i programmet och hur dessa leder till att olika delar av koden utf¨ors. Vidare skall vilka data som utbyts mellan programmet och dess omgivning - det s˚a kallade gr¨anssnittet - vara tydligt.

2I Microsoft Words ritverktyg finns under ”Figurer” en sub-meny som inneh˚aller olika symboler f¨or ett fl¨odesschema.