Beregne volum av kuler

I anvendelser av matematikk har man ofte behov for å regne ut volumer av avanserte geometriske objekter. Som regel går det ikke an å regne ut slikt for hånd eller med pene formler, så matematikere jobber mye med å finne algoritmer som datamaskiner kan utføre for å finne en tilnærmet løsning.

Tenk deg at du har fått i oppdrag å regne ut arealet av en kule i n dimensjoner. Først av alt – hva i all verden mener vi med dette? En sirkel i planet med radius 1 kan beskrives som alle punkter $$(x,y)$$ i planet slik at  $$x^2+y^2=1$$ (hvorfor? hint: Pythagoras’ setning). På samme måte kan vi beskrive en kule som alle punkter $$(x,y,z)$$ i rommet slik at $$x^2+y^2+z^2=1$$.

Vi generaliserer, og definerer en  kule i n dimensjoner til å være alle punkter $$(x_1,x_2,\ldots,x_n)$$ i $$\mathbb{R}^n$$ slik at $$\sum_{i=1}^n x_i^2 = 1$$.

Men la oss nå si at du har lyst å regne ut arealet av en sirkel i planet. Vi kan anta sirkelen har radius 1 og er plassert i origo. Tegn så et kvadrat rundt sirkelen, med diagonaler med lengde 1, som på figuren under:

Enhetssirkelen på innsiden av en firkant.

Siden firkanten har sidelengder på 2, har den arel 4. Her kommer trikset: kast masse “dart-piler” (eller punkter, om du vil) på firkanten slik at de havner tilfeldig spredt omkring. Kall arealet til sirkelen for A. Da vil A/4 av dart-pilene havne på innsiden av sirkelen.  Dermed, for å få arealet av sirkelen, ganger vi dette forholdet med 4.

Fordelen med denne metoden er at det er veldig lett å sjekke om et punkt er på innsiden av sirkelen eller ikke. Vi sjekker bare om $$x^2+y^2 < 1$$ eller ikke. Om $$x^2+y^2 < 1$$, så er punktet $$(x,y)$$ på innsiden av sirkelen. Dette generaliserer lett til flere dimensjoner enn 2 og til andre figurer enn sirkler.

Jeg har testet denne metoden på sirkler i Python. Jeg laget et program som jeg kalte for areal_kule.py. Vi tester for sirkelen og med 1000 dart-piler:

Fredriks-MacBook-Air:Python Fredrik$ python areal_kule.py 2 1000
Tilfeldig volum: 3.196
Ekte volum: 3.14159265359
Error: 0.0544073464102

Ikke veldig imponerende, kanskje – vi kastet tross alt 1000 dart-piler! Vi tester med èn million dart-piler i stedet (dette tok litt under 10 sekunder på min maskin):

Fredriks-MacBook-Air:Python Fredrik$ python areal_kule.py 2 1000000
Tilfeldig volum: 3.144456
Ekte volum: 3.14159265359
Error: 0.00286334641021

Nå ble resultatet en god del bedre. La oss prøve å regne ut volumet av en kule:

Fredriks-MacBook-Air:Python Fredrik$ python areal_kule.py 3 1000000
Tilfeldig volum: 4.184968
Ekte volum: 4.18879020479
Error: 0.00382220478639

Ikke dårlig! Denne metoden kalles for Monte Carlo-integrasjon, og det viser seg at slike “tilfeldige” metoder ofte er mer effektivt i høyere dimensjoner.

Når vi først snakker om sirkler, kan man lure på hva som skjer med volumet til sfærer når vi øker dimensjonene. Resultatet er litt kontraintuitivt:

Volum kuler

Vi ser at volumet til kulene øker fram til dimensjon 4, hvor det begynner å falle. Faktisk går kulevolumet i dimensjon n mot null når n går mot uendelig. Dette er fordi diagonallengden på kvadratet rundt kulen blir større og større etterhvert som n øker.

For ordens skyld, her er Python-programmet jeg brukte for å regne ut volumene:

from random import random
from math import pi, gamma, fabs
import sys

if len(sys.argv) == 1:
    sys.exit("Skriv areal_kule d n. d dimensjon, n antall, std n=1000")
if len(sys.argv) == 2:
    d = int(sys.argv[1])
    n = 1000
if len(sys.argv) == 3:
    d = int(sys.argv[1])
    n = int(sys.argv[2])

i = 1
s = 0.
cube_area = 2**d #area of cube in dimension d

while i < n:
    if (sum([random()**2 for j in range(d)])) < 1:
        s += 1
    i += 1

random_area = (s/n)*cube_area
true_volume = pi**(0.5*d)/gamma(0.5*(d+2))

print "Tilfeldig volum: " + str(random_area)
print "Ekte volum: " + str(true_volume)
print "Error: " + str(fabs(random_area-true_volume))

3 thoughts on “Beregne volum av kuler”

  1. På tur hjem fra byen med nattbussen, med promille begrenser jeg meg til å si at grafene var fine… Uten at jeg forstår at en sirkel omskrevet av et kvadrat tar 1/4 av tilfeldige treff?

    1. Nei. Om A er arealet til sirkelen, vil sirkelen ta A/4 av alle tilfeldige treff, fordi arealet til sirkelen tar opp A fjerdedeler av det totale arealet (som er 4).

Legg igjen en kommentar