Tässä blogissa esitellään matematiikkaa visuaalisesti ja tee-se-itse-periaatteella. Tämä tarkoittaa sitä, että kaikki asiat esitetään matematiikan (joskus puisevaksi haukutun) kielen lisäksi kuvina. Kaikkiin kuviin sekä matematiikan konsepteihin annetaan myös python-ohjelmointikieliset koodit, jolla lukija voi itsekin luoda kuvia ja kokeilla miten asiat toimivat käytännössä. Pääaiheita ovat fraktaalit, kaaos ja 3d-grafiikka, jotka kaikki ovat helposti visualisoitavia aiheita, mutta samalla sisältävät asioita monilta matematiikan eri aloilta. Kaikissa näissä aiheissa alkuun pääsee helposti, mutta syvemmälle mentäessä aiheista löytyy yhä monimutkaisempia ja matemaattisesti haastavampia puolia.

tiistai 30. elokuuta 2011

Mandelbrotin joukon visualisointi Pythonilla

Yksi visuaalisesti kauneimpia matemattisia kuvioita ovat fraktaalit, joista tunnetuin lienee Mandelbrotin joukko, joka näyttää tältä:


Yllä oleva fraktaalikuvio on niin yleinen, että lukija saattaa olla törmännyt tähän aiemminkin. Tässä blogissa pääaiheena ovat fraktaalit, joita on helppo visualisoida ja ohjelmoida, mutta joihin sisältyy hyvinkin syvällistä ja abstraktia matemaatiikkaa.

Yksi syy omaan kiinnostukseeni matematiikkaan ovat juurikin fraktaalit, joita piirtelin joskus 90-luvun alussa ensi fractint-ohjelmistolla ja sen jälkeen ohjelmoimalla itse pascal- ja C-kielillä. Silloin muinoin fraktaaleja vielä piirreltiin VGA-grafiikalla kirjoittamalla pikselien värejä suoraan näyttömuistiin, mutta nykyään käyttöjärjestelmät ja ohjelmointikielet ovat sen verran kehittyneet eteenpäin, että näin rautatason koodaukseen ei ole tarvetta. Aiemmin ohjelmointikielissä ei myöskään ollut valmiina kompleksilukuja, joita tarvitaan monien fraktaalien piirtämisessä, mutta nykyään ne löytyvät valmiina melkein kaikista ohjelmointikielistä.

Sellainen huonokin puoli systeemien kehityksessä kyllä on, että enää ei voi vaan tekstimoodia vaihtaa graafiseksi ja sen jälkeen piirrellä pisteitä näytölle, vaan ensin pitää avata grafiikkakirjasto, avata ikkuna, kenties tehdä muita valmisteluja ja vasta tämän jälkeen voi näytölle piirrellä. Kuitenkin python-kielen Tk-kirjasto tarjoaa varsin yksinkertaisen tavan piirrellä pikseligrafiikkaa ikkunaan.

Esimerkiksi ylläoleva Mandelbrotin joukon kuva on tuotettu seuraavalla ohjelmakoodilla:
# Asenna ensin python-tulkki taalta: http://www.python.org/
# Talleta koodi tiedostoon nimelta mandel1_tk.py ja aja komennolla
# python mandel1_tk.py
from Tkinter import Tk, PhotoImage, Label
from math import *

def main():
    root = Tk()
    pic = PhotoImage(width=400, height=400)
    lbl = Label(root, image=pic)
    lbl.pack()
    root.update()

    max_iter = 1000
    for y in range(pic.height()):
        for x in range(pic.width()):

            xs = 2.0 * x / pic.width() - 1.5
            ys = 2.0 * y / pic.height() - 1.0

            c = xs + ys*1j
            z = 0
            n = 0
            while n < max_iter and abs(z) <= 2:
                z = z**2 + c
                n = n + 1

            if n == max_iter:
                (red,green,blue) = (0,0,0)
            else:
                (red,green,blue) = (n,2*n,3*n + 150)

            color = "#%02x%02x%02x" % (red % 256, green % 256, blue % 256)

            pic.put(color, (x,y))

        root.update()
    root.mainloop()

main()

Tämän Mandelbrotin joukon tuottamiseen liittyvään matematiikkaan mennään syvemmälle seuraavalla blogipostauksessa.