Daya tarik aneh dari peta logistik

21

Tujuan dari tantangannya adalah sekitar plot penarik dari peta logistik sebagai fungsi dari parameter yang r (juga disebut bifurkasi diagram ), atau sub regional itu. Tampilan grafik dapat dilihat pada gambar berikut dari Wikipedia:

masukkan deskripsi gambar di sini

Latar Belakang

The peta logistik adalah fungsi matematika yang mengambil input x k dan peta untuk output x k + 1 didefinisikan sebagai

             x k + 1 = r x k (1− x k )

di mana r adalah parameter peta, diasumsikan terletak pada interval [0, 4].

Mengingat r di [0,4], dan nilai awal x 0 pada interval [0,1], sangat menarik untuk berulang kali mengajukan permohonan fungsi untuk sejumlah besar N iterasi, menghasilkan nilai akhir x N . Perhatikan bahwa x N juga akan terletak pada [0,1] juga.

Sebagai contoh, pertimbangkan r = 3,2, N = 1000. Nilai awal x 0 = 0,01 memberi x 1000 = 0,5130. Untuk x 0 = 0,02 hasilnya adalah x 0 = 0,7995. Untuk setiap nilai awal lainnya x 0 nilai akhir x 1000 sangat dekat dengan baik 0,5130 atau 0,7995. Ini terlihat dalam grafik sebagai ketinggian dua garis pada posisi horisontal r = 3,2.

Ini tidak berarti bahwa untuk r = 3,2 setiap urutan konvergen ke salah satu dari dua nilai tersebut. Bahkan, untuk dua nilai awal yang dipertimbangkan di atas, urutannya adalah (perhatikan perilaku berosilasi):

             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 ...

Apa yang benar adalah bahwa untuk cukup besar N , dan untuk hampir semua nilai awal x 0 , istilah x N akan mendekati salah satu elemen dari himpunan {0,5130, 0,7995}. Set ini disebut sebagai penarik r khusus ini .

Untuk nilai lain dari parameter r ukuran atractor set, atau elemen-elemennya, akan berubah. Grafik memplot elemen dalam penarik untuk setiap r .

Penarik untuk r tertentu dapat diperkirakan oleh

  1. menguji berbagai nilai awal x 0 ;
  2. membiarkan sistem berevolusi untuk sejumlah besar N iterasi; dan
  3. mencatat nilai akhir x N yang diperoleh.

Tantangan

Input

  • N : jumlah iterasi.

  • r 1 , r 2 dan s . Ini menentukan himpunan R dari nilai r , yaitu R = { r 1 , r 1 + s , r 1 + 2 s , ..., r 2 }.

Prosedur

Set X dari nilai awal x 0 adalah tetap: X = {0,01, 0,02, ..., 0,99}. Opsional, 0 dan 1 juga dapat dimasukkan dalam X .

Untuk setiap r di R dan masing-masing x 0 di X , iterate logistik peta N kali untuk menghasilkan x N . Catat tupel yang diperoleh ( r , x N ).

Keluaran

Plot setiap tupel ( r , x N ) sebagai titik di bidang dengan r sebagai sumbu horizontal dan x N sebagai sumbu vertikal. Keluaran harus berupa grafik (bukan seni ASCII).

Aturan tambahan

  • Prosedur yang ditunjukkan menentukan hasil yang diperlukan, tetapi tidak ditegakkan. Prosedur lain apa pun yang menghasilkan set tupel ( r , x N ) yang sama dapat digunakan.
  • Input fleksibel seperti biasa.
  • Kesalahan floating point tidak akan ditahan terhadap penjawab.
  • Output grafis diperlukan, dalam format apa pun yang diterima . Secara khusus, output dapat ditampilkan di layar, atau file grafik dapat diproduksi, atau array nilai RGB mungkin output. Jika menghasilkan file atau array, silakan posting contoh seperti apa saat ditampilkan.
  • Grafik dapat berupa vektor atau raster. Untuk grafik raster, ukuran gambar harus setidaknya 400 × 400 piksel.
  • Setiap titik harus ditampilkan sebagai satu piksel, atau sebagai tanda dengan ukuran urutan satu piksel (jika tidak, grafik dengan cepat akan berantakan).
  • Rentang sumbu harus [0,4] untuk r (sumbu horizontal) dan [0,1] untuk x N (sumbu vertikal); atau mungkin lebih kecil asalkan mencakup semua poin yang diperoleh.
  • Timbangan sumbu bersifat arbitrer. Secara khusus, skalanya tidak harus sama untuk kedua sumbu.
  • Garis kisi, label sumbu, warna, dan elemen serupa dapat diterima, tetapi tidak diperlukan.
  • Kode terpendek dalam byte menang.

Uji kasus

Klik pada setiap gambar untuk versi resolusi tinggi.

N = 1000; r1 = 2.4; r2 = 4; s = 0.001;

masukkan deskripsi gambar di sini

N = 2000; r1 = 3.4; r2 = 3.8; s = 0.0002;

masukkan deskripsi gambar di sini

N = 10000; r1 = 3.56; r2 = 3.59; s = 0.00002;

masukkan deskripsi gambar di sini

Pengakuan

Terima kasih kepada @FryAmTheEggman dan @AndrasDeak atas komentar bermanfaat mereka sementara tantangannya ada di kotak pasir.

Luis Mendo
sumber
Apa tidak ada solusi python ?!
@Lembik Saya memiliki implementasi referensi dalam Python (dan di Matlab), tapi saya tidak ingin menjawab sendiri
Luis Mendo
Anda diizinkan untuk menjawab pertanyaan Anda sendiri di PPCG (mungkin secara mengejutkan).
@Lembik saya tahu, tapi saya lebih suka mendapat jawaban orang lain
Luis Mendo

Jawaban:

13

MATL, 32 30 28 27 byte

4 byte disimpan berkat @Luis

3$:0:.01:1!i:"tU-y*]'.'3$XG

Format input r1, s, r2, danN

Cobalah di MATL Online

masukkan deskripsi gambar di sini

Penjelasan

        % Implicitly grab the first three inputs
3$:     % Take these three inputs and create the array [r1, r1+s, ...]
0:.01:1 % [0, 0.01, 0.02, ... 1]
!       % Transpose this array
i       % Implicitly grab the input, N
:"      % For each iteration
  tU    % Duplicate and square the X matrix
  -     % Subtract from the X matrix (X - X^2) == x * (1 - x)
  y     % Make a copy of R array
  *     % Multiply the R array by the (X - X^2) matrix to yield the new X matrix
]       % End of for loop
'.'    % Push the string literal '.' to the stack (specifies that we want
        % dots as markers)
3$XG    % Call the 3-input version of PLOT to create the dot plot
Suever
sumber
8

Mathematica, 65 byte

Graphics@Table[Point@{r,Nest[r#(1-#)&,x,#]},{x,0,1,.01},{r,##2}]&

Fungsi murni mengambil argumen N, r1, r2, s dalam urutan itu. Nest[r#(1-#)&,x,N]iterates fungsi logistik r#(1-#)&total Nkali mulai dari x; di sini argumen pertama ke function ( #) adalah Npertanyaan; Point@{r,...}menghasilkan Pointyang Graphicsakan senang untuk merencanakan. Table[...,{x,0,1,.01},{r,##2}]menciptakan sejumlah besar poin-poin ini, dengan xnilai berjalan dari 0ke 1dalam peningkatan .01; yang ##2di {r,##2}Menandakan semua argumen fungsi asli mulai dari yang kedua, dan begitu {r,##2}mengembang ke {r,r1,r2,s}yang benar menetapkan jangkauan dan peningkatan untuk r.

Contoh output, pada test case kedua: input

Graphics@Table[Point@{r,Nest[r#(1-#)&,x,#]},{x,0,1,.01},{r,##2}]&[2000,3.4,3.8,0.0002]

menghasilkan grafik di bawah ini.

masukkan deskripsi gambar di sini

Greg Martin
sumber
1
59 byte ListPlot @ Tabel [{r, Nest [r # (1 - #) &, x, #]}, {x, 0,1, .01}, {r, ## 2}] &
J42161217
Saya telah mengklarifikasi dalam tantangan bahwa prosedur yang ditunjukkan dimaksudkan untuk menentukan hasil yang diperlukan, tetapi prosedur itu sendiri tidak ditegakkan. Anda dapat menggunakan prosedur lain yang memberikan hasil yang sama. Maaf jika itu tidak jelas pada awalnya
Luis Mendo
Tidak masalah, kami punya beberapa jawaban bagus!
Greg Martin
1
Apakah Anda tidak akan menggunakan -6 byte itu. Apakah Anda berpikir bahwa ada yang salah dengan solusi ini?
J42161217
Oh saya pikir jawaban Anda adalah memposting (versi) kode dari komentar Anda ....
Greg Martin
5

Mathematica, 65 byte

Saya menggunakan beberapa trik Greg Martin dan ini adalah versi saya tanpa menggunakan Grafik

ListPlot@Table[{r,NestList[#(1-#)r&,.5,#][[-i]]},{i,99},{r,##2}]&

memasukkan

[1000, 2.4, 4, 0.001]

keluaran

masukkan deskripsi gambar di sini

memasukkan

[2000, 3.4, 3.8, 0.0002]

keluaran

masukkan deskripsi gambar di sini

J42161217
sumber
1
Jawaban pertama yang memilih untuk menghindari nilai awal 0 atau 1 (dan garis x = 0 yang mereka hasilkan) :-)
Luis Mendo
Anda harus menambahkan penjelasan tentang apa yang kode Anda lakukan, karena itu tidak benar-benar mengikuti prosedur yang ditentukan. OP dapat memutuskan apakah hasil yang tampak akurat membenarkan metode alternatif.
Greg Martin
Prosedur yang ditentukan tidak ditegakkan. Apa pun yang memberikan hasil yang sama, dengan cara lain, diizinkan (saya akan menjelaskannya). Terlepas dari ini, saya penasaran ingin melihat penjelasannya
Luis Mendo
Poin yang perlu Anda plot untuk setiap r, sudah ada di setiap "Nest". ini adalah kode asli dan ini adalah pendekatan pertama saya (beberapa waktu yang lalu) untuk merencanakan diagram ini.
J42161217
@Luis Mendo Saya memiliki versi yang lebih pendek (yang membuat catatan untuk mathematica) .58 byte tetapi Anda harus memasukkan hanya 3 input [N, r1, r2]. Butuh waktu tetapi berfungsi. Pot [Tabel [NestList [# ( 1 - #) r &. 5, #] [[- i]], {i, 99}], {r, ## 2}] &
J42161217
2

TI-Basic, 85 byte

Prompt P,Q,S,N
P→Xmin:Q→Xmax
0→Ymin:1→Ymax
For(W,.01,1,.01
For(R,P,Q,S
W→X
For(U,1,N
R*X*(1-X→X
End
Pt-On(R,X
End
End

Program TI-Basic lengkap yang mengambil input dalam urutan r1,r2,s,Ndan kemudian menampilkan output secara real time pada layar grafik. Perhatikan bahwa ini cenderung sangat lambat .

Berikut adalah contoh output tidak lengkap yang dihasilkan setelah sekitar 2,5 jam untuk input 3,4,0.01,100:

masukkan deskripsi gambar di sini

R. Kap
sumber
Anda tidak perlu *tanda - tandanya.
lirtosiast
1

Memproses JS, 125 123 120 byte

Terima kasih kepada Kritixi Lithos untuk menghemat 3 byte.

var f(n,q,r,s){size(4e3,1e3);for(i=0;i<1;i+=.01)for(p=q;p<=r;p+=s){x=i;for(j=0;j<n;j++)x*=p-p*x;point(p*1e3,1e3-x*1e3)}}

Cobalah online! Panggilan menggunakanf(N, r_1, r_2, s);

Khusus ASCII
sumber
Saya pikir Anda dapat menggantinya voiddengan varkarena Memproses JS
Kritixi Lithos
Dan x*=p*(1-x)bisa menjadix*=p-p*x
Kritixi Lithos
Dengan mengatur ulang for-loop, saya mendapatkan 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;}119 byte
Kritixi Lithos
1

GEL , 158 byte

`(N,r,t,s)=(LinePlotWindow=[r,t,0,1];for i=r to t by s do(p=.;for w=0to 1by 0.01do(x=w;for a=0to N do(x=i*x*(1-x););p=[p;q=[i,x]];);LinePlotDrawPoints(p);););

Ini mungkin bukan yang terpendek, tetapi menarik secara real time, meskipun bisa sangat lambat dengan input besar. Bagaimanapun, ini adalah fungsi anonim yang mengambil input dalam format (N,r1,r2,s)dan output plot di jendela baru. Perhatikan bahwa ini harus dijalankan dengan Genius versi GNOME.

Output sampel

R. Kap
sumber
1

R, 159 147 byte

pryr::f({plot(NA,xlim=c(a,b),ylim=0:1);q=function(r,n,x=1:99/100){for(i in 1:n)x=r*x*(1-x);x};for(i in seq(a,b,s))points(rep(i,99),q(i,n),cex=.1)})

Yang menghasilkan fungsi

function (a, b, n, s) 
{
    plot(NA, xlim = c(a, b), ylim = 0:1)
    q = function(r, n, x = 1:99/100) {
        for (i in 1:n) x = r * x * (1 - x)
        x
    }
    for (i in seq(a, b, s)) points(rep(i, 99), q(i, n), cex = 0.1)
}

plot(NA,...)menciptakan kanvas kosong yang memiliki dimensi yang benar. qadalah fungsi yang melakukan iterasi. Dibutuhkan nilai r, dan kemudian melakukan niterasi untuk semua titik awal antara 0.01dan 0.99. Kemudian mengembalikan vektor yang dihasilkan.

Untuk loop berlaku fungsi quntuk urutan ake bdengan langkah s. Alih-alih mengembalikan nilai, itu menambahkan mereka sebagai poin ke plot. Jika titik tarikan adalah satu nilai, semua poin akan tumpang tindih dan ditampilkan sebagai satu titik. cex=.1adalah tambahan yang diperlukan untuk membuat poin sekecil mungkin.

masukkan deskripsi gambar di sini

JAD
sumber