Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Fraktaalit

KoodiNoppa [19.03.2007 17:37:07]

#

Miten yksinkertaisia, viivoista tai esim. neliöistä koostuvia fraktaaleja ohjelmoidaan? Jos vaikka haluaisin piirtää Sierpinskin kolmion tms., pitääkö jokainen viiva erikseen piirtää vai onko siihen jokin matemaattinen kaava, joka laskee kuuluuko ruudulla oleva piste kuvioon?
Entä mandelbrot yms.?

P.S. ajattelin sijoittaa viestin tänne, koska fraktaalejahan voi piirtää melkein millä tahansa kielellä...Sanokaa jos ei ole oikea paikka :)

Heikki [19.03.2007 19:04:48]

#

Lyhyt vastaus: iterointi.

Yksinkertaisimman fraktaalin saa aikaan vaikka iteroimalla funktiota H(x, y)=(y + 1 - ax^2, bx) eri a:n ja b:n arvoilla (esim. a=1,4, b=0,3) [lähteenä lukiokurssin Numeerinen matematiikka -kirja].

Iterointi tarkoittaa karkeasti sitä, että edellisestä lausekkeesta saadut arvot sijoitetaan seuraavaan lähtöarvoiksi. Esimerkiksi neliöjuuri luvusta a voidaan laskea iteroimalla funktiota x = 1/2 * (x + a/x), esim. lasketaan luvun 5 neliöjuuri alkuarvauksella 2:

x = 0,5 * (2 + 5/2) = 2,25
x = 0,5 * (2,25 + 5/2,25) = 2,23611
x = 0,5 * (2,23611, + 5/2,23611) = 2,2360

Ja näin jatketaan, ja lopulta iterointi suppenee tiettyyn arvoon (tämä voidaan osoittaa melko helposti). Oikeasti 5=2,236...

Vastaavalla tavalla voit iteroida tuota antamaani kahden muuttujan funktiota sijoittamalla x-koordinaatin muuttujaksi x ja y-koordinaatin muuttujaksi y. Tämän jälkeen piirrät aina pisteen kohtaan (x,y) jonka tuo funktio antaa, jolloin saat erään fraktaalikuvion.

Tässä vielä joku vanha kovalevyn syövereistä löytynyt ohjelmani joka ehkä selventää asiaa, iteroi juuri tuota yllä esittelemääni funktiota: http://heikki.homelinux.net/~heikki/fraktaali.cpp (arvoja muuttamalla voi saada hienompia osia fraktaalista näkyviin)


"Hienompia" fraktaaleja saa aikaan erilaisia funktioita iteroimalla, esim. ns. Mandelbrotin joukko saadaan iteroimalla funktiota f(z)=z^2+c, missä z ja c ovat kompleksilukuja ja värittämällä sitten kompleksilukua vastaava tason piste tietyllä värillä, joka riippuu iterointikerran määrästä.

KoodiNoppa [23.03.2007 15:43:06]

#

hmm...eli heitän hatusta a ja b-arvot...teenkö saman x- ja y-arvoille? Kuinka kauan iterointia pitäisi jatkaa? Ja pitäisikö iteroinnin mennä näin:

x=y+1-a*x^2;
y=b*x;

vai näin:

tempX=x;
tempY=y;
x=tempY+1-a*tempX;
y=b*tempX;

,jolloin y-arvo laskettaisiin vanhalla x-arvolla eikä uudella?

Heikki [23.03.2007 15:55:21]

#

Tuolla jälkimmäisellä tavalla.

Kaikilla a:n ja b:n arvoilla tuosta ei edes tule fraktaalia, mutta ainakin antamillani arvoilla a=1,4, b=0,3 pitäisi tulla. x:lle ja y:lle valitaan alussa vaan jotkut arvot, tämän jälkeen kannattaa iteroida vaikka 100 kertaa jolloin alkuarvojen vaikutus häviää. Se, kuinka paljon pitää iteroida jotta saa aikaan hienon kuvion onkin sitten hankalampi sanoa, kokeilemalla löydät varmaan hyvän arvon.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta