Triangolo di Sierpinski con Sage

Home Forum Matematica Software matematico Triangolo di Sierpinski con Sage

Questo argomento contiene 7 risposte, ha 5 partecipanti, ed è stato aggiornato da  Lazza 5 anni, 1 mese fa.

Stai vedendo 8 articoli - dal 1 a 8 (di 8 totali)
  • Autore
    Articoli
  • #12988

    Lazza
    Amministratore del forum

    Molti di voi sicuramente conosceranno già il triangolo di Sierpinski, è un frattale con una regola di costruzione molto semplice ma il risultato finale merita davvero.

    Durante lo stage di Paderno di quest’anno, dopo aver visto l’utilizzo di Sage — un programma di matematica open source con parecchie funzionalità — ho proposto ad alcuni matematici interessati l’idea di usare Sage per realizzare questo tipo di grafico.

    Nel giro di un’ora soltanto, Paola e Mariagioia hanno prodotto un risultato ottimo e perfettamente funzionante e hanno acconsentito a pubblicarlo, è un bell’esempio di come si può usare Sage per produrre piccoli programmi matematici personalizzati.

    Ecco come funziona l’idea di base. Supponiamo di prendere due punti $P_1$ e $P_2$ del piano cartesiano, con la stessa coordinata $y$, e di voler usare il segmento di cui sono vertici come base del triangolo. Decidiamo un numero di volte per cui effettuare l’operazione di disegno del frattale.

    Questa operazione consiste nel dividere il triangolo equilatero individuato in altri quattro triangolini, e in ciascuno di quelli “sulle punte” disegnare ancora un triangolo di Sierpinski, ripetendo l’operazione. Nel disegno potete vedere come le nuove basi dei triangoli siano individuate dai segmenti $AB$, $BC$ e $DE$. Considerando il disegno di partenza, $P_1$ coincide con $A$ e $P_2$ con $C$.

    Il processo viene ripetuto ricorsivamente sui nuovi segmenti individuati, finché non decidiamo di fermarci (dopo $n$ ripetizioni) e a quel punto disegnare un semplice piccolo triangolo equilatero, uno dei tanti che compongono la nostra figura! L’ultima cosa da fare è unire insieme i vari pezzi in un unico grafico.

    Di seguito trovate il codice, dovrebbe essere abbastanza comprensibile. Tenete solo presente che è stato diviso in due parti:

    • triangolo: si occupa di disegnare un singolo triangolo equilatero dati due punti che individuano la sua base orizzontale
    • frattale: viene richiamata per disegnare il frattale, ed eventualmente si “auto richiama” per un certo numero di volte
    # funzione che disegna un triangolo equilatero dati due punti a e b
    # i punti sono dati come coppie (x, y) con la coordinata y uguale
    def triangolo(a, b):
        # assegno i dati a delle variabili con nomi "leggibili"
        x0 = a[0]
        y0 = a[1]
        x1 = b[0]
        y1 = b[1]
        x2 = (x0+x1)/2
        # calcolo la lunghezza del lato e la coordinata y del vertice in alto
        l=abs(x1-x0)
        y2=y0+l*sqrt(3)/2
        # costruisco il nuovo punto c
        c = (x2, y2)
        # Sage mi consente di restituire un poligono con la funzione polygon
        return polygon([a,b,c])
    
    # funzione che reitera la creazione del triangolo di Sierpinski
    # idea: se devo fare n passi, divido il triangolo in 3 triangolini
    # con basi identificate dai punti a, b, c, d, e; quindi richiamo
    # il frattale n-1 volte su ciascuna delle tre zone
    def frattale(a, c, volte):
        # se non devo fare più suddivisioni
        if (volte < = 0):
            # disegno un triangolo e lo restituisco
            graph = triangolo(a, c)
            return graph
        # altrimenti
        else:
            # calcolo i vertici dei triangolini
            x0 = a[0]
            y0 = a[1]
            x2 = c[0]
            y2 = c[1]
            x1 = (x2+x0)/2
            y1 = y0
            x3 = (x0+x1)/2
            l = abs(x1-x0)
            y3 = y0 + l*sqrt(3)/2
            x4 = (x1+x2)/2
            y4 = y3
            b = (x1, y1)
            d = (x3, y3)
            e = (x4, y4)
    
            # reitero il processo di disegno del frattale
            graph1 = frattale(a, b, volte-1)
            graph2 = frattale(b, c, volte-1)
            graph3 = frattale(d, e, volte-1)
    
            # unisco i pezzi e li ritorno
            return graph1 + graph2 + graph3
    

    Se desiderate provare il codice in Sage, potete renderlo interattivo con una piccola aggiunta che vi consente di avere uno slider con cui scegliere il numero di iterazioni che desiderate:

    # ci servono due punti come segmento di partenza
    p1 = (1, 1)
    p2 = (2, 1)
    
    @interact
    def _(i = slider(0, 7, 1, 1)):
        # mostra il risultato senza assi cartesiani
        frattale(p1, p2, i).show(figsize=6, axes=False)
    

    Ad esempio, se scegliete $i = 6$, l’immagine prodotta sarà questa:

    Potete cliccare qui per accedere direttamente a un server di Sage con il codice inserito e vedere di persona, e se lo desiderate potete provare a modificare il codice e osservare che cosa succede.

    Complimenti alle nostre matematiche per aver prodotto un esempio così interessante! 🙂

    #17732

    Luca Mattarolo
    Amministratore del forum

    Alla fine ti sei deciso a pubblicarlo xD! Veramente molto bello l’effetto grafico!!! E comunque non è così difficile capire il codice 🙂

    #17733
    emanuele
    emanuele
    Partecipante

    Molto suggestivo, complimenti!Grazie anche a Lazza per aver citato il programma, appena avrò un pò di tempo mi diletterò.

    #17734
    Agno
    Agno
    Amministratore del forum

    Io l’avrei addirittura messo sul blog.

    #17737

    angie
    Amministratore del forum

    Concordo con agno.

    #17740

    Lazza
    Amministratore del forum

    Agno ha detto: Io l’avrei addirittura messo sul blog.

    Non l’ho messo sostanzialmente per due motivi. Il primo è che non avevo intenzione di prendermi spazio sul blog per postare roba di informatica che magari non a tutti può interessare, dato che comunque il sito non è mio e non posso farci quello che mi pare.

    Il secondo è che speravo che mi rispondesse qualcuno, ma se scrivo sul blog di solito passa inosservato. 😀

    #17742

    angie
    Amministratore del forum

    …forse per il fatto che c’è la cattiva abitudine di non scrivere mai sul blog??

    #17783

    Lazza
    Amministratore del forum

    A proposito di Sage, se vi interessa al Linux Day avevo fatto un talk intitolato Matematica di base e avanzata con Sage e ne ho pubblicato le slide assieme a delle piccole video dimostrazioni. L’ultimo esempio è il codice del triangolo di questo topic. 🙂

Stai vedendo 8 articoli - dal 1 a 8 (di 8 totali)

Devi essere loggato per rispondere a questa discussione.