STOCKHOLMS UNIVERSITET 2001-10-22 MATEMATISKA INSTITUTIONEN Avd. Matematisk statistik Anders Björkström GRUNDLÄGGANDE MATLAB-TRÄNING för den som aldrig har arbetat med Matlab förut A. Matlabs allmänna egenskaper. Tag Lennart Edsbergs "Användarhandledning för Matlab version 5.3" (eller 5.2) med dig, sätt dig vid en av Mackarna i elevdatorsalen och starta Matlab. Bläddra fram till avsnitt 10 (sidan 31) och följ instruktionerna för avsnittet "Inledande laboration". Genomför i första hand delarna 1 (Matlab som kalkylator), 2 (Funktionstabeller), 3 (Grafik), 6 (Vektorer) och 8 (Matriser). Detta är de delar som vi kommer att ha mest nytta av. B. Slumptal i Matlab Vi kommer att använda Matlabs generator för slumptal.variabelnamnet rand innehåller ett slumptal från den likformiga fördelningen mellan 0 och 1. Varje gång namnet används får man ett nytt värde, och alla utfall är oberoende. Namnet randn ger ett slumptal från en normalfördelning(0,1). Pröva att skriva rand efter prompten (>>) och se vad effekten blir. Både rand och randn kan även ge matriser: Skriver man t.ex randn(2,3) så får man en matris med två rader och tre kolonner, vars alla element är oberoende och normalfördelade(0,1). Observera att randn* randn kan bli ett negativt tal! (Du inser naturligtvis orsaken till detta) C. Stokastiska processer, ett enkelt exempel Matlab är ett utmärkt program för att studera förlopp som utvecklar sig med tiden på ett slumpartat sätt. Vi går direkt till ett exempel. På ett nöjesfält finns ett spel där man får satsa ett valfritt belopp. Man kan antingen vinna eller förlora. Om man vinner får man tillbaka dubbla insatsen, annars ingenting. Chansen att vinna är 40 %. En strategi som vissa tycker är genial är den här: Vi satsar först en krona. Vinner vi då så står vi på plus, och då går vi hem nöjda. Annars satsar vi två kronor i nästa omgång. Vinner vi då så får vi 4 kronor, och eftersom vi har betalat 1+2=3 kronor i insats så har vi gått med en krona i vinst. Så länge vi inte har vunnit fördubblar vi insatsen och spelar igen. Även om chansen att vinna är mindre än hälften vid varje enskild omgång så kommer vi naturligtvis förr eller senare att vinna. Man kan ganska lätt räkna ut att efter den första vinsten har man en krona mer än man startade med. (Säg att den första vinsten kommer i den n:te spelomgången.
Då har vi sammanlagt betalat 1 + 2 + 4+... +2 n 1 kronor i insatser, vilket är lika med 2 n 1. Men vår vinst blir ju 2 n kronor, så vi har gjort en nettovinst på en krona. ) Vi har alltså hittat ett säkert sätt att vinna pengar på det här spelet!? Det farliga med den här metoden är att det skulle kunna hända att vinsten dröjer så länge att insatsen blir större än vad vi har råd att betala. Nu ska vi genom praktiska försök undersöka om detta är ett allvarligt fel med metoden. I stället för att riskera vårt eget spar använder vi Matlabs slumptalsgenerator. Vi startar med ett som är hundra tusen kronor. Skriv såhär: =100000 så lagras värdet 100 000 i variabeln. Sen ska vi betala en insats som är 1 krona, och det gör vi genom att skriva följande två tilldelningssatser: insats=1 =-insats Nu är det dags att spela. Vi har 40% chans att vinna, och om vi vinner ökar vårt med dubbla insatsen. Uttryckt med hjälp av Matlab kan vi skriva såhär: =+2*insats end När en rad börjar med ordet if så väntar Matlab tills en rad som lyder end har matats in. Då kontrolleras om påståendet som följer efter ordet if är sant. I så fall exekveras alla tilldelningssatser fram till end, annars hoppas de över. I det här fallet avgör slumpen om et kommer att öka med dubbla insatsen eller ej. Eftersom rand ger ett slumptal som är likformigt fördelat mellan 0 och 1 så är sannolikheten 40% att påståendet rand<0.4 är sant. Satserna efter ordet if utformas enligt enkla regler. Vid behov kan du läsa mer om dessa på sidan 12 i Edsberg. Om vi vinner i den här spelomgången så kommer Matlab att skriva ut det nya värdet på variabeln (100001), annars skrivs ingenting ut. För att bekräfta att et fortarande står kvar på 99999 kronor kan vi skriva vilket kommer att ge svaret = 99999
Om vi nu inte vann så ska vi fördubbla insatsen, betala en ny insats och spela igen. Vi skriver först de här båda raderna: och spelar sedan en gång till: =+2*insats end Vi behöver upprepa dessa fem rader ända tills det antingen kommer en vinst eller vi inte har råd att betala insatsen längre! Det kan vi göra antingen genom att lagra de fem textraderna i Urklipp, och klistra in dem i Matlab så många gånger som det behövs. Prova det! Ett annat sätt att göra samma sak är att använda en såkallad while-slinga: while >=insats =+2*insats; Några förklaringar till ovanstående program: När en rad börjar med ordet while så kontrolleras om påståendet på raden är sant. Om det är sant så exekveras alla kommandon fram till motsvarande end. Därefter återvänder programmet till while-raden och kontrollerar återigen om påståendet är sant. Detta upprepas hur många gånger som helst. Tecknet >= betyder "större än eller lika med". Om den första vinsten dröjer alltför länge så upphör ju >=insats att vara sant så småningom. Instruktionen break avbryter en while-slinga. Matlab kommer att påträffa denna instruktion kommer så snart det blir vinst i en spelomgång. Med största sannolikhet är det på detta sätt som while-slingan kommer att avslutas. För att få veta om spelet slutade med att vi vann en krona eller gjorde konkurs så kan vi be programmet att skriva ut vårt. Därför står ordet "" på sista raden ovan.
Om vi inte har haft mycket stor otur så är vårt nu 100001 kronor. Glada i hågen startar vi på nästa djärva etapp: Att öka et till 100002 kronor. Då återställer vi insats till 1 krona och kör programmet en gång till, med =100001 från början. Med stor sannolikhet klarar vi att gå vidare till 100003, 100004 kronor, osv, utan att göra konkurs. Låt oss undersöka om vi lyckas komma upp i de belopp som man i dagligt tal tänker på när man talar om att vinna pengar på lotteri, alltså inte bara några futtiga kronor utan åtminstone så mycket att vi kan gå ut och göra oss en glad kväll på krogen. Vi upprepar proceduren ovan 500 gånger. Om det slutar lyckligt har vi en femhundring att gå ut och festa för. =100000; while <100500 % Påbörja ny etapp, mot ännu en kronas vinst: insats=1; while >=insats =+2*insats; if <insats disp('fiasko! ') Kommentarer: Rader som börjar med %-tecken hoppar Matlab över. Sådana rader kan man lägga in i programmet för att själv komma ihåg vad de olika avsnitten gör. disp är en förkortning av display. Texten mellan blipparna skrivs ut. Om försöket att nå 100500 kronorsnivån misslyckas så kommer programmet att skriva ut ordet Fiasko och dessutom tala om för oss hur mycket vi har kvar av vårt spar, som en gång i tiden var 100 000 kronor.
Besvara nu följande fråga genom simulering: Om 25 personer äger 100 000 kronor var, och alla försöker öka sitt till 100500 kronor, hur många av dem kommer då att lyckas? Uppskattningsvis hur många procent är risken att det slutar med fiasko, baserat på dina simuleringar? Hur mycket pengar återstår i genomsnitt av de andra stackarnas? D. Efterarbete Efter en simuleringsövning skall man alltid tänka efter om resultaten verkar rimliga. Gå därför hem och fundera på hur stor risken för ett fiasko är, teoretiskt. Varje gång man försöker öka sitt med en krona finns en liten risk att man gör konkurs i stället. För att lyckas vinna 500 kronor måste man undvika denna lilla risk 500 gånger i följd. Hur sannolikt är det? (Använd miniräknare!) Stämmer teori och fakta överens? Skulle du själv vara beredd att ta den här risken att förlora ditt spar för chansen att vinna en femhundring?