Liczby platformy
Symulacje Fali 32
Diffusion-Limited Aggregation
Cząstki wykonują błądzenie losowe, aż dotkną rosnącego klastra i trwale się do niego przyklejają. Powstałe rozgałęzione drzewo ma wymiar fraktalny ~1,71.
Otwórz →Portret Fazowy
Wizualizator płaszczyzny fazowej ODE 2D. Kliknij, aby wyznaczyć trajektorie całkowane metodą RK4. Nakładki pokazują strzałki pola wektorowego, izokliny zerowe i punkty stałe.
Otwórz →Wzory Turinga
Układ reakcji-dyfuzji Graya-Scotta. Pięć presetów — Plamki, Paski, Labirynt, Mitoza, Robaki — każdy odpowiada odrębnym parametrom (F, k).
Otwórz →🌿 Diffusion-Limited Aggregation
Algorytm Wittena-Sandera
Witten i Sander wprowadzili DLA w swojej pracy z 1981 roku „Diffusion-Limited Aggregation, a Kinetic Critical Phenomenon”. Algorytm jest zwodniczo prosty: jedna cząstka jest ustalona w początku układu (ziarno). Nowe cząstki są wielokrotnie generowane w losowym punkcie na okręgu tuż poza bieżącym promieniem klastra, a następnie wykonują błądzenie losowe (±1 wzdłuż x lub y w każdym kroku). W chwili gdy cząstka wyląduje sąsiadując z dowolną komórką już należącą do klastra, zamarza na stałe i staje się jego częścią. I tak w kółko.
Gałęzie powstają, ponieważ cząstki wykonujące błądzenie losowe daleko od klastra mają jednakową szansę zbliżenia się z dowolnego kierunku — ale cząstki głęboko we wklęsłej szczelinie rzadko zdołają zdyfundować w głąb, zanim dotkną czubka gałęzi. Dlatego czubki rosną najszybciej i przesłaniają wnętrze, tworząc charakterystyczną strukturę dendrytyczną.
Szczegóły implementacji
-
Siatka: 500×500
Uint16Array. Wartość komórki 0 = pusta; wartość ≥1 = kolejność, w jakiej cząstka dołączyła do klastra. Kolejność steruje gradientem koloru (wcześniejsze cząstki ciemniejsze, nowsze jaśniejsze). -
Promień startu: błądzące cząstki startują na
okręgu o promieniu
maxRadius + 5.maxRadiusto odległość euklidesowa od początku układu do najbardziej zewnętrznej komórki klastra, aktualizowana za każdym razem, gdy cząstka zamarza. -
Warunek eliminacji: cząstki, które oddalą się
poza
SIZE/2 − 2(połowa krawędzi siatki), są odrzucane i generowane ponownie. Zapobiega to wędrowaniu cząstek przez astronomicznie długi czas na dużych siatkach. - Suwak lepkości (0,1 – 1,0): gdy błądząca cząstka sąsiaduje z klastrem, zamarza tylko z prawdopodobieństwem p = lepkość. Niższa lepkość daje gęstsze, mniej rozgałęzione struktury, bo cząstki mają wielokrotną szansę odejścia od cienkich czubków.
-
Kształty ziarna: Punkt, Linia, Pierścień, Krzyż
— wszystkie działają poprzez tę samą funkcję
addToCluster(x,y); komórki ziarna zasiewają początkowy klaster, zanim ruszą błądzące cząstki. -
Wiele cząstek na klatkę: jednocześnie aktywnych
jest 1–40 cząstek. Każda wykonuje krok raz na podklatkę; cztery
podklatki uruchamiane są na każde
requestAnimationFrame. Daje to ~60×4×40 = 9600 kroków cząstek na sekundę na typowym wyświetlaczu. -
Oszacowanie wymiaru fraktalnego: wyświetlane
jako
Df =ln(N) / ln(R), gdzie N to liczba cząstek, a R tomaxRadius. Teoretycznie ~1,71 w 2D; odczyt na żywo zbliża się do tej wartości w miarę wzrostu klastra.
Palety kolorów
Sześć palet mapuje indeks dołączenia do klastra (znormalizowany
0–1 względem maxParticles) na trójkę RGB: Szmaragd,
Złoto, Lód, Płomień, Fiolet i Mono. Zmiana palety wywołuje pełne
przerysowanie wszystkich pikseli ImageData
N×N na podstawie zapisanej siatki, więc żadne
dane cząstek nie są tracone.
Co warto wypróbować
- Ustaw lepkość na 0,2 i porównaj gęstszy klaster z lepkością 1,0 — wymiar fraktalny zauważalnie maleje.
- Użyj ziarna Krzyż lub Pierścień, aby wyhodować symetryczne klastry; kształt ziarna zostaje zachowany w topologii rozgałęzień.
- Podnieś maksymalną liczbę cząstek do 20 000 i pozwól symulacji działać, aby zobaczyć, jak wymiar fraktalny zbliża się do teoretycznej wartości 1,71.
🔄 Portret Fazowy
Dlaczego płaszczyzny fazowe?
Dwuwymiarowy autonomiczny układ ODE ẋ = f(x,y), ẏ = g(x,y) nie da się rozwiązać analitycznie dla większości interesujących f i g — ale jego zachowanie można w pełni scharakteryzować geometrycznie. Płaszczyzna fazowa to układ współrzędnych (x, y); w każdym punkcie rysujemy małą strzałkę w kierunku (f, g). Trajektorie to krzywe płynące wzdłuż tych strzałek. Punkty stałe (gdzie strzałki znikają) klasyfikuje się jako węzły, spirale, siodła lub centra — klasyfikacja wymaga jedynie wartości własnych jakobianu.
Sześć klasycznych układów
- Lotka-Volterra — drapieżnik-ofiara; neutralnie stabilne zamknięte orbity wokół równowagi współistnienia, bez zapadania spiralnego, ponieważ układ jest zachowawczy.
- Van der Pol — μ = 2; sztywny oscylator relaksacyjny z jednym niestabilnym punktem stałym w początku układu, otoczonym unikalnym stabilnym cyklem granicznym.
- Wahadło — nieliniowe θ̈ + 0,25θ̇ + sin θ = 0; tłumione stabilne spirale przy całkowitych wielokrotnościach 2π, punkty siodłowe przy nieparzystych wielokrotnościach π.
- Bifurkacja Hopfa — ṙ = r(1−r²), postać kartezjańska; idealny kołowy cykl graniczny przy r = 1, do którego zbiegają wszystkie trajektorie.
- Siodło-węzeł — ẋ = x²−1, ẏ = −y; stabilny węzeł w (−1, 0) i siodło w (+1, 0), gdzie oś y stanowi separatrysę.
- Spirala zapadająca — układ liniowy z wartościami własnymi −0,2 ± i; wszystkie trajektorie spiralnie zbiegają do środka z tą samą częstością kątową.
Implementacja: całkowanie RK4
Trajektorie są całkowane klasyczną metodą Rungego-Kutty czwartego
rzędu. Każde wywołanie rk4(x, y, dt) oblicza
f i g czterokrotnie (w bieżącym punkcie, dwóch punktach
pośrednich i przewidywanym punkcie końcowym) i łączy je z wagami
1/6, 1/3, 1/3, 1/6. Krok czasowy wynosi
dt = 0,03, a na każde wywołanie
requestAnimationFrame wykonywanych jest do 6 kroków
RK4. Trajektorie są automatycznie przerywane, gdy opuszczą promień
eliminacji równy 3-krotności zakresu widoku.
Izokliny zerowe
Izoklina zerowa x (czerwona) to zbiór punktów, w których ẋ = 0 — trajektorie przecinają ją, poruszając się pionowo. Izoklina zerowa y (niebieska) to miejsce, gdzie ẏ = 0 — trajektorie przecinają ją, poruszając się poziomo. Ich przecięcia są zawsze punktami stałymi. Obie są obliczane przez skanowanie siatki 300×300 płaszczyzny fazowej i wykrywanie zmian znaku kolumna po kolumnie (dla izokliny x) lub wiersz po wierszu (dla izokliny y), z interpolacją liniową do precyzji podsiatkowej.
Co warto wypróbować
- Kliknij „Auto-seed”, aby zalać płaszczyznę fazową trajektoriami i od razu zobaczyć globalną strukturę przepływu.
- W układzie Lotka-Volterra kliknij w pobliżu punktu stałego (2, 1,5) i obserwuj zamkniętą orbitę; kliknij dalej, aby uzyskać większą orbitę.
- W układzie Van der Pol kliknij blisko początku układu (niestabilny) i obserwuj, jak spirala rozszerza się na zewnątrz do cyklu granicznego.
- Wyłącz izokliny zerowe, aby zredukować szum wizualny podczas badania kształtów trajektorii.
🐆 Wzory Turinga
Spostrzeżenie Turinga z 1952 roku
W pracy „The Chemical Basis of Morphogenesis” (1952) Alan Turing matematycznie wykazał, że dwa gatunki chemiczne o różnych współczynnikach dyfuzji mogą samoistnie złamać symetrię translacyjną — zaczynając od niemal jednorodnego rozkładu, układ wzmacnia małe fluktuacje przestrzenne i osiada w stabilnym, przestrzennie okresowym wzorze.
Kluczowy mechanizm to lokalna samo-aktywacja z dalekozasięgowym hamowaniem bocznym. Substancja aktywująca U katalizuje własną produkcję, a jednocześnie wytwarza inhibitor V, ale V dyfunduje szybciej niż U. Dlatego mały wzrost U tworzy lokalny nadmiar V, który tłumi U w otaczającym obszarze, wyrzeźbiając charakterystyczną długość fali wzoru.
Model Graya-Scotta
Gray i Scott (1984) wprowadzili czysty schemat reakcji, który wykazuje szeroką różnorodność wzorów Turinga w zależności od dwóch parametrów:
∂U/∂t = DU∇²U − UV² + F(1−U)
∂V/∂t = DV∇²V + UV² − (F+k)V
Tutaj UV² to człon autokatalityczny (U i V reagują,
tworząc więcej V), F(1−U) zasila U ze zbiornika, a
(F+k)V usuwa V. Stałe parametry to
DU = 0,16 i DV = 0,08
(więc U dyfunduje dwukrotnie szybciej niż V). Presety obejmują
mapę parametrów po raz pierwszy udokumentowaną przez
Pearsona (1993):
- Plamki (F=0,035, k=0,065) — izolowane obszary wysokiego V w morzu niskiego V, analogiczne do plam lamparta lub wzorów orki.
- Paski (F=0,060, k=0,062) — równoległe pasma, analogiczne do pasków zebry lub deseni tygrysa.
- Labirynt (F=0,040, k=0,060) — połączone, przypominające labirynt kanały, powszechny wzór na liniach papilarnych.
- Mitoza (F=0,028, k=0,053) — plamki, które okresowo dzielą się i mnożą, naśladując podział komórkowy.
- Robaki (F=0,078, k=0,061) — wijące się, wydłużone plamki, które powoli dryfują po siatce.
Implementacja: 9-punktowy laplasjan, całkowanie Eulera
Symulacja działa na okresowej siatce 200×200, wykorzystując
pary buforów podwójnych Float32Array. Dyskretny
laplasjan wykorzystuje 9-punktowy szablon z wagami 0,05 dla
czterech sąsiadów po przekątnej i 0,20 dla czterech sąsiadów
głównych (sumujących się do 1 minus waga środkowa −1), co
zapewnia lepszą izotropię niż standardowy szablon 5-punktowy.
Całkowanie wykorzystuje jawną metodę Eulera z
dt = 1,0; jest to numerycznie stabilne,
ponieważ DU ≤ 0,16 < 0,25 (granica
stabilności CFL dla tego szablonu).
Pięć palet kolorów (Bursztyn, Ocean, Plazma, Jadeit, Mono) mapuje
pole stężenia U liniowo z tła na pierwszy plan. Pętla renderująca
zapisuje bezpośrednio do bufora pikseli ImageData dla
maksymalnej przepustowości — bez pośrednich łańcuchów kolorów CSS.
Inicjalizacja: zaszczepione plamy
Siatka startuje przy U ≈ 1, V ≈ 0 wszędzie (trywialny punkt stały), z niewielkim losowym szumem łamiącym symetrię. Dwanaście małych okrągłych plam o promieniu 4 jest zaszczepionych z U = 0,5, V = 0,25. Działają one jako miejsca zarodkowania; bez nich sam szum potrzebowałby znacznie więcej czasu na zasianie wzoru. Ostateczny wzór jest niezależny od położenia ziaren — tylko (F, k) decyduje o tym, jaki typ wzoru ostatecznie powstanie.
Co warto wypróbować
- Przełączaj między presetami i obserwuj, jak istniejący wzór rozpuszcza się, a powstaje nowy — stan przejściowy jest często ciekawszy niż stan ustalony.
- Wypróbuj preset Mitoza: widać, jak pojedyncze plamki dzielą się na dwie i oddalają się od siebie.
- Podnieś prędkość do 20 kroków na klatkę, aby osiągnąć stan ustalony w kilka sekund; obniż ją do 1, aby obserwować rozwój wzoru w zwolnionym tempie.
- Naciśnięcie Reset przy presecie Labirynt za każdym razem wygeneruje inny labirynt — stan ustalony jest unikalny w typie, ale nie w mikroskopijnych szczegółach.
Notatki techniczne
-
Malowanie ImageData w DLA — za każdym razem,
gdy nowa cząstka się przykleja, do bufora
ImageDatamalowany jest tylko jej pojedynczy piksel; całe wywołanieputImageDatanadal ma złożoność O(N²), ale unika operacji na łańcuchach znaków zbieranych przez garbage collector przy każdym pikselu. - Portret fazowy — wykrywanie izoklin zerowych skanuje podsiatkę 300×300 osobno dla każdej kolumny (izoklina x) i każdego wiersza (izoklina y), szukając miejsc zerowych f lub g; zmiana znaku ⇒ interpolacja liniowa do precyzji podkomórkowej.
- Stabilność Graya-Scotta — jawna metoda Eulera jest warunkowo stabilna dla części dyfuzyjnej, gdy D < 1/(4 × dt), czyli D < 0,25 przy dt = 1. Zarówno DU = 0,16, jak i DV = 0,08 spełniają ten warunek; człony reakcji są ograniczone i nie zagrażają stabilności.
-
Wszystkie symulacje Fali 32 mają pełne strony EN + UK i są
zarejestrowane w
simulations.json.
Tagi
DLA Fraktale Błądzenie Losowe Wymiar Fraktalny Portret Fazowy Układy Dynamiczne Van der Pol Lotka-Volterra RK4 Wzory Turinga Reakcja-Dyfuzja Gray-Scott Morfogeneza Fala 32
Zapowiedź Fali 33
Trzy symulacje zaplanowane na Falę 33:
- Diagram Woronoja — interaktywna geometria obliczeniowa; dodawaj punkty zarodkowe i obserwuj, jak komórki Woronoja i triangulacja Delaunaya aktualizują się w czasie rzeczywistym.
- Podwójne wahadło — chaotyczna dynamika wahadła dwuogniwowego; wizualizuj wrażliwość na warunki początkowe za pomocą wielu jednoczesnych trajektorii.
- Neuron Hodgkina-Huxleya — nagrodzony Nagrodą Nobla model generowania potencjału czynnościowego; reguluj przewodności kanałów jonowych i obserwuj zmianę wzorca impulsów.
Wszystkie symulacje Fali 33 zostaną wydane z pełnymi stronami EN + UK w dniu premiery.