4. Zaciekawienie teorią chaosu (1978-2019)

Moja przygoda z chaosem rozpoczęła się chyba podobnie jak analiza zachowania się populacji zwierzaczków robiona w 1975 roku przez Mitchella Feigenbauma, od zabawy z kalkulatorem. Dawno temu, może w czwartej klasie technikum (1978), dostałem w prezencie od Rodziców przedziwny kalkulator. Miałem w rękach czarną maszynkę Hewlett Packard z czerwonym wyświetlaczem. Byłem zdumiony, gdy zauważyłem, że na klawiaturze brakuje klawisza ze znakiem = (równa się) i nawiasów. Wtedy zetknąłem się po raz pierwszy z Odwrotną Notacją Polską (Reversed Polish Notation - RPN) wykonywania operacji rachunkowych. W systemie RPN znak równości i nawiasy były zbędne. W ramach poznawania możliwości obliczeniowych nowego urządzenia robiłem próby z iteracyjnym obliczaniem rozmaitych funkcji, chyba w ramach odpoczynku pomiędzy kolejnymi zadaniami z technologii chemicznej. Wprowadzałem do kalkulatora pomyślaną liczbę i naciskałem klawisz jakiejś funkcji (sinusa, pierwiastka, itp.) tyle razy aż wynik się ustalił, albo wyświetlił się znak błędu. Zaciekawiło mnie, że zachowanie się logarytmu było odmienne od pozostałych funkcji.

Gdy logarytmowałem ułamek, otrzymywałem wynik, który oczywiście był liczbą ujemną. Wydawało się, że to koniec zabawy, gdyż próba logarytmowania liczby ujemnej daje sygnał błędu na kalkulatorze. Zastosowałem jednak pewien chwyt. Usuwałem znak minus sprzed wyniku i logarytmowanie wykonałem ponownie. Powtarzałem tę zabawę i ze zdumieniem stwierdziłem, tak powtarzane operacje nie dążą do stabilnych wartości. Ciągle pojawiały się jakieś liczby, mniejsze, albo większe od jedności. Operację mogłem powtarzać godzinami i nie udawało mi się dojść do jakiejś granicy... Wszystko się jednak nudzi po jakimś czasie. Zapomniałem na rok lub dwa o tej zabawie, ale pojawiły się komputery ZX81 a potem Spectrum. Zafascynowała mnie wtedy możliwość programowania.

Tak isę złożyło, że na studiach chemicznych nauczyłem się konstruować schematy blokowe procedur obliczeniowych i tworzyć odpowiednie programy komputerowe w języku BASIC. Lubię ten język... Wtedy przypomniałem sobie o niesfornym logarytmie. Zapisałem schemat iteracji w postaci wzoru matematycznego:


 Początkowo za x1 wybierałem jakąś liczbę większą od zera i "puszczałem" nieskończoną pętlę prymitywnego programu. Na ekranie monitora pojawiały się ciągi różnych liczb, które nie miały dla mnie żadnego sensu. Przyszło mi wtedy na myśl, aby te liczby przedstawić jako punkty na osi liczbowej. Napisałem kolejny program, który ten pomysł realizował. Otrzymałem kawałek prostej, która z lewego końca była nieprzerwana, ale zmierzając ku prawej stronie punkty były rozmieszczone coraz rzadziej:
Wynik iteracji szeregu logarytmicznego na osi x.
 Tu przyszła mi do głowy pewna myśl w duchu Kartezjusza. Każdy punkt xn+1 może być potraktowany, jako punkt na osi prostopadłej do punktu xn. To oznacza tyle, że wolno mi przyjąć, że y = xn+1, a każde y może być następnym xn (i tak w koło Macieju)   Mogę po prostu narysować pojawiające się punkty w dwuwymiarowym układzie współrzędnych tak, jak rysuje się funkcje. Rysunek poniżej powstał w wyniku działania (Program02 - i inne programiki umieściłem na końcu wpisu):
Wynik działania szeregu logarytmicznego w układzie współrzędnych prostokątnych
Otrzymałem krzywą, która była "złamana" po dotknięciu osi x. W kolejnym kroku usunąłem to "złamanie" i otrzymałem, ku swojemu zdumieniu", fragment krzywej logarytmicznej:

Dodatek styczeń 2020.

Dodaję programik, który realizuje tę krzywą (bez osi). Zapisałem go w Small Basicu:
Mój program z 6.10.1995 roku, który odtwarzał krzywą logarytmiczną
'w sposób chaotyczny. Oryginał napisałem w Qbasicu

x = 0.5
skala=50
transx = 100
transy = 150
For a = 1 To 1000000
  y=math.Log(x)
  xe = Math.Round(x*skala) + transx
  ye = transy - Math.Round(y*skala)
  GraphicsWindow.SetPixel(xe, ye, "red")
  If y<0 Then
    x=math.Abs(y)
  Else
    x=y
  EndIf
EndFor

Jednakże niezależnie od liczby wykonanych iteracji krzywa nie chciała się rozciągać w kierunku ujemnych wartości rzędnej i dodatnich wartości odciętej. Odtworzyłem w ten sposób funkcję logarytmiczną, ale nie całą, jedynie jej część dość bliską początkowi układu współrzędnych. Przedłużające się iteracje nie wpływały już na rysunek. Iteracja osiągnęła coś w rodzaju stanu stacjonarnego. Punkty są gęsto usiane w pobliżu początku układu współrzędnych, dalej jest ich mniej.

Ta przygoda mogła się zakończyć w tym miejscu, ale na studiach dowiedziałem się o teorii chaosu. Jakże byłem zdziwiony, gdy zobaczyłem, że mój wzór iteracyjny przypomina formą klasyczny wzór na szereg chaotyczny, zwany szeregiem logistycznym:


Studiowałem to zagadnienie i dość szybko poznałem główne elementy teorii chaosu. Szybko nauczyłem się pisać procedury, które obrazowały zachowanie się szeregu logistycznego. Pierwszą z nich było pokazanie obszarów atraktorowych, punktów bifurkacyjnych obszarów chaotycznych w zależności od wartości c. Otrzymałem taki obrazek:
Zadałem sobie pytanie, co odtwarza szereg logistyczny, jeśli umieścić go w katrezjańskim układzie współrzędnych. Wynik był jasny. Otrzymałem fragment paraboli w przedziale ∈(0,1):

Nasunęły mi się wtedy intrygujące wnioski. rozumowałem wtedy tak: "Widzę, że rozwiązania chaotyczne niosą najwięcej informacji o przestrzeni, w której rozgrywa się dramat iteracji równania nieliniowego. Oczywiście dzieje się to pod warunkiem, że przeprowadzam dużą liczbę iteracji. Widzę, że odtwarza się parabola (a wcześniej funkcja logarytmiczna). Rozwiązania chaotyczne odtwarzają tylko część krzywej w pobliżu początku układu współrzędnych. Część leżącą w zakresie nieujemnych wartości funkcji logistycznej. Chaos jest jednak informatywny w odróżnieniu od rozwiązań zawierających atraktory. Zdaje się również, że ustala się pewien rozkład punktów w odtwarzanej przestrzeni, co oznacza, że w ramach przedstawionego algorytmu chaos nie jest idealny (prawdopodobnie rozmieszczenie punktów nie jest równomierne). Powyżej pewnej liczby iteracji następne iteracje nie zmieniają rysunku, co może oznaczać, że został osiągnięty pewien "stan stacjonarny". To ostatnie spostrzeżenie jest intrygujące. Załóżmy, że istnieje pewien proces fizyczny, opisany jakąś funkcją, której przebieg można odtworzyć za pomocą iteracji chaotycznej. Wolno się spodziewać, że taki układ fizyczny osiągnie wspomniany stan stacjonarny mimo chaosu poszczególnych rozwiązań."

Nadal (2019) patrzę na szeregi chaotyczne z ogromnym zadziwieniem. Od tamtego czasu poznałem wiele nowych właściwości funkcji logarytmicznej i innych procesów chaotycznych. Mam ciągle nadzieję, że mikroświat jest chaotyczny i ten chaos może zastąpić funkcję falową w opisie stanów kwantowych, przynajmniej w opisie atomów. Pracuję nad tym - na szczęście nie sam.

Lista dawnych programów realizujących opisane powyżej procesy (język QBASIC):

 'Program 00
 'program drukuje ciąg liczb szeregu chaotycznego
x = .2 'na przykład 0.2 oczywiście
10 x = ABS(LOG(x))
PRINT x
GOTO 10

'Program 01
'program rysuje punkty na osi x generowane przez szereg logarytmiczny
SCREEN 12
x = .2
x = ABS(LOG(x))
PSET (x * 70, 100)
GOTO 10
 
'Program 02 rysuje punkty szeregu logarytmicznego w kartezjańskim układzie 'współrzędnych
SCREEN 12
y = .2 'na przykład 0.2 oczywiście
skala = 30
10 x = y
y = ABS(LOG(x))
PSET (x * skala, y * skala)
GOTO 10

'Program 03
'modyfikacja programu02
SCREEN 12
LINE (50, 300)-(200, 300), 5
LINE (100, 250)-(100, 350), 5 ' rysuje początkowy fragment układu
y = .2
skala = 10
FOR i = 1 TO 5000
x = ABS(y)
y = LOG(x)
PSET (x * skala + 100, 300 - y * skala)
NEXT i

'Program 05
'program rysuje atraktory, bifurkacje i obszar chaotyczny w zależności od 'wartości c
'Atraktory, bifurkacje i chaos w r. logistycznym
DIM x(30)
SCREEN 12
k = 1000
FOR c = .9 TO 4 STEP .01
x = .1
FOR n = 1 TO k
x = c * x * (1 - x) 'równanie logistyczne
IF n >= (k - 30) THEN x(k - n) = x
NEXT n
FOR i = 1 TO 30
PSET (100 * c, 400 - x(i) * 300)
NEXT i
NEXT c

'Program 06 nowsza wersja programu05 (rok 2004)
'atraktory, bifurkacje i chaos funkcji logistycznej
SCREEN 12
FOR c = .9 TO 4 STEP .01
x = .2
min = 60 'liczba iteracji początkowych
FOR i = 1 TO 1000
x = c * x * (1 - x) 'równanie logistyczne
IF i > min THEN PSET (c * 100, 400 - x * 300)
NEXT i
NEXT c


'Program 08
'program odtwarza parabolę z szeregu logistycznego
SCREEN 12
c = 4
y = .2
min = 100 'liczba iteracji początkowych
FOR i = 1 TO 120 ' potem 200, 400 oraz 2000
x = y
y = c * x * (1 - x) 'r. logistyczne
IF i > min THEN PSET (x * 200 + 100, 350 - y * 300)
NEXT i

Komentarze

Popularne posty z tego bloga

Czas na gry w chaos. Paproć Barnsleya