Katlama kaskad


12

İlk olarak, matematiksel bir ara, kısa ve zaman ayırmaya değer:

Eğer 0 < a < 4, lojistik fonksiyon f(x) = ax(1-x) kendi içindeki [0,1] aralığını eşleştirir. Bu, yineleme oyununu oynayabileceği anlamına gelir; örneğin, a = 2 ise, başlangıç ​​değeri 0.3, 0.42, sonra 0.4872 vb. olur.

Parametre aarttıkça, ikinci dereceden fonksiyon faşağıdaki anlamda daha karmaşık hale gelir:

  • 0 < a < 1 tüm başlangıç ​​değerleri 0'a doğru yinelenir.
  • 1 < a < 3 0 itici hale gelir, ancak tüm iterasyonları çeken yeni bir sabit nokta (a-1) / a vardır.
  • 3 < a < 1+sqrt(6) yeni sabit nokta itici hale gelir, ancak 2 çekim noktasından oluşan bir döngü ortaya çıkar.
  • 3.44949... < a < 3.54409... 2 döngü itici hale gelir, ancak 4 çekim noktası olan bir döngü görünür.
  • vb.

Feigenbaum bu parametre aralıkları uzunlukları yaklaştıkça alır bir oranda azaldığını fark 4.6692..., Feigenbaum sabiti . Harika keşif, bu dönem 2 çatallanma sekansının (kuadratik parabol gibi) artan, sonra azalan herhangi bir fonksiyon tarafından paylaşılan genel bir fenomendir. Bu kaosun evrenselliği hakkındaki ilk raporlardan biriydi .

Şimdi meydan okuma için! Feigenbaum sabitini seçtiğiniz bir doğrulukla hesaplayan mümkün olan en kısa kodu yazın . Burada nokta değil sen googled bir numarasının şifrelenmesi ile sisteme hile, ama aslında olması bilgisayar değeri bulmak için. Referans için, işte 30 basamaklı sabit:

4,669201609102990671853203821578


5
Bu sabiti hesaplamakta zaten zorlandığımıza şaşırdım, kaçırdığımız güzel bir fikir. En yakın lojistik çekiciyi planlamak gibi görünüyor . Kodun maksimum hatayı veya basamak sayısını almasını ve bu doğrulukta sabit üretmesini (makine sınırlarını bir noktadan geçerek yok saymak) öneririm. Veya sabit ve yakınsamada olduğu gibi, i'th ve (i + 1) st ikiye katlama aralıkları arasındaki oranı hesaplamak için. Bir doğruluk seçen golfçü çok belirsiz ve zor kodlama yapılamaz.
xnor

Meydan okumayı nasıl ifade edeceğimi çok düşündüm. Sorun şu ki, bu doğru bir şekilde hesaplamak için kötü bir şey, bu yüzden insanların bu ekstra rakamı kaba kuvvetle elde etmek yerine, kaygan bir yöntem uygulamaya odaklanmaktan daha fazla eğleneceklerini düşündüm. İnsanlar farklı hissediyorsa, kuralları değiştireceğim.
Rodrigo A. Pérez

1
Kaygan bir yöntem olarak veya kaba kuvvetten kaçınmak için ne arıyorsun? Kod golfleri için varsayılan olarak, çalışma zamanı veya alan üzerinde herhangi bir sınırlama gerektirmediğimizi unutmayın, bu nedenle kısa olması için optimize edildiğinde yanıtların çok verimsiz olma eğiliminde olduğunu unutmayın. Belki de en hızlı kodu veya kısıtlı karmaşıklık sorununu çözmek istiyorsunuz?
xnor

Yanıtlar:


3

JavaScript, 141 138 135 131 bayt, 8 basamak

Sanırım bir şey. Biraz geliştirilebilir olmalı. Birinin başlatılması gerekiyorsa: Feigenbaum nasıl hesaplanır . Ve doğrusu isterseniz kontrol kod bilge nasıl yapılacağını bilmek bu .

Aşağıdaki kodu konsolunuza yapıştırın. 4.6692016 68823243 hesaplar (bu yüzden tam olarak kesin değildir).

b=1;c=0;e=3.2;for(i=2;i<13;i++){z=b-c;a=b+z/e;j=4;while(j--){x=y=0;k=2**i;while(k--){y=1-2*y*x;x=a-x*x;}a-=x/y}e=z/(a-b);c=b;b=a;e}

b=1;c=0;e=3.2;for(i=2;i<13;i++){z=b-c;a=b+z/e;j=4;while(j--){x=y=0;k=2**i;while(k--){y=1-2*y*x;x=a-x*x;}a-=x/y}e=z/(a-b);c=b;b=a;e}
console.log(e)


2

Python, 127 bayt

c,b,e=0,1,2
for i in range(2,13):a=b+(b-c)/e;exec(("x=y=0;"+"y,x=1-2*y*x,a-x*x;"*2**i+"a=a-x/y;")*17);d,c,b=(b-c)/(a-b),b,a;e=d

Kredi javascript cevabı ile @ThomasW için gidiyor.

Ekle print(d)çıkışına 4,669201673141983 . Uzun dizelerin yürütmeden önce hesaplanması nedeniyle birkaç saniye sürer.


2

APL (Dyalog Unicode) , 79 bayt

⊃⊃{⌽u,a,c÷ub-⍨a←⍺{⍵-÷/⍵{(⍺-×⍨⊃⍵),1-2××/⍵}⍣⍺⊢0}⍣≡b+c÷⊃e b c←⍵}/(⌽2*1+⍳17),⊂*31

Çevrimiçi deneyin!

Çıkışlar 4.669201609 074452565738237725929176 (10 basamaklı). Daha doğru rakamlar elde etmek için sonuna yakın 17 sayısını artırabilirsiniz; TIO'ya 1 dakika içinde uyan en büyük sayı, 4.6692016091029 76931847851885076037 (14 basamak) veren 22'dir .

Dyalog APL, sabite yaklaşmak için daha fazla hassasiyet sağlayan 128 bit kayan nokta numaralarına sahiptir. Aksi takdirde, sayı belirli sayıda yinelemeden sonra ayrılır.

Algoritmanın kendisi, Thomas W'nin JS yanıtında ve diğerlerinde zaten referans verilen bu Python örnek koduyla aynıdır .

Yorum yapılmamış

func←{
  i←⍺       Input:   iterations of inner-inner loop
  e b c←⍵   Input:   d, a_1, a_1-a_2
  ab+c÷e   Initial value of a  a_1+(a_1-a_2d
  g←{       One iteration of a:
    x y0      Initialize x, y to 0
    h←{        One iteration of x,y:
      x y←⍵       Extract x,y
      y1-2×x×y   Next value of y
      x←⍺-x×x     Next value of x (here  is outer a)
      x,y         Return x,y
    }
    x y←⍵ h⍣⍺⊢x y   Iterate h  times (here  is outer i)
    ⍵-x÷y           Return next value of a
  }
  ai g⍣≡ a       Iterate g until a does not significantly change
  (c÷a-b),a,a-b   Return next value of d, a_1, a_1-a_2
}
 Reduce from right over iteration counts starting with (2.7,1,1) and
 extract the value of d
⊃⊃ func/ (⌽2*1+⍳17),⊂*31

1

Kömür , 84 bayt

A¹βA⁰εA³·²δF…²¦¹³«A⁺β∕⁻βεδαFχ«A⁰ξA⁰ψFX²ι«A⁻¹××ψ²ξψA⁻α×ξξξ»A⁻α∕ξψα»A∕⁻βε⁻αβδAβεAαβ»Iδ

Çevrimiçi deneyin! Açıklama için ayrıntılı koda bağlantı.

Buradan algoritma kullanır .

Baskılar 4.66920 0975097843 (6 basamaklı)

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.