Most recent comments
2021 in Books -- a Miscellany
Are, 2 years, 10 months
Moldejazz 2018
Camilla, 5 years, 3 months
Romjulen 2018
Camilla, 5 years, 10 months
Liveblogg nyttårsaften 2017
Tor, 6 years, 10 months
Selvbygger
Camilla, 3 weeks
Bekjempelse av skadedyr II
Camilla, 9 months, 3 weeks
Kort hår
Tor, 3 years, 10 months
Ravelry
Camilla, 3 years, 5 months
Melody Gardot
Camilla, 5 years, 4 months
Den årlige påske-kommentaren
Tor, 5 years, 7 months
50 book challenge
Camilla, 10 months, 2 weeks
Controls
Register
Archive
+ 2004
+ 2005
+ 2006
+ 2007
+ 2008
+ 2009
+ 2010
+ 2011
+ 2012
+ 2013
+ 2014
+ 2015
+ 2016
+ 2017
+ 2018
+ 2019
+ 2020
+ 2021
+ 2022
+ 2023

Python FTW!

Jørgen ringte i går, og lurte på om jeg hadde noen tanker om en matteoppgave han hadde sett på. Oppgaven går som følger: Man begynner med en sirkel. Så tegner man en likesidet trekant som omskriver sirkelen, og en ny sirkel som omskriver trekanten.

Man gjentar så prosessen med en firkant

og videre med en femkant, etc., etc. Hver nye sirkel vil være større enn den forrige, men radien vil øke mindre for hver gang, og oppgaven går ut på å vise at når antallet figurer går mot uendelig vil radien til den største sirkelen gå mot en grense. Her må vi altså ty til matematikk.

Hvis radien til den første sirkelen er R0 vil radien til den andre sirkelen være R1, der

og videre vil radien til den neste sirkelen være

og vi ser at radien vil gå mot

Det kan tenkes at dette kan skrives om til noe mer elegant, muligens ved hjelp av en eller annen frekk representasjon av cosinus som et uendelig produkt og en smart måte å sette sammen faktorer slik at man ser et slags mønster, men jeg har ikke greid det. Oppgaven gikk imidlertid ut på å finne det minste heltallet som er større enn grensen radien går mot, og hvis man er på en pubquiz eller noe, så holder det ikke å si at du har funnet svaret representert som et uendelig produkt. De vil ha et tall. Jeg prøvde å putte uttrykket inn i Wolfram Alpha og regne ut produktet opp til et stort tall, men den sluttet å samarbeide før jeg kom til 10000, og selv om det sikkert er bra nok ville jeg ikke gi meg der, så jeg fant frem python.

Siden dette er et eksempel på en ting som er vanskelig å regne ut på papir, men lett å regne ut med bittelitt programmering, og siden Jørgen og jeg disukterte python sist jeg var i Oslo, tenkte jeg å vise hvordan man kan studere dette problemet. På Mac eller linux, åpne en terminal og skriv python. Da får du opp et interaktivt python shell som du kan bruke som en kalkulator.

For å studere dette problemet trenger vi først cosinus og pi, som vi kan importere fra math-modulen. Skriv
from math import cos, pi

Så skal vi definere en funksjon. Skriv
def f(N):
    p = 1
    for n in xrange(3,N):
        p = p * 1 / cos( pi / n )
    return p

Legg merke til at indenteringen er viktig i python. Nå har vi laget en funksjon som regner ut produktet vårt fra 3 og opp til N. Dermed kan vi lettvint teste ulike verdier av N og se om det ser ut til at vi nærmer oss en grense. Skriv for eksempel
f(1000)

og
f(10000)

og
f(100000)

og se hva som skjer. Det ser ut til at det minste heltallet som er større en grensen vi leter etter er 9, og når jeg beregnet det undelige produktet numerisk med Mathematica fikk jeg 8.7004, så vi ser at rekken har konvergert ganske fint allerede ved N=100000.

Det er naturligvis juks & fanteri å løse en slik oppgave på denne måten, men det er likevel noe tilfredsstillende i å skrive noen få linjer kode og regne ut et produkt av hundre tusen eller en millon faktorer på et lite sekund, og se at svaret konvergererer fint.

-Tor Nordam
Matteus, Jørgen likes this

Comments

Jørgen,  10.12.11 14:41

Det er ting som dette som gjør at du fortsatt står som Tor the Man i min kontaktliste.
Tore, Karoline, Ulf likes this
Tore,  10.12.11 17:50

Det gjør du fortsatt på telefonen min også.
Tor,  10.12.11 17:50

Jeg føler meg ikke så rent lite smigret.

Ole Petter,  11.12.11 01:52

Godt jobba! Etter litt googling fant jeg dette:
http://mathworld.wolfram.com/PolygonCircumscribing.html
Ser ikke ut som om det er noen enkle måter å løse problemet på, rent analytisk.
Tor,  11.12.11 12:37

Jeg kom også frem til uttrykket i (8), men jeg så ikke noen lettvint måte å gå videre på.

Så, Jørgen, fikk du dreisen på Python? Vil du ha flere artikler om denslags?
Tor,  11.12.11 14:23

Inspirert av figuren i linken til Ole Petter bestemte jeg meg for å se om jeg kunne lage noe lignende. De to figurene i artikkelen lagde jeg med tegneprogrammet Inkscape, men det blir fort litt kjedelig, så jeg gikk nok en gang for python.

Fra trekant opp til 100-kant

Jeg skrev et nokså grundig kommentert program for å lage denne figuren, og det kan lastes ned her:
polygons.py

Programmet krever matplotlib for å kjøre. For å sjekke om du har matplotlib installert kan du åpne et python shell (skriv python i terminalen), og skrive
import matplotlib

Hvis du får en feilmelding er det ikke installert, og da kan du laste ned en installasjonsfil (for Mac) her (du ser hvilker python-versjon du har når du åpner python):
Matplotlib for python 2.7
Matplotlib for python 2.6

Om du kjører linux er det enkleste å installere matplotlib med pakke-manageren din.

Last ned polygons.py, åpne en terminal, naviger til mappen der du lagret det, og skriv
python polygons.py

Programmet lager en figur som heter polygons.png, som blir lagret i samme mappe som du kjører programmet fra.
Jørgen, Ole Petter likes this
Matteus,  11.12.11 23:34

Jeg laget et program på min gamle casio fra videregående når jeg løste nøtta. Den klarte fint å regne opp til n=10000, men det tok litt tid.
Tor likes this
Tor,  11.12.11 23:43

Gode, gamle Casio 9750 fx. Jeg har den på kontoret, men det er lenge siden sist jeg brukte den. Hvor lang tid tok det, sånn av nysgjerrighet? Laptopen min må jo være mange størrelsesordener raskere, skjønt kalkulatoren har sikkert mer spesialisert prosessor, og nøyaktigheten man regner ut cosinus til har sikkert kjempemye å si.
Jørgen,  12.12.11 07:26

Gikk greit, ja. Og jeg kunne gjerne tenke meg flere artikler om emnet.

Jørgen,  12.12.11 20:52

Jeg ser at kommentaren min kan virke noe uentusiastisk. Det er ikke tilfellet. Mer om Python hadde vært knall.
Matteus,  21.12.11 12:53

Kjører en test på hastighet nå, Tor. Resultatene burde foreligge om et kvarter eller så.

Matteus,  21.12.11 13:12

Etter nesten tjue minutt er den ennå ikke ferdig, og jeg må rekke en buss. Tester med lavere verdier for n tilsier at de to er like raske, og det kun er mengden minne og fargeskjermen som skiller dem. Forrige gang jeg kjørte programmet for n= 10000 så lot jeg den bare ligge, og sjekker svaret senere, men det ser ut til at det tar over tjue minutt, kanskje mer enn en halvtime. Det som er sikkert, er at den bruker mer enn ti ganger så lang tid som for n= 1000.