Thursday, May 13, 2021

Double pendulum in phase space


Initial angles: 0.16 pi, 0.16 pi 

Left diagrams are the trajectory in phase space for first and second segment (angle and angular speeds).

Wednesday, May 12, 2021

Lorentz Butterfly

 

dx/dt = 10.0*(y-x)
dy/dt = -x*z + 28.0*x - y
dz/dt = x*y - (8.0/3.0)*z
Gleick, "Chaos"

Sunday, April 18, 2021

Prosty Model Epidemii

 

Przedstawiam wykład o prostym modelu epidemii (tzw. "toy model"):


 

Dodanie do prostego modelu epidemii utraty odporności przez ozdrowieńców prowadzi wprost do powstawania fal zarażeń:

Pamiętajcie to "toy model", więc jest to ciekawe, ale nie definitywne jeśli chodzi o wnioski. #symulacja #pandemia #koronawirus

Wednesday, April 7, 2021

Model Płatków Śniegu

Jest kwiecień 2021 i właśnie we Wrocławiu spadł po raz kolejny tej zimy, prawdziwy śnieg. Przedstawiam wykład o płatkach śniegu, o ich strukturze i modelowaniu.

Płatki śniegu powstają przez wzrost kryształków lodu, które przyczepiają się do siebie i tworzą interesujące, różnorodne bryły. Bryły te w większości mają określoną symetrię, ale bogactwo form jest ogromne (zdarzają się takie z różnymi defektami lub wzrastające w różny sposób). Przykłady różnorodności płatków śniegu można znaleźć na przykład na fotografiach Wilsona Bentleya, amerykańskiego farmera żyjącego w latach 1835-1931, który sfotografował ponad 5000 płatków śniegu opisując je jako piękne małe obiekty.



Wilson Bentley (1835-1931) i jego fotografie płatków śniegu.

Dziś można już oglądać płatki śniegu pod mikroskopami różnego typu, popatrzcie na zdjęcia wykonane np. mikroskopią elektronową.

Szczególnie ciekawe jest to, że zdjęcia płatków śniegu są wybierane na obraz roku w Wikipedii (ja znalazłem takie dwa zdjęcia). Polecam szczególnie stereogram, zdjęcie, które oglądane w odpowiedni sposób (należy zbliżyć oczy do ekranu i skupić wzrok na punkcie pomiędzy ekranem, a oczami) daje złudzenie oglądania bryły 3D. Mi się to prawie udało na kilka sekund, ale nie jestem w tym dobry. Ciekawe jak Wam to pójdzie (uwaga - polecam wyświetlić na pełnym ekranie):

Żr: Wikipedia

W 1611 r. Johannes Kepler, niemiecki astronom, autor praw dotyczących ruchu planet (słynne prawa Keplera), po raz pierwszy analizuje sześciokątną symetrię płatków śniegu twierdząc, że jest związana ze sposobem w jaki układają się układy gęsto upakowane sfery (ang. sphere packings). Publikuje on też krótki esej na ten temat [2]. Faktycznie, najgęstsze upakowanie dwy-wymiarowych kół w dwóch wymiarach realizowane jest na sieci o strukturze trójkątnej (heksagonalnej). Jeśli chodzi o sam wzrost kryształów na sieci heksagonalnej to jest on związany z budową cząsteczki wody. 

 


 Oryginalny rysunek z pracy J. Keplera [2].


Jeśli przyjrzymy się prostej symulacji zjawiska upakowania kółek dwuwymiarowych o tej samej średnicy i będziemy ich dodawać więcej i więcej, to na koniec zauważymy, że układają się na sieci o strukturze sieci trójkątnej.

Źr: https://upload.wikimedia.org/wikipedia/commons/e/ee/2d-bravais.svg


 

 Symulacja: Dwuwymiarowe dyski upakowane na tyle gęsto, że tworzą sieć trójkątną.

 

Jednym z najprostszych sposobów modelowania wzrostu płatków śniegu jest model automatu komórkowego, który opisany jest na sieci trójkątnej w dwóch wymiarach. Sieć trójkątna powstaje przez przesunięcie nieparzystych rzędów regularnej sieci kwadratowej o połowę długości sieci.

Rys. Sieć trójkątka i jej implementacja z użyciem tablicy kwadratowej.



Każda z komórek w tym modelu jest komórką lodu lub komórką pustą - te zapisywać będziemy odpowiednio jako zera i jedynki. W kolejnych krokach algorytmu komórki, które były lodem nie zmieniają swojego stanu. Komórki, które lodem nie były zostają lodem wtedy i tylko wtedy, kiedy mają dokładnie jednego sąsiada będącego lodem. Implementacja wydaje się zatem prosta, z poprawką na implementację sieci trójkątnej. Trzeba bowiem zaprogramować sieć trójkątną. To nie jest bardzo trudne, trzeba jedynie pamiętać o tym czym w tej sieci jest sąsiedztwo punktu, bo nie ma on już czterech sąsiadów jak w sieci regularnej. Tu sąsiadów jest sześciu.


 

 Rysunek: Model wzrostu płatka na sieci trójkątnej.


W omawianym modelu wzrost rozpoczyna się od zarodka (mogącego przybrać dowolną formę zlepku kilku komórek). Oryginalny artykuł opisujący ten model pochodzi z roku 1986 ([5] Packard NH. Lattice models for solidification and aggregation. In: Wolfram S, editor. Theory and applications of cellular automata. Singapore: World Scientific Publishing; 1986. p. 305–10.) i został spopularyzowany przez S. Wolframa w jego książce o automatach komórkowych.




Wyniki omawianego modelu (kod C++ z olcPixelGameEngine) dla różnych parametrów.


Model ten potrafi symulować wzrost abstrakcyjnych form płatków, ale to nie potrafi wygenerować płatków z globalnym wzrostem dendrytów i gwiazd, dlatego dziedzina symulacji i modelowania tego typu obiektów jest dość rozwinięta. Zachęcam do własnych poszukiwań!

Przy próbie implementacji zdarzyła mi się ciekawostka. Otóż próbując zaimplementować oryginalny model z użyciem dyfuzji temperatury (próba nieudana, w artykule [5] jest chyba za mało szczegółów dotyczących parametrów) uzyskałem taki oto artefakt w modelu. Dywan Sierpińskiego na płatku śniegu!

 

 Niespodziewany wynik w modelu płatka śniegu z temperaturą (prawdopodobnie błąd w kodzie) - dywan Sierpińskiego.

W literaturze można spotkać wiele prac z modelowania płatków śniegu. Nie będę się tu silił na wielki przegląd, ale zachęcam do spojrzenia na model C.A. Reitera z wartościami 0-1 na sieci heksagonalnej [1]. Wartość 0-1 (autorzy wskazują, że jest to duże przybliżenie i nieformalne założenie) oznacza frakcję wody w komórce. Wartości powyżej 1 oznaczają lód. Woda (wartość < 1) może przepływać pomiędzy sąsiednimi komórkami. Algorytm ma dwa kroki i jest to dwustopniowy automat komórkowy (oba kroki to dwa oddzielne automaty pracujące na wartościach rzeczywistych w komórkach).
W pierwszym kroku określane są komórki receptywne (odbiorcze). Są to komórki, które są lodem, lub mają sąsiadów, którzy są lodem. Te doznają skokowego wzrostu masy (patrz rysunek z algorytmem w omawianym artykule). Reszta komórek rozpływa się (woda) z przybliżeniem dyfuzyjnym. Następnie oba efekty są sumowane. Zachęcam, aby spojrzeć do oryginalnego artykułu - efekty i zakres uzyskanych płatków śniegu jest o wiele większy niż w oryginalnym, prostym, automacie komórkowym.

I na koniec wersja video tego wykładu:


Zapraszam do zapoznania się z resztą materiałów z kursu modelarni na kanale "Koder na strychu". Materiały są ułożone w playliście:

https://youtube.com/playlist?list=PLQRTs-BAfQ54_SosAVhU5yMHc8lH46gEB


Literatura:
[1] C.A. Reiter / Chaos, Solitons and Fractals 23 (2005) 1111–1119
[2] Kepler J. The six sided snowflake (1611) translation. Oxford University Press; 1966.
[3] Bentley WA, Humphreys WJ. Snow crystals. McGraw-Hill Book Company; 1931, also, New York: Dover Publications; 1962.
[4] Nakaya U. Snow crystals: natural and artificial. Harvard University Press; 1954.
[5] Packard NH. Lattice models for solidification and aggregation. In: Wolfram S, editor. Theory and applications of cellular automata. Singapore: World Scientific Publishing; 1986. p. 305–10.
[6] Wolfram S. A new kind of science. Champaign: Wolfram Media; 2002.
[7] https://en.wikipedia.org/wiki/Timeline_of_snowflake_research

Google: snowflake growth model


Materiały (źródła):
* https://en.wikipedia.org/wiki/Wilson_Bentley
* https://publicdomainreview.org/essay/the-snowflake-man-of-vermont
* https://commons.wikimedia.org/wiki/File:Snowflake_-_By_Wilson_Bentley_ca._1905_-_MoPA.jpg
* https://massivesci.com/notes/snowflakes-photographs-wilson-bentley/
https://www.rawpixel.com/board/1308894/vintage-snowflakes-wilson-alwyn-bentley-i-high-quality-cc0-images
* https://pl.wikipedia.org/wiki/%C5%9Anieg
* https://monovisions.com/wilson-bentley-biography-19th-century-photographer-of-snowflakes/
* https://pl.wikipedia.org/wiki/%C5%9Anieg
* https://commons.wikimedia.org/wiki/File:Stereo_snow_crystals.jpg
* https://en.wikipedia.org/wiki/Hexagonal_lattice
* rysunki z eseju J. Keplera (oryginał)
https://upload.wikimedia.org/wikipedia/commons/e/ee/2d-bravais.svg
* animacja upakowania to własny kod HTML5+JS (prosty model z oddziaływaniami sprężystymi)





 

Thursday, March 25, 2021

Eden Cluster - Obfuscated C++ Code

 

                        #include <iostream>  
                     #include <vector> // model
                   #include <Windows.h> // Edena
                   using namespace std; const int L
                = 180; int klaster[L][L]; int done = 0;
             void Init(){for(int i = 0; i < L; i++) for(
            int j = 0; j < L; j++) klaster[i][j] = 0; klaster
         [L /2][L/2]=1;}void Rysuj(){ cout<<"\x1b[2J"; for(int
         i = 0; i < L; i++) for ( int j=0; j < L; j++) { if (
        klaster[i] [j]) { cout<< "\x1b[" << j << ";" << i*2<<"H";
       cout<<"\x1b[47m  \x1b[0m\x1b["<<L<<";"<<L<<"H";}}cout<<
        endl;} class para{public: para(int _i, int _j):i(_i),
        j(_j) {} int i; int j; };  void  EdenA() { vector<para>
           brzeg; brzeg.clear(); for (int i = 1; i < L - 1; i++)
          for (int j = 1; j < L - 1; j++) { if (klaster[i][j] ==
           0 && (klaster[i + 1][j] ||klaster[i - 1][j]||klaster
           [i][j - 1] || klaster[i][j + 1])) { if (i == 1 || j
          == 1 || i == L - 1 || j == L - 1) done = 1; brzeg.
          push_back(para(i, j)); } } if (brzeg.size() != 0)
           { // wybieramy losowo komórkę z brzegu // ***
           int k = int(floor(brzeg.size() * (rand()/float
             (RAND_MAX)))); klaster[brzeg[k].i][brzeg[k].
               j] = 1; } } int main() { srand(1001);
                 Init();//warunek poczatkowy i zarodek
                    for (; done == 0;) // pętla
                     { EdenA(); // krok modelu A
                         } Rysuj(); //rysuj
                           }   //stan


Live code of this (lecture)

Eden model (wikipedia)



Friday, March 19, 2021

Nice packings 2D

 Simple algorithm for non-colliding figure packing (based and inspired by P. Bourke work)






Soda Constructor (Revisited)