Enkla loopar och if-satser

I denna laboration kommer några inledande övningar på repetitionssatser och alternativsatser.

Skapa programmen med Matlabs editor. Kalla t.ex. filen lab1.m. Du kör kommandona på filen t.ex. genom att i Matlabs kommandofönster skriva lab1 . Skapa bara så kallade script-filer (m-filer), dvs. använd inte funktionsfiler (om du har sett sådana). Tids nog kommer vi till funktioner, men de krånglar bara till programmeringen så här i början.


 
Monte Carlo-metoder är en klass av metoder där man använder slumptal för att approximera lösningen till vissa beräkningsproblem, t.ex. inom statistisk mekanik. I följande uppgift kommer du att använda en primitiv Monte Carlo-metod för att approximera en area och på detta vis beräkna en dålig approximation av talet pi. Lite förbättrade varianter av denna idé kan t.ex. användas för att approximera multipelintegraler över komplicerade områden (multipelintegraler kommer i kursen i flervariabelanalys).

Funktionen rand returnerar ett slumptal i intervallet [0, 1). Slumptalen är likformigt fördelade (alla talen i intervallet är lika sannolika). Talen verkar slumpmässiga, men är i själva verket förutsägbara, de är nämligen genererade av en deterministisk algoritm, en slumptalsgenerator. Man talar om pseudoslumptal. Om man använder samma startvärde(n) till slumptalsgeneratorn (man talar om frö, eng. seed) så kommer man alltid att få samma sekvens av slumptal.

Så, när jag startar Matlab får jag:

>> rand
ans = 8.1472e-01
>> rand
ans = 9.0579e-01

och startar jag om Matlab får jag samma slumptal igen. Detta är ofta önskvärt när men villa avlusa (hitta fel) i program t.ex. Det går att ändra fröet och få andra slumptalssekvenser, men vi går inte in på det i den här kursen.

Problem
Tänk dig att du kastar pil mot en cirkulär piltavla (radie en halv längdenhet), uppsatt på en kvadratisk skiva med sidan 1 längdenhet (det gröna området, utanför piltavlan, i bilden till höger). Antag att pilen träffar piltavla eller skiva (om vi missar piltavlan) i punkten (x, y), som är två slumptal. Om vi kastar många pilar så kommer andelen kastade pilar som träffar piltavlan dividerat med totala antalet pilar att approixmera pi / 4 (varför?).
 
Skriv ett Matlabprogram som använder denna idé för att approximera pi. Approximationen och felet (avvikelsen från pi) skall skrivas ut. Notera att pi är fördefinierat i Matlab.
En nackdel med Monte Carlo-metoder är den långsamma konvergensen, så du får utföra många pilkast, åtminstone en miljon, för att få en hyfsad approximation av pi.
Måltavla


Problem
Använd samma idé för att approximera integralen av (1 - x3)(1/3) då x tillhör intervallet [0, 1]. Om du läser kursen i numerisk analys kommer du att få se oerhört mycket effektivare metoder för att lösa denna typ av problem.

Nu till ett annat sätt att approximera pi.
Problem
355 / 113 är en rätt bra (och mycket gammal) approximation av pi. Låt p och q vara positiva heltal. Skriv ett Matlabprogram för att hitta det minsta värdet på q (och tillhörande p) som uppfyller villkoret
| p / q - pi | < | 355 / 113 - pi |
dvs hitta den första rationella approximationen, av pi, som är bättre än 355 / 113. Observera att q står i nämnaren och inte i täljaren.

Ledning: några av följande funktioner kan (beroende på hur man löser problemet) vara användbara, pi, abs, ceil, floor, round.

Man kan approximera pi (eller vilket annat reellt tal som helst) godtyckligt noga med ett rationellt tal, det är bara att använda tillräckligt stora p och q. En finess med 355 / 113 är att man har en bra approximation med få siffror i täljare och nämnare, approximationen är ekonomisk i denna mening. I nästa uppgift kommer du att hitta ekonomiska approximationer av e = exp(1).

Problem
Låt ndig(q) vara antalet siffror i q, så ndig(519) = 3, ndig(3322) = 4 etc. Skriv ett Matlabprogram för att bestämma den bästa approximationen, p / q, av exp(1) när ndig(q) = 1, 2, 3, 4, 5 respektive 6. Om det finns flera (p, q)-par (för ett givet värde på ndig(q)) som ger samma värde på felet, skriv då ut (p, q)-paret med minsta värdet på q. 

Om
det hade varit pi (och inte e) som du skulle approximera och ndig(q) = 3 så skulle endast 113, 355 skrivas ut (fastän 355 / 113 = 670 / 226 = 1065 / 339 etc).
Observera att "ndig" inte är en Matlabfunktion utan bara en beteckning jag använde för att formulera uppgiften. Man behöver inte ndig för att lösa uppgiften och man skall inte heller skriva någon sådan funktion.


Några labgrupper brukar vilja presentera beräkningsresultaten i snygga tabeller. På följande sida finns några tips.

Back