Von Kochs snefnug

Koch-kurvens udvikling i de fem første iterationer.
Snefnugkurven eller von Kochs snefnug.

von Kochs snefnug, tillige kendt som Koch-kurven, blev beskrevet af matematikeren Helge von Koch i en artikel med titlen "Sur une courbe continue sans tangente, obtenue par une construction géométrique élémentaire", publiceret 1904 i Arkiv för matematik, astronomi och fysik. Hensigten med artiklen var at give et geometrisk mere tiltalende eksempel på en kontinuerlig kurve som savner tangent i alle punkter end det, som Karl Weierstrass havde opdaget i 1861. Siden er Koch-kurven tillige kendt som en af de tidligst beskrevne fraktaler, et begreb som formuleredes 70 år senere.

Koch-kurvens definition:

  1. Tag en linje.
  2. Del linjen i tre lige store dele.
  3. Lav en kopi af den mellemste del.
  4. Stil de to kopier i vinkel mod hverandre, så at de får plads inden for samme strækning som en ensom linje ellers gør.
  5. Gentag (iterer) fra trin 2 for alle de nye linjer, som er kommet frem ved operationen.

Antallet af nye linjer at operere på bliver hele tiden 4 gange det tidligere antal linjer, så antallet af linjer efter n iterationer bliver følgelig 4n. Linjen vokser i længde med en tredjedel i hver ny iteration og kommer således til sidst at blive en uendeligt lang kurve men inden for en begrænset flade. Derfor er kurvens dimensionstal ikke et heltal. Det er anledningen til, at Koch-kurven er en fraktal, (af lat; fractus, brøkdel). Koch-kurvens Hausdorffdimension er .

von Kochs snefnug

Denne figur dannes ved, at man begynder med en ligesidet trekant i stedet for en linje. Ved hver iteration øger omkredsen med en tredjedel. I iteration n er længden gange den oprindelige længde. Snefnuggets omkreds savner altså grænseværdi og går mod uendelig, når n går mod uendelig. Derimod konvergerer dets areal mod 8/5 gange den oprindelige trekants areal.

Programeksempel

Følgende er en algoritme i programmeringssproget QBasic som viser von Kochs kurve som en IFS-fraktal. Koden er nok ikke alt for svær at oversætte til C/C++ eller noget andet højniveausprog forudsat, at man ved hvordan man gør for at skabe en skærmflade og skrive pixler til den. Bemærk dog at tegnet [#] modsvarer float i C og [%] er int.

SCREEN 12
RANDOMIZE TIMER
rad# = ATN(1#) / 45#
vinkel# = 60# * rad#
skalning# = 1# / 3#
bildskalning# = 200#
positionx#(0) = 1#
positiony#(0) = 0#
positionx#(1) = COS(vinkel#) / 2#
positiony#(1) = SIN(vinkel#) / 2#
rotationx#(0) = skalning#
rotationy#(0) = 0#
rotationx#(1) = COS(vinkel#) * skalning#
rotationy#(1) = -SIN(vinkel#) * skalning#
x# = 0.75#
y# = 0#
WHILE INKEY$ = ""
  i% = FIX(RND * 2)
  t# = rotationx#(i%) * x# – rotationy#(i%) * y# + positionx#(i%)
  y# = rotationx#(i%) * y# + rotationy#(i%) * x# + positiony#(i%)
  IF FIX(RND * 2) THEN x# = t# ELSE x# = -t#
  PSET (320 + bildskalning# * x#, 240 – bildskalning# * y#)
WEND
END

Her er også et lille Python program, der virker for mig. Jeg har brugt modulet "turtle" til at udføre det. Det tegner de første 6 iterationer af snefnugget, med et farveskifte mellem hver.

#Koch snefugget i Python med Turtle
import turtle
Skildpadde = turtle.Turtle()
Skildpadde.pu()
Skildpadde.goto(-300, 200)
Skildpadde.pd()
farve = ['black', 'blue', 'red', 'green', 'purple', 'black']
sidelaengde = 729
sekvens = []
TEMPseq = []
#For-loop, der styrer antallet at iterationer
#Skildpadden, der går frem og tilbage(linie 23+24) sletter blot den midterste 3.-del
#fra foregående iteration - ganske som man ville, hvis man selv tegnede dette monster
for trin in range(6):
    Skildpadde.color(farve[trin])
    for ii in range(3):
        for s in sekvens:
            Skildpadde.fd(sidelaengde)
            if s == 'h':
                Skildpadde.rt(120)
            if s == 'v':
                Skildpadde.color('white')
                Skildpadde.fd(sidelaengde)
                Skildpadde.bk(sidelaengde)
                Skildpadde.color(farve[trin])
                Skildpadde.lt(60)
        Skildpadde.fd(sidelaengde)
        Skildpadde.rt(120)
    #her laves næste iteration
    TEMPseq = list(sekvens)
    for rytme in ['v', 'h', 'v']:    
        sekvens.append(rytme)
        sekvens.extend(TEMPseq)
    TEMPseq.clear()
    sidelaengde = sidelaengde/3

Se også

Eksterne henvisningr

Commons-logo.svg
Wikimedia Commons har medier relateret til:

Medier brugt på denne side