Box counting in Cython

Un'estensione Cython che stima la dimensione frattale di un insieme di punti contando le celle occupate, senza creare la griglia intera. L'ho scritta da solo in un mese, tra novembre e dicembre 2022.

Il problema

Per misurare la dimensione di un attrattore con il box counting si conta quante celle di lato ε contengono almeno un punto. Con molti punti o molte dimensioni la griglia intera occupa troppa memoria. Ho usato un albero che si ramifica solo dove ci sono punti.

Albero costruito sulla mappa di Hénon a quattro livelli

Come funziona

  1. 01

    L'albero

    Un albero N-ario ricorsivo scritto in C dentro Cython: ogni livello dimezza il lato delle celle e si creano solo i rami occupati. La memoria dell'albero si libera a mano con free().

  2. 02

    Il fit

    occupation conta le celle per ogni livello; fit_show fa il fit lineare con SciPy e mostra i grafici.

  3. 03

    Prove

    Sugli attrattori di Hénon e di Lorenz, con figure salvate nel repository.

Conteggio delle celle e dimensione stimata per l'attrattore di Lorenz
Attrattore di Lorenz. A destra la dimensione stimata dipende dalla scala (da 2,3 a 1,8): conta la scelta dell'intervallo su cui fare il fit.
  • Cosa ho fatto io

    Tutto il codice, 19 commit, circa 530 righe tra Cython e Python.

  • Limiti

    README di una riga, nessuna documentazione, prove fatte con script lanciati a mano. Non ho misurato quanto sia più veloce di una griglia, quindi non lo dichiaro.

Stack: Python, Cython, C, NumPy, SciPy, Matplotlib.