• No results found

Pass 5 - Litet om text-strängar, mer beräkningar, anpassningar

7.1 MATLABs Workspace Browser

En MATLAB-session resulterar oftast i en workspace fylld av temporära variabler som det till slut kan bli ganska besvärligt att hålla reda på. MATLAB har ett verktyg -Workspace Browser - som enkelt ger en god överblick av vilka variabler som finns i workspace, vilka värden de har för tillfället och som dessutom ger oss möjlighet att manipulera dessa variabler. Vi startar Workspace Browser antingen genom att skriva workspace i kommandofönstrer, eller genom att gå in i meny "View" i MATLABs desktop och klicka för "workspace" som då kommer upp som en pany i desktopen. Workspace Browsern öppnar då sitt fönster där vi kan se alla variabler som f i n n s i MATLABs workspace, vi ser namnet på variabeln, vilka dimensioner (rad x kolumn) den har,hur stort lagringsutrymme som går åt för att spara variabeln och vilken typ av variabel det är.

Om man tycker att n å g o n a v d e s s a kolumner är helt ointressant kan man i menyn "Workspace View Options" under "View" styra utseendet av detta fönster. I wokr space browsern kan vi utföra ett antal operationer:

Spara workspace eller variabler.

Om vi trycker på "spara-ikonen", den som ser ut som en liten diskett så sparas hela innehållet i workspace i en fil som vi senare kan läsa in. Alternativt kan vi i "File" menyn välja "Save As". Detta sätt att spara är nödvändigt om vi redan har sparat workspace men vill spara en annan kopia under annat namn. Trycker vi på ikonen används det gamla namnet om det är definierat. Vi kan också välja att spara enskilda variabler. För att göra detta väljer vi variablerna genom att klicka på dem i browserfönstret Vill du välja mer än en och dessa följer efter varandra i listan så klickar du först på den första och sedan klickar du på den sista variabeln samtidigt som du håller nere skift-tangenten. Då väljs alla variabler mellan den första och sista. Vill du välja ett antal variabler som inte ligger bredvid varandra i listan så håller du nere kontroll-tangenten samtidigt som du klickar. När du valt alla variabler du vill spara så "högerklickar" (klickar med den högra musknappen) någonstans i fönstret. I den menyn som då kommer upp väljer du "Save selection as" och väljer sedan en katalog och filnamn där variablerna sparas.

Läsa in variabler som tidigare sparats från en fil in i din workspace.

Klicka antingen på mapp-ikonen på verktygslisten eller högerklicka i fönstret och välj "Import Data".

Rensa bort variabler från workspace

gör du genom att först välja dem på samma sätt som när du vill spara variabler och sedan antingen

• Klicka på soptunnesymbolen i verktyslisten

• Välja "Delete" i "Edit" menyn

• Högerklicka i fönstret och sedan välja "Delete Selection"

7.1.1 Array Editorn

Vi kan gå in och studera en variabel i detalj genom att öppna ett fönster som kallas "Array Editor".

Om du vill undersöka en enda variabel så kan du öppna den i "Array Editorn" genom att dubbelklicka den i "Workspace Browser"-fönstret. Vill du arbeta med fler än en variabel får du välja dessa som ovan och sedan klicka på symbolen till höger om disketten på verktygslisten. I det fönster som öppnas kan du se vilket värde varje element i variabeln har, men du kan också gå in och ändra godtyckliga värden. Det gör du genom att klicka i motsvarande ruta, skriva in det nya värdet och trycka på

"Return". Du kan också ändra variabelns dimensioner (rad x kolumn) genom att på motsvarande vis ändra värdena i motsvarande ruta på verktygslisten. Där kan du också ändra med vilken numerisk precision värdena visas. Mer information om möjligheterna i detta fönster får du i hjälpavsnittet

?/MATLAB/Using¬MATLAB/Development¬Environment/Workspace,¬Search¬Path,¬and¬File¬Operati ons/MATLAB¬Workspace/Viewing and Editing Workspace Variables.

7.2 Anpassa MATLABs Desktop

Vartefter vi börjar använda fler och fler av MATLABs fönster så kan vi vilja ställa in MATLABs desktop så att vad vi ser på skärmen är det vi tycker är mest bekvämt att jobba med. Vilka fönster som skall finnas öppna väljer vi i menyn "View", de fönster som är förbockade i nedre delen av menyn kommer att öppnas. Storleken på desktop, eller andra fönster, kan vi reglerea genom att högerklicak i fönstret. I menyn som då kommer upp kan vi välja "size" och därefter peka på fönstrets nedre högra hörn, det område som är räfflat. Om vi trycker ned musknappen där och håller den nedtryckt medan vi drar musen så kommer fönstrets storlek att ändras, det hörn vi klickat på "följer med" medan det motstående hörnet ligger still. Vi kan sedan växla mellan denna storlek och full skärm genom att trycka på den mittersta av det tre symbolerna som finns längst upp till höger. Trycker du på den vänstra av de tre symbolerna så förminskas fönstret till en liten ikon längst ned på skärmen. Du kan gonom att klicka på ikonen få upp fönstret igen. Klickar du på symbolen längst till höger som ser ut som ett kryss så stängs fönstret. Förutom ett kryss för själva desktop så finns det ett kryss för varje fönster i desktop, du kan alltså välja om du skall stänga hela desktopen eller ett enskilt fönster i denna.

Om du vill ändra på den relativa storleken på de olika panåer som visas i MATLABs desktop så går det att göra genom att föra pekaren till gränsen mellan de olika panåerna och trycka ned musknappen.

Pekaren förvandlas då till en dubbelpil. Om du då drar pekaren så följer gränsen mellan panåer med, du kan på så sätt göra en del av MATLABs desktop större på bekostnad av andra panåer.

Det går att flytta runt de olika fönstren inom MATLABs desktop. Det gör man genom att klicka på ett fönsters titel-list (högst upp) och hålla musknappen nedtryckt. Om du nu flyttar pekaren så kommer en ram runt fönstret att röra sig med pekaren, och när den kommer till ett ställe i desktop där den kan förankras så kommer den att "snäppa till". Om du då släpper upp musknappen så har fönstret flyttat till den nya platsen. Prova!

Ett fönster som ligger i desktopen (är "dockat") kan flyttas ut från denna till att bli ett fritt fönster, som så ofta så finns det fler sätt att göra detta på, du kan antingen klicka på pil-symbolen som syns här till höger, du kan också dra fönstret som när du vill flytta det inom desktopen, men inte

släppa musknappen förrän fönstret är utanför desktopen. Slutligen kan du, om fönstret är det aktiva, gå in i "View" menyn och välja "Undock". Vill man istället "docka" ett fönster som flyter fritt till

MATLABs desktop gör man det fönstret aktivt och väljer sedan "Dock" i "View" menyn.

Som vi redan sett exempel på så kan flera fönster dela samma del av MATLABs desktop, i det läget finns det små flikar med respektive fönsters namn på i underkant av det fönster. Genom att klicka på den fliken kan man växla mellan de fönster som delar på den delpanån. Om man vill gruppera fönster inom desktop så klickar man med musknappen på ett av fönstrens titellister, drar den på det andra fönstrets titellist och släpper musknappen när konturen överlappar och flikarna dyker upp i underkant.

Det finns ett antal standardkonfigurationer för desktop, du kan välja bland dessa genom att gå in i

"View" menyn och välja "Desktop Layout". Mer komplett information MATLABs desktop får du i

?/Development¬Environment/Using¬the¬Desktop

7.3 Text-strängar

Vi har hitills endast sett den enklaste formen av en text-sträng: a = 'Detta är en textsnutt'. Det finns många kommandon som kan användas för att omvandla numeriska variabler till strängar och utföra andra operationer på strängvariabler. Här kommer vi bara att gå in på några få av dessa som utför litet enklare manipulationer av strängar. I nästa avsnitt skall vi lära oss hur vi formatterar in- och utmatning, vill du lära dig mer om stränghantering kan du läsa avsnittet

?/Using¬MATLAB/Programming¬and¬Data¬Types/Caracter¬Arrays i hjälpavsnittet.

7.3.1 Manipulera textsträngar

Det är möjligt att lägga ihop två text-strängar till en längre sträng, men kanske inte riktigt som man först kan tro. Tag till exempel a = 'detta är ' och b = 'en textsträng'. Lägger vi dem bredvid varandra som i kommandot c = 'detta är ' 'en textsträng' händer något intressant, prova! Det här illustrerar en annan sak vi kan behöva tänka på: eftersom enkelt citations-tecken utgör start- och slutcitations-tecken för en sträng så måste vi göra något särskilt för att kunna skriva ut det tecknet i en text-sträng. Detta "något särskilt" är att vi skriver två tecken efter varandra. Prova att skriva ut strängen 'För att skriva ut '' måste man dubblera'. För att kunna sätta ihop två strängar till en längre sträng, konkatenera (engelska concatenate) måste vi använda en syntax där det på något sätt framgår att de två citationstecknen som följer på varandra inte betyder att vi vill skriva ut det tecknet, det gör vi genom att omsluta de strängar som skall läggas ihop med hakparanteser: c = ['detta är ' 'en textsträng'] fungerar, liksom c = [a b].

7.3.2 Delsträngar

Vad vi inte berörde tidigare var att internt så lagras varje text-sträng som en vektor på vilken vi kan operera med som vi gör med numeriska vektorer12 vi kan på vanligt sätt adressera delar av dem:

»a = 'Detta är en textsnutt' a =

Detta är en textsnutt

12 I sjäva verket lagras text-strängen som en numerisk vektor - varje tecken som finns på tangentbordet har en standardiserad numeriska kod - ASCII kod, a=97, A=65. Functionen abs('sträng') ger ASCII koden för strängen om du är nyfiken.

»length(a) ans = 21

»a(7:11) ans = är en

En nyttig funktion när vi manipulerar delsträngar är k=findstr(S1,S2). Detta kommandot söker efter den kortare av strängarna S1 och S2 i den längre och returnerar en vektor k som innehåller index för alla förekomster av den kortare strängen. Antag att S = 'En ensam enörning' så ger kommandot k = findst('en',S) resultatet 4 10. Notera att 1 inte ingår i svaret, findstr är känslig för versal/konsonant (detta kallas på engelska case sensitive). I följande exempel anväder vi findstr för att hitta ett filnamn i en textsträng. Vi vet att filnamnet kommer efter ordet "namnet" och avslutas med ".m"

»a='Den angivna filen har namnet resistor4.m, vilket är sökbart';

»hitta1=findstr(a,'namnet ');

»hitta2=findstr(a,'.m');

»filnamn=a((hitta1+length('namnet ')):(hitta2+1)) filnamn =

resistor4.m

Att hitta filnamnet i en sträng som skrivs in för hand i programmet är väl inte så intressant men metoden i exemplet kan användas för att leta reda på till exempel ett filnamn som kan ha getts i en in-matningsrad från en användare. Detta namn kan sedan användas när vi i en m-fil sparar data till hårddisken

7.4 Enkel statistik

MATLAB är i allmänhet mycket bra på att hantera matriser och vektorer. Det lönar sig att försöka att konsekvent utnyttja det när vi behandlar data. Antag till exempel att vi gjort en serie mätningar(3.6, 5.4, 2.8, 8.3, 3.7, 4.2, 6.1, 4.1, 3.8, 2.3) och vill beräkna medelvärde och standardavvikelse för dessa.

Vi an då naturligtvis göra detta genom att tilldela 10 olika variabler dessa värden: x1 = 3.6, x2=5.4, x3=8.3 ….. och sedan beräkna <x> = (x1 + x2 + x3 +…..+x10)/10, och sedan fortsätta på motsvarande sätt för standardavvikelsen. Men det är mycket enklare att istället fylla en vektor med mätdata och sedan operera på vektorn:

»medel = sum(x)/length(x)

»diff = x - medel

»diff2 = diff.^2

»sigma = sqrt(sum(diff2)/(length(x)-1))

Ännu enklare är givetvis att använda de inbyggda funktionerna mean(x) och std(x), men innan ni gör det måste ni en gång ha kodat detta för hand!

7.5 Polynom

MATLAB har några inbyggda funktioner för att hantera polynom, för en fullständig beskrivning hänvisas du till ?/MATLAB/Using¬MATLAB/Mathematics/Polynomials¬and¬Interpolation. Vi går här igenom några av de viktigaste funktionerna.

7.5.1 Hitta rötter till polynom.

Givet ett polynom som till exempel y = 3x2 -7x + 4, så beräknas rötterna (nollställena) till polynomet med funktonen roots(p) där p är en vektor med koefficienterna för varjet term i fallande ordning.

Notera att om någon koefficient är noll så måste detta explcit anges med en nolla på rätt ställe i vektorn p.

» p = [3 -7 4];

» roots(p) ans =

1.3333 1.0000

7.5.2 Finn polynomuttryck för givna rötter

Om vi omvänt har ett antal nollställen i en vektor n så ger oss funktionen poly(n) det polynom som har dessa rötter:

» n =[-2 1 4 7];

» poly(n) ans =

1 -10 15 50 -56

vilket alltså uttyds som polynomet x4 -10x3 + 15x2 + 50x - 56.

7.5.3 Värden på polynom

Värdet för ett polynom med koefficientvektor p i punkten x ges av polyval(p,x):

»m =[3 -2 4 1];

»polyval(m,4.2) ans =

204.7840

7.5.4 Derivator av polynom

Att derivera ett polynom är naturligtvis inte särskilt svårt att göra utan MATLABs hjälp. Det kan dock ibland när man skriver generella program vara behändigt att ha en funktion till hands för detta, i

MATLAB heter den polyder(n).

7.5.5 Produkter och kvoter av polynom

MATLAB beräknar gladeligen produkter av två polynom med funktionen conv(a,b), samt kvoten mellan två polynom med funktionen deconv(a,b). För mer information använder du hjälp-funktionen.

7.6 Matrisekvationer

Vi har många gånger i detta kompendium tjatat om hur bra MATLAB är för matrisberäkningar. Nu skall vi titta litet närmare på detta fält. Vi börjar med några enkla exempel. Inversen A-1 till matrisen A är en matris så att A-1 * A = 1. I linjär algebar har vi lärt oss metoder för att beräkna inversen till

2 1 . MATLAB-användare kan slöa litet och istället använda sig av kommandot inv:

Om ni provar ovanstående beräkningar i formatet short g så förstår ni varför jag valde att byta format:

eftersom den numeriska precisionen hos datorn är begränsad till ett visst antal decimaler så blir svaret oftast inte riktigt exakt 1 när man kontrollräknar. För att slippa veta att elementet i nedre högra hörnet skiljer sig från 0 i 17:e decimalen kan format short vara att föredra.

Många fysikaliska fenomen kan beskrivas i matrisformalism som att en matris som representerar en operation appliceras på ett initialtillstånd och resulterar i ett sluttillstånd, vi kan skriva det som en matrismultiplikation: S = O * I. Vi kommer då ofta att söka värden på den operator O som resulterar i sluttillståndet S givet ett initialtillstånd I. Det här kan låta väldigt abstrakt, och många gånger är det

väl också på det viset. Men beräkningsmässigt handlar det om att vi känner matrisen I och S (ofta kolumnvektorer) så söker vi matrisen O som satisfierar ekvationen ovan. Detta problem löser vi genom att multiplicera med lämpliga inverser - från rätt håll: S * I-1 = O * I * I-1 = O. Pröva att finna vilken matris som löser ekvationen givet I= S

Vi har sett att om antar att en uppsättning mätpunkter (xi, yi) uppfyller sambandet y = a + bx så kan vi med hjälp av maximum likelihood principen finna att den bästa (i meningen att summan av de kvadratiska avvikelserna minimieras) uppskattningen av parametrarna a och b ges av:

a wx wy wx wxy

Dessa ekvationer är relativt enkla att lösa med hjälp av MATLAB. Låt oss exemplifiera genom att lösa en variation på uppgift 8.13 i Taylor, där vi skall anpassa mätdata givna i tabellen till uttrycket s = s0 + vt.

Tid (s) -3 -1 1 3

Postition (cm) 4.0 7.5 10.3 12.0 Osäkerhet i

position (cm) 0.5 0.6 0.7 1.1

Felet i tiden är negligerbart. För att utföra anpassningen måste vi beräkna ett antal termer av typen Σwx vilket är relativt enkelt med MATLABs vektoroperationer och elementvisa operatorer. Summan är ju uppbyggd så att först skall varje element i w multipliceras med motsvarande element i x, därefter skall dessa produkter summeras. Vektoroperationen wx = w .* x utför den första av dessa operationer och skapar en ny vektor där elementen är produkten av motsvarande element i w och x vektorerna. Vi kan sedan enkelt summera dessa genom att applicera vektoroperatorn sum på denna vektor. Vi får alltså något i stil med

% linfit.m

x=tid; y=position; sigma=DelatPos;

a = (sumwx2*sumwy - sumwx*sumwxy) / delta b = (sum(w)*sumwxy - sumwx * sumwy) / delta

Man kan givetvis hoppa över steget där vi går ifrån t.ex. "tid" till "x", har har jag valt att ha med det steget för att göra det hela tydligare. Vi kommer senare se hur vi skall skriva den del av koden som gör själva anpassningen som en allmän funktion som i stort sett ser ut som den del av koden som kommer efter de kommandon där vi byter variabelnamn. Det blir då naturligt att funktionen internt arbetar med variablerna x,y,w, och att den m-fil som kallar funktionen gör det med de variablenamn som är de som används i problemformuleringen.

Eftersom det hela finns sparat i en m-fil kan vi enkelt verifiera att vi reproducerar de resultat som anges i facit i boken om vi sätter alla vikter till 1, dvs sätter alla fel till 1.

När vi ändå är igång är det lämpligt att plotta den kurva vi får ur anpassningen och data i samma graf:

xmin = min(x) - 1; för att omfatta de mätta punkterna och med lagom med luft mellan data och kanten av grafen utan att vi gör några antaganden om vare sig vilka värden mätdata antar eller om hur många punkter som är mätta. Det är en god vana att försöka skriva sin kod på det viset. Just anpassning till en rät linje är ju ett exempel på en uppgift som vi skall lösa många gånger i olika sammanhang. Det är därför bra att ha en m-fil som löser den uppgiften under så allmänna förutsättningar som möjligt.

7.8 Minsta kvadratanpasning med matrismetod

En minsta kvadratanpassning av mätdata till ett andragradspolynom y = a + bx + cx2 kan göras om vi formulerar sambandet mellan variabelvärden xi, mätta värden yi som en matrisoperation Y = X•A:

 Vi definierar dessutom en viktmatris:

Minsta-kvadratmetoden ger då en uppskattning av parametervektorn som ges av

A=(xT V-1 X)-1*(XT V- 1 Y), vi får även en uppskattning av felen i parametervärdena som ges av

∆A=(xT V-1 X)-1 . Antag till exempel att vi med försumbart fel i x har mätt följande y-värden

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ätningen är 0.1. För att finna det anpassade värdet på koefficientern sätter vi in våra värden i matrisformalismen och löser enligt receptet ovan. Vi har

Y= X V1

kodat i MATLAB blir detta:

x=[1 ; 2 ; 3 ; 4 ; 5; 6];

y=[7.9 ; 26.1 ; 58.0 ; 104.0 ; 164.1 ; 238.0];

X=[ones(6,1) x x.^2];

sigma = 0.1 ;

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

A=inv(X' * vminus1 * X) * (X' * vminus1 * y)

Det finns några teknikaliteter att begrunda i detta exempel. Först måste vi tänka på att inte frestas att inludera ett minustecken i namnet på covariansmatrisen. MATLAB tolkar V-1 som en instruktion att subtrahera enhetsmatrisen från V. Giltiga operatorer kan inte vara en del av variabelnamn! Sedan kan vi se hur vi i satsen där vi tilldelar värden till matrisen X har använt den genväg som MATLAB öppnar för oss och byggt en matris genom att kombinera kolumnvektorer. Eftersom vektorn x redan existerar så är det mycket enklare att skapa kolumnvektorn med en rad ettor och kolumnvektorn med kvadraten på elmenten i x och sedan bygga matrisen från dem än att bygga en matris genom att placera ut elementen ett och ett. Slutligen har vi här smugit in en for-slinga (eng. for-loop) när vi beräknar värdet för parametranna Deltapar;

for i=1:3

Deltapar(i) = sqrt(DeltaA(i,i));

end

I nästa kapitel skall vi på allvar börja använda for-slingan, just nu nöjer vi oss med att konstatera att de kommandon som står mellan for och end upprepas en gång för varje värde på variabeln i som vi

definierar i slutet av "for-raden", i det här fallet alltså med i=1,2 och 3. Mer om fördelarna med att använda for-slingor i nästa kapitel.

7.9 Övningsuppgifter

1. Komplettera m-filen som visas i avsnitt 7.7så att även felen i de anpassade parametrarna a och b beräknas som i problem 8.19 i Taylor.

Related documents