Celem tej próby jest w przybliżeniu wykreślić attractor na mapie logistycznego w funkcji jego parametr r (zwany także schemat rozwidlenia ), lub w subregionie niego. Wygląd wykresu można zobaczyć na następującym obrazku z Wikipedii:
tło
Odwzorowanie logistyczne jest matematyczną funkcją, która zajmuje wejście x k i mapuje je do wyjścia x k + 1 zdefiniowanego jako
x k + 1 = r x k (1− x k )
gdzie r jest parametrem mapy, przy założeniu, że leży w przedziale [0, 4].
Biorąc pod uwagę, R w [0,4], a wartość początkowa x 0 w przedziale [0,1] Interesujące jest wielokrotnie stosuje się funkcję do dużej liczby N iteracji, tworząc końcową wartość x N . Zauważ, że x N musi koniecznie znajdować się w [0,1].
Jako przykład rozważmy r = 3,2, N = 1000. Wartość początkowa x 0 = 0,01 daje x 1000 = 0,5130. Dla x 0 = 0,02 wynikiem jest x 0 = 0,7995. Dla każdej innej wartości początkowej x 0 końcowe wartości x 1000 są bardzo zbliżone do 0,5130 lub 0,7995. Jest to widoczne na wykresie jako wysokość dwóch linii w pozycji poziomej r = 3,2.
Ten sposób nie oznacza to, że dla R = 3,2 Każda sekwencja jest zbieżny do jednej z tych dwóch wartości. W rzeczywistości dla dwóch rozważanych powyżej wartości początkowych sekwencje są (zwróć uwagę na zachowanie oscylacyjne):
x 0 = 0,01, ..., x 1000 = 0,5130, x 1001 = 0,7995, x 1002 = 0,5130, ...
x 0 = 0,02, ..., x 1000 = 0,7995, x 1001 = 0,5130, x 1002 = 0,7995 , ...
Co jest prawdą, że dla dostatecznie dużych N , a dla prawie wszystkich wartości początkowych x 0 , termin x N będzie zbliżony do jednego z elementów zbioru {0.5130, 0,7995}. Ten zestaw nazywa się atraktorem dla tego konkretnego r .
Dla innych wartości parametru r zmieni się rozmiar zestawu atraktora lub jego elementów. Wykres przedstawia elementy w atraktorze dla każdego r .
Atraktor dla określonego r można oszacować za pomocą
- testowanie szerokiego zakresu wartości początkowych x 0 ;
- pozwalając, aby system ewoluował dla dużej liczby N iteracji; i
- zwracając uwagę na końcowe wartości x N , które są uzyskiwane.
Wyzwanie
Wejścia
N : liczba iteracji.
r 1 , r 2 i s . Definiują one zbiór R wartości r , a mianowicie R = { r 1 , r 1 + s , r 1 + 2 s , ..., r 2 }.
Procedura
Zbiór X wartości początkowych x 0 jest stały: X = {0,01, 0,02, ..., 0,99}. Ewentualnie, od 0 do 1 mogą być także zawarte w X .
Dla każdego badania w R i każdy x 0 w X , iteracyjne logistyczne mapę N razy do produkcji x N . Zapisz uzyskane krotki ( r , x N ).
Wydajność
Narysuj każdą krotkę ( r , x N ) jako punkt w płaszczyźnie z r jako osią poziomą i x N jako osią pionową. Dane wyjściowe powinny być grafiki (nie sztuki ASCII).
Dodatkowe zasady
- Wskazana procedura określa wymagany wynik, ale nie jest egzekwowana. Można użyć dowolnej innej procedury, która ogłasza ten sam zestaw krotek ( r , x N ).
- Dane wejściowe są jak zwykle elastyczne.
- Błędy zmiennoprzecinkowe nie będą blokowane przez odpowiadającego.
- Wymagany jest wydruk graficzny w dowolnym akceptowanym formacie . W szczególności dane wyjściowe mogą być wyświetlane na ekranie lub może zostać utworzony plik graficzny lub tablica wartości RGB. Jeśli wyprowadzasz plik lub tablicę, zamieść przykład tego, jak to wygląda po wyświetleniu.
- Grafika może być wektorowa lub rastrowa. W przypadku grafiki rastrowej rozmiar obrazu powinien wynosić co najmniej 400 × 400 pikseli.
- Każdy punkt powinien być pokazany jako pojedynczy piksel lub jako znak wielkości rzędu jednego piksela (w przeciwnym razie wykres szybko się zaśmieci).
- Zakres osi powinien wynosić [0,4] dla r (oś pozioma) i [0,1] dla x N (oś pionowa); lub może być mniejszy, o ile zawiera wszystkie uzyskane punkty.
- Skale osi są dowolne. W szczególności skala nie musi być taka sama dla obu osi.
- Linie siatki, etykiety osi, kolory i podobne elementy są dopuszczalne, ale nie wymagane.
- Najkrótszy kod w bajtach wygrywa.
Przypadki testowe
Kliknij każdy obraz, aby wyświetlić wersję w wysokiej rozdzielczości.
N = 1000; r1 = 2.4; r2 = 4; s = 0.001;
N = 2000; r1 = 3.4; r2 = 3.8; s = 0.0002;
N = 10000; r1 = 3.56; r2 = 3.59; s = 0.00002;
Potwierdzenie
Dzięki @FryAmTheEggman i @AndrasDeak za ich pomocne komentarze, gdy wyzwanie było w piaskownicy.
Odpowiedzi:
MATL,
32302827 bajtów4 bajty zapisane dzięki @Luis
Format wejściowy jest
r1
,s
,r2
, iN
Wypróbuj w MATL Online
Wyjaśnienie
źródło
Mathematica, 65 bajtów
Czysta funkcja przyjmująca argumenty N, r1, r2, s w tej kolejności.
Nest[r#(1-#)&,x,N]
iteruje funkcję logistycznąr#(1-#)&
łącznieN
razy odx
; tutaj pierwszym argumentem funkcji (#
) jestN
pytanie;Point@{r,...}
produkuje takiPoint
,Graphics
który z przyjemnością spiskuje.Table[...,{x,0,1,.01},{r,##2}]
tworzy całą masę tych punktów, którychx
wartość zmienia się od0
do1
w krokach co.01
;##2
w{r,##2}
oznacza wszystkich pierwotnych argumentów funkcji, począwszy od drugiego, a więc{r,##2}
powiększa się do{r,r1,r2,s}
których poprawnie ustawia zakres i przyrost dlar
.Przykładowe dane wyjściowe, w drugim przypadku testowym: dane wejściowe
daje grafikę poniżej.
źródło
Mathematica, 65 bajtów
Użyłem niektórych sztuczek Grega Martina i to jest moja wersja bez grafiki
wkład
wydajność
wkład
wydajność
źródło
TI-Basic, 85 bajtów
Kompletny program TI-Basic, który pobiera dane wejściowe w kolejności,
r1,r2,s,N
a następnie wyświetla dane wyjściowe w czasie rzeczywistym na ekranie wykresu. Zauważ, że jest to niezwykle powolne .Oto niepełny przykładowy wynik wygenerowany po około 2,5 godzinach dla danych wejściowych
3,4,0.01,100
:źródło
*
znaków.Przetwarzanie JS,
125123120 bajtówDzięki Kritixi Lithos za oszczędność 3 bajtów.
Wypróbuj online! Zadzwoń za pomocą
f(N, r_1, r_2, s);
źródło
void
zvar
ponieważ jest to tworzenie JSx*=p*(1-x)
może zostaćx*=p-p*x
var f(n,q,r,s){size(4e3,1e3);for(i=0;i<1;i+=.01)for(p=q;x=i,p<=r;point(p*1e3,1e3-x*1e3),p+=s)for(j=0;j<n;j++)x*=p-p*x;}
ŻEL , 158 bajtów
Może nie jest najkrótszy, ale rysuje w czasie rzeczywistym, chociaż może być niezwykle powolny przy dużych nakładach. W każdym razie jest to anonimowa funkcja, która pobiera dane wejściowe w formacie
(N,r1,r2,s)
i wyświetla wykres w nowym oknie. Pamiętaj, że należy to uruchomić z wersją Genius GNOME.źródło
R,
159147 bajtówKtóry produkuje funkcję
plot(NA,...)
tworzy puste płótno o odpowiednich wymiarach.q
jest funkcją wykonującą iterację. Przyjmuje wartośćr
, a następnie wykonujen
iteracje dla wszystkich punktów początkowych między0.01
i0.99
. Następnie zwraca wynikowy wektor.Pętli for stosuje się funkcję
q
do sekwencjia
dob
krokus
. Zamiast zwracać wartości, dodaje je jako punkty do wykresu. Jeśli punkt przyciągania ma jedną wartość, wszystkie punkty będą się nakładać i pokazywać jako jeden punkt.cex=.1
jest niezbędnym dodatkiem, aby punkty były jak najmniejsze.źródło