Lojistik haritanın garip çekiciliği


21

Meydan amacı yaklaşık çizmek için çekici olarak bir lojistik harita parametresinin bir fonksiyonu olarak r (aynı zamanda çatallanma diyagramı ), ya da bunun bir alt-. Grafiğin görünümü Wikipedia'dan aşağıdaki resimde görülebilir:

görüntü tanımını buraya girin

Arka fon

Lojistik haritası bir giriş götüren bir matematiksel işlevdir x k ve bir çıkışa bunu eşler x k + 1 olarak tanımlanır

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

burada r , haritanın parametresidir , [0, 4] aralığında yer aldığı varsayılmaktadır.

Verilen r [0,4] 'de, bir başlangıç değeri x 0 [0,1] aralığı içinde, ilginç art arda uygulanır çok sayıda işlevini N nihai değeri üreten iterasyon x N . X N'nin mutlaka [0,1] içinde de olacağını unutmayın .

Örnek olarak, r = 3.2, N = 1000'i göz önünde bulundurun . İlk değer x 0 = 0.01, x 1000 = 0.5130 verir . İçin x 0 = 0.02 sonucudur x 0 = 0,7995. İçin herhangi bir başka başlangıç değerleri x 0 son değerler x 1000 son derece yakın 0.5130 veya 0.7995 birine bulunmaktadır. Bu, grafikte iki çizginin yüksekliği yatay konumda r = 3.2 olarak görülür .

Bu etmez değil demek için r , bu iki değerden birine her bir dizi yakınsak = 3.2. Aslında, yukarıda ele alınan iki ilk değer için, diziler şunlardır (salınım davranışına dikkat edin):

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

Ne olan doğru yeterince büyük için olmasıdır N , ve hemen hemen tüm başlangıç değerleri için x 0 terimi x K grubu {0,5130, 0,7995} elemanlarının birine yakın olacaktır. Bu sete, bu belirli r için çekici denir .

R parametresinin diğer değerleri için ayarlanan çekicinin boyutu veya elemanları değişecektir. Grafik, çekicideki elemanları her r için çizer .

Belirli için çekicinin r edilebilir tahmini tarafından

  1. geniş bir başlangıç ​​değer aralığı x 0 ;
  2. çok sayıda için sistemin geliştirilmesi izin N yineleme; ve
  3. Elde edilen nihai değerleri x N not alarak .

Meydan okuma

Girdiler

  • N : yineleme sayısı.

  • r 1 , r 2 ve s . Bu resim tanımlayan R değerlerinin r , yani R = { r 1 , r 1 + s , r, 1 + 2 s , ..., r, 2 }.

prosedür

Grubu X, başlangıç değerleri x 0 sabitlenir: X = {0.01, 0.02, ..., 0,99}. İsteğe bağlı olarak, 0 ve 1, X'e de dahil edilebilir .

Her biri için r içinde R ve her x , 0 içinde X , yineleme lojistik harita N üretmek katı x N . Elde edilen kayıtları kaydedin ( r , x N ).

Çıktı

Düzlemde, her ekseni ( r , x N ) yatay eksen olarak r ve dikey eksen olarak x N ile çizin . Çıktı grafik olmalıdır (ASCII resmi değil).

Ek kurallar

  • Belirtilen prosedür gerekli sonucu tanımlar ancak zorunlu değildir. Aynı ( r , x N ) kümeleri tedarik eden herhangi başka bir prosedür kullanılabilir.
  • Giriş her zamanki gibi esnektir.
  • Kayan nokta hataları cevaplayıcıya karşı yapılmayacak.
  • Kabul edilen herhangi bir formatta grafik çıktısı gereklidir . Özel olarak, çıktı ekranda gösterilebilir veya bir grafik dosyası üretilebilir veya bir RGB değerleri dizisi çıkarılabilir. Bir dosya veya diziyi çıkarıyorsanız, lütfen görüntülendiğinde neye benzediğine dair bir örnek gönderin.
  • Grafikler vektör veya raster olabilir. Tarama grafikleri için görüntünün boyutu en az 400 × 400 piksel olmalıdır.
  • Her nokta tek bir piksel olarak veya bir piksel sırasının büyüklüğünde bir işaret olarak gösterilmelidir (aksi halde grafik hızlı bir şekilde dağılır).
  • Eksen aralığı, r (yatay eksen) için [0,4] ve x N (dikey eksen) için [0,1] olmalıdır ; veya elde edilen tüm noktaları içerdiği sürece daha küçük olabilir.
  • Eksen ölçekleri keyfidir. Özellikle, ölçeğin her iki eksen için aynı olması gerekmez.
  • Izgara çizgileri, eksen etiketleri, renkler ve benzeri elemanlar kabul edilebilir, ancak gerekli değildir.
  • Bayt cinsinden en kısa kod kazanır.

Test durumları

Yüksek çözünürlüklü sürüm için her bir resme tıklayın.

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

görüntü tanımını buraya girin

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

görüntü tanımını buraya girin

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

görüntü tanımını buraya girin

alındı

Zorluk sanal alandayken , @FryAmTheEggman ve @AndrasDeak'e yararlı yorumları için teşekkür ederiz .


Python çözümü yok mu?

@Lembik Python'da (ve Matlab'da) bir referans uygulamam var, ancak kendime cevap vermek istemiyorum
Luis Mendo

PPCG ile ilgili kendi sorularınızı cevaplamanıza izin verilir (belki de şaşırtıcı bir şekilde).

@Lembik biliyorum, ama başkalarının cevaplarını almayı tercih ederim
Luis Mendo

Yanıtlar:


13

MATL, 32 30 28 27 bayt

@Luis sayesinde 4 bayt kaydedildi

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

Giriş biçimi olan r1, s, r2veN

MATL Online'da deneyin

görüntü tanımını buraya girin

açıklama

        % 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

8

Mathematica, 65 bayt

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

N, r1, r2, s argümanlarını bu sırada alan saf fonksiyon. Nest[r#(1-#)&,x,N]lojistik fonksiyonunu r#(1-#)&, toplamdan Nbaşlayarak toplamda tekrar eder x; burada işlev ( #) işlevinin ilk argümanı Nsöz konusu olan; arsa mutlu olacak Point@{r,...}bir Pointşey üretiyor Graphics. Table[...,{x,0,1,.01},{r,##2}]bu nokta bir sürü oluşturur xçalışan değere 0kadar 1artışlarla .01; ##2olarak {r,##2}temsil eder, ikinci bir başlangıç malzemesi, orijinal fonksiyon argümanlar ve böylece {r,##2}için genişler {r,r1,r2,s}doğru aralıklı ve artış belirleyen r.

İkinci test durumunda örnek çıktı: giriş

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

Aşağıdaki grafikleri verir.

görüntü tanımını buraya girin


1
59 bayt ListePloti @ Tablo [{r, Yuva [r # (1 - #) &, x, #]}, {x, 0,1, .01}, {r, ## 2}] &
J42161217

Belirtilen prosedürün istenen sonucu tanımlamak olduğunu, ancak prosedürün kendisinin zorlanmadığını açıkça belirttim. Aynı sonucu veren başka herhangi bir prosedürü kullanabilirsiniz. Bu ilk başta net değildi eğer üzgünüm
Luis Mendo

Sorun değil, birkaç iyi cevabımız var!
Greg Martin

1
Bu -6 baytları kullanmayacak mısın? Somathing'in bu çözümde yanlış olduğunu düşünüyor musunuz?
J42161217,

Oh, cevabın senin yorumunun kodunun (bir versiyonunun) ilanı olduğunu düşündüm ....
Greg Martin

5

Mathematica, 65 bayt

Greg Martin'in numaralarından bazılarını kullandım ve Grafik kullanmadan bu benim versiyonum.

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

giriş

[1000, 2.4, 4, 0.001]

çıktı

görüntü tanımını buraya girin

giriş

[2000, 3.4, 3.8, 0.0002]

çıktı

görüntü tanımını buraya girin


1
0 veya 1 başlangıç ​​değerlerinden kaçınmayı seçen ilk cevap (ve ürettikleri x = 0 satırı) :-)
Luis Mendo

Belirtilen prosedürü gerçekten takip etmediğinden, kodunuzun ne yaptığına dair bir açıklama eklemelisiniz. OP, doğru görünen sonucun alternatif yöntemi haklı gösterip göstermediğine karar verebilir.
Greg Martin

Belirtilen prosedür uygulanmadı. Aynı sonucu veren her şeye, başka bir yolla izin verilir (açıklığa kavuştururum). Ne olursa olsun, açıklamayı görmeyi merak ediyorum
Luis Mendo

Her r için çizmeniz gereken noktalar, zaten her "Yuva" da bulunmaktadır. bu orjinal kod ve bu diyagramı çizme konusundaki ilk yaklaşımımdı.
J42161217

@Luis Mendo Daha kısa bir sürüme sahibim (bu, matematiğe yönelik bir kayıt yapar) .58 bayt ancak yalnızca 3 giriş girmelisiniz [N, r1, r2] .Bu zaman alıyor ama çalışıyor.Plot [Tablo [NestList [# ( 1 - #) r &, 5, #] [[- -]], {i, 99}], {r, ## 2}] &
J42161217

2

TI-Basic, 85 bayt

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

Sırayla girişi alan r1,r2,s,Nve ardından gerçek zamanlı olarak çıktıyı grafik ekranda gösteren eksiksiz bir TI-Basic programı . Bunun inanılmaz derecede yavaş olma eğiliminde olduğuna dikkat edin .

Girdi için yaklaşık 2,5 saat sonra üretilen tamamlanmamış bir örnek çıktı 3,4,0.01,100:

görüntü tanımını buraya girin


*İşaretlere ihtiyacın yok .
lirtosiast,

1

İşleme JS, 125 123 120 bayt

3 bayt tasarruf için Kritixi Lithos için teşekkürler .

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)}}

Çevrimiçi deneyin! Kullanarak çağrıf(N, r_1, r_2, s);


Sana yerini alabilir mi voidile varçünkü 's İşleme JS
Kritixi Lithos

Ve x*=p*(1-x)olabilirx*=p-p*x
Kritixi Lithos 20:17

For- 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;}
loop'ı

1

JEL , 158 bayt

`(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);););

En kısa olmayabilir, ancak devasa girdilerde inanılmaz derecede yavaş olabilmesine rağmen, gerçek zamanlı olarak çekiyor. Neyse, bu formatta girdi alan (N,r1,r2,s)ve arsaları yeni bir pencerede çıkaran isimsiz bir fonksiyondur . Bunun Genius'un GNOME sürümüyle çalıştırılması gerektiğini unutmayın .

Örnek çıktı


1

R, 159 147 bayt

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)})

İşlevi kim üretiyor

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,...)doğru boyutlara sahip boş bir tuval oluşturur. qyineleme yapan işlevdir. Değeri alır rve ardından ve narasındaki tüm başlangıç ​​noktaları için yinelemeler yapar . Daha sonra elde edilen vektörü döndürür.0.010.99

İçin döngü fonksiyonu uygular qsekansına aiçin badım s. Değerleri döndürmek yerine, bunları arsaya puan olarak ekler. Çekim noktası bir değer ise, tüm noktalar örtüşecek ve bir nokta olarak gösterilecektir. cex=.1puanları mümkün olduğunca küçük yapmak için gerekli bir eklemedir.

görüntü tanımını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.