İçindekiler:

ESP32'de Mandelbrot ve Julia Setleri: 4 Adım (Resimlerle)
ESP32'de Mandelbrot ve Julia Setleri: 4 Adım (Resimlerle)

Video: ESP32'de Mandelbrot ve Julia Setleri: 4 Adım (Resimlerle)

Video: ESP32'de Mandelbrot ve Julia Setleri: 4 Adım (Resimlerle)
Video: Mandelbrot and Julia sets on ESP32 2024, Temmuz
Anonim
Image
Image
Mandelbrot ve Julia ESP32'yi Ayarlıyor
Mandelbrot ve Julia ESP32'yi Ayarlıyor
Mandelbrot ve Julia ESP32'yi Ayarlıyor
Mandelbrot ve Julia ESP32'yi Ayarlıyor

En ünlüsü Mandelbrot kümesi olan fraktalları kesinlikle biliyorsunuzdur.

İşte ESP32'de oynamak için bir program. ESP32'yi seçtim çünkü hesaplamaları standart bir Arduino'dan daha hızlı yapacağını düşünüyorum (daha yüksek saat frekansı: 240 MHz): hesaplama ve görüntüleme için yaklaşık bir ila bir buçuk saniye.

Kod, 480 x 320 TFT dokunmatik ekranda görüntülenir. Birkaç parametre değeri için Mandelbrot ve Julia kümelerini hesaplar ve fraktal yönü (yani her ölçek değişikliğinde aynı yapıların varlığı) görmek için ilgi alanlarını yakınlaştırmanıza olanak tanır. Yakınlaştırma seviyesi, hesaplamaların sınırlı doğruluğu nedeniyle sınırlıdır, ancak görüntü bozulmadan önce yarım düzine yakınlaştırma yapılabilir.

Fraktalların sihirli dünyasını keşfetmeye hazır olun…

Adım 1: Mandelbrot ve Julia Kümeleri Nedir?

Mandelbrot ve Julia Kümeleri Nedir?
Mandelbrot ve Julia Kümeleri Nedir?
Mandelbrot ve Julia Kümeleri Nedir?
Mandelbrot ve Julia Kümeleri Nedir?
Mandelbrot ve Julia Kümeleri Nedir?
Mandelbrot ve Julia Kümeleri Nedir?

Mandelbrot seti, 19. yüzyılın sonunda Peano, Sierpinski ve Julia tarafından başlatılan, fraktal geometride öncü çalışmalar yapan Fransız ve Amerikalı bir matematikçi olan Benoit Mandelbrot'un (1924-2010) adını almıştır.

Fraktal nesneler nelerdir?

Deniz kıyısının çizgisi, bulutların şekli, bir ağaç gibi doğanın kaotik görünebilecek düzensizlikleri, aslında değişen ölçekte çok karmaşık bir geometrinin ifadesidir. Bu bağlamda, kesirli boyut kavramı, (her zaman bir tam sayı olan) olağan Öklid boyutunun yerine geçer!

Fraktal bir nesne, herhangi bir kısmı bütünle aynı olacak şekildedir (buna öz-benzerlik denir): yapısı, ölçek değişikliği ile değişmez.

"Fractal" terimi, 1974 yılında Benoît Mandelbrot tarafından "kırık", "düzensiz" anlamına gelen Latince fractus kökünden oluşturulan bir neologizmdir. Hem isim hem de sıfattır. Kıyı şeridinin ana hatları veya Romanesco lahanasının görünümü (resme bakın) gibi birçok doğal fenomen, yaklaşık fraktal şekillere sahiptir.

Benoît Mandelbrot biraz alışılmadık bir kariyere sahipti: Lille Üniversitesi'nde (Fransa) öğretmenlik yaptıktan sonra IBM'de bir pozisyon aldı ve burada hızla IBM Üyesi oldu ve bu da ona bilimsel çalışmaları için büyük bir özgürlük verdi. 1980'lerin başında, IBM'den ayrıldıktan sonra Harvard'da profesör oldu, ancak kalıcı olarak Yale'e yerleşti.

1960'larda ve 1970'lerin başındaki çalışmaları, matematik camiasının büyük bir kısmı tarafından sadece merak olarak kabul edilen bu nesnelerin doğada her yerde bulunduğunu gösterdiği "Fractal Objects" başlıklı ünlü bir makale yayınlamasına yol açtı. Fizik, hidroloji, finans, meteoroloji, coğrafya, jeoloji, metalurji gibi çok çeşitli alanlarda birçok örnek verdi.

Mandelbrot kümesi nedir?

Başlamak için, bir program tarafından oluşturulan güzel bir çizim olduğunu varsayalım. Ve bu program oldukça basittir. Bilgisayar tarafından oluşturulan birçok çizim ve bunları oluşturmak için birçok bilgisayar yazılımı vardır. Peki bu konuda bu kadar özel olan ne? İlk olarak, Mandelbrot kümesi planın bir alt kümesidir, bir noktalar topluluğudur. Alanlar içerir, aynı zamanda pürüzsüz eğriler, iplikler, birden çok dalın çıktığı noktalar ve diğer şeyleri içerir. İkincisi: gerçekten büyüleyici ve çok ilginç bir geçmişi var.

20. yüzyılın başında, Fransız matematikçiler Pierre Fatou ve Gaston Julia, holomorfik dinamikler adı verilen bir matematik alt alanı geliştirdiler. Mevcut en basit formüllerden bazılarını kullanarak sayılar üzerinde hareket eden belirli işlevlerle ilgileniyorlardı. Söz konusu sayılar karmaşık sayılardır, gerçek ve sanal kısımlar olarak adlandırılan iki koordinatla (tıpkı bir düzlemin noktaları gibi) temsil edilen niceliklerdir. 16. yüzyılda matematikçiler tarafından polinomların köklerini ve denklemlerin çözümünü bulmaya yardımcı olmak için icat edildiler, ancak matematik ve fizik bilimlerinde geniş ve derin uygulamalar buldular. 2 karmaşık sayı toplayabilir, çarpabilir veya bölebilir ve başka birçok şey yapabiliriz. Fatou ve Julia, karmaşık bir sayının tekrar tekrar tekrarlanan basit bir kurala göre değiştiği belirli dinamik sistemlerin özelliklerini inceledi: burada karmaşık matematiğe gerek yok (böylece ilk resmi unutabilirsiniz…). Bu sistemlerin zenginliğini ortaya çıkardılar, şimdi Julia'nın kümeleri olarak adlandırılan kümeleri tanımladılar ve kendilerine benzerliklerini, dolayısıyla fraktal yönlerini incelediler… ama bu kelime o zamanlar yoktu çünkü çok daha sonra, Benoît Mandelbrot tarafından icat edildi!

Kurucuların çalışmasından sonra bu alan unutulmaya yüz tuttu. Bilgisayarlar geldiğinde, Julia ve Fatou tarafından açılan alan da dahil olmak üzere yoğun bilgi işlem gerektiren birçok matematiksel fenomenin keşfedilmesine yardımcı oldular. Böylece, Benoît Mandelbrot 1980'lerde IBM bilgisayarlarını, holomorfik dinamiklerle ilgili belirli bir matematiksel kümeyi temsil etmek için kullanmaya karar verdiğinde., çok çekici ve çok ilgi çekici bir çizim elde etti (önceki bölümün ilk resmi).

Mandelbrot kümesi neyi temsil eder? Temel olarak, görüntünün her noktasıyla ilişkili temel bir dinamik sistem vardır. Noktanın koordinatları, ayarlanabilir bir parametre görevi görür. Farklı noktalar farklı Julia kümelerine karşılık gelir ve davranışlarına bağlı olarak noktayı belirli bir şekilde renklendirmeye karar verebiliriz. Mandelbrot kümesi, sistemin belirli bir özelliğe sahip olduğu parametreler kümesidir.

Mandelbrot ve Julia kümeleri nasıl hesaplanır?

Bu kümelerin nasıl hesaplanacağı konusunda biraz daha detaya girmemiz gerekiyor. Mandelbrot ve Julia kümeleri, bizim durumumuzda z^n+c olan basit bir formülün tekrarlanan yinelemesi ile hesaplanır. z, ekrandaki bir noktanın koordinatlarını temsil eden karmaşık bir sayıdır. bir tamsayı üssüdür, yani z^n, z'nin kendisiyle n kez çarpımına eşittir ve c bir sabittir.

Mandelbrot kümesi için, görüntüleme alanındaki tüm noktalar için z'yi 0'a başlatırız. c sabiti, dikkate alınan noktanın koordinatlarının değerine eşit alınır ve formül yinelenir.

Kural şudur: Bu formülün tekrar tekrar uygulanması birbirinden ayrılmazsa (yani, büyük sayılara yönelik hesaplamalara yol açmazsa), bir nokta kümenin bir parçasıdır. Formülün sonucu 2'yi aşarsa (karmaşık sayılardan bahsettiğimiz için modülde) yinelemenin farklı olacağı matematiksel olarak gösterilebilir. Bu nedenle, hızlı bir şekilde güzel renkler elde etmek için, sonucun modülü 2'yi aştığında ve renk o belirli yinelemenin sayısına karşılık geldiğinde yinelemeyi durdururuz. Yineleme sayısı çok büyük olursa (yani nokta Mandelbrot kümesinin parçasıysa), belirli bir eşikten sonra durur ve siyah rengi bu noktayla ilişkilendiririz.

Julia kümesi de benzer şekilde hesaplanır, ancak hesaplamalar 0'da değil, dikkate alınan noktanın koordinatlarının değerinde başlatılır ve c sabiti kullanıcı tarafından seçilir ve tüm görüntü için aynı kalır.

Bu kadar, umarım anlaşılır olmuştur… Bu açıklamalar, kullanım talimatlarının geri kalanını daha iyi anlamanıza yardımcı olur.

Adım 2: Neye İhtiyacınız Var?

Ne istiyorsun?
Ne istiyorsun?
Ne istiyorsun?
Ne istiyorsun?
Ne istiyorsun?
Ne istiyorsun?
Ne istiyorsun?
Ne istiyorsun?

Malzeme listesi:

  • 1 ESP32 kartı
  • Dokunmatik ekranlı ve ekran kalemli 1 TFT ekran
  • 1 adet breadboard ve teller

Bu kadar. Toplam maliyet 10 USD'nin altında.

Espressif'in ESP32'si, 240 MHz'de çalışan çift çekirdekli bir mikro denetleyicidir, bu da onu hızlı ve karmaşık tekrarlayan bilgi işlem için iyi bir aday yapar. Bu projede kullanmadığım WiFi ve Bluetooth kapasiteleri var.

Komut seti 32 bit boyutundadır. 16 ve 32 bit değişkenlerle hesaplama çok hızlıdır, bu da yakınlaştırma amacı için temel olan doğru hesaplamaları mümkün kılar. Bu uygulamada, 320 x 240 ekran için, bir görüntü kabaca 75.000 pikselden yapılır ve her biri 100 defaya kadar çalışabilen yinelemeli bir işlem kullanılarak hesaplanır. Bu, her biri bir üs olan 7, 500.000 üniter hesaplamaya yol açabilir, yani. birkaç çarpma…

Dolayısıyla burada hesaplama hızı esastır, ancak doğruluk esastır. Ne kadar yakınlaştırırsanız, setin görüntülenecek bölümünün boyutu o kadar küçük olur. Bu, görüntünün 320 x 240 pikselinin her birinin komşularına çok yakın bir sayıyı temsil ettiği anlamına gelir. Yakınlaştırma arttıkça bu yakınlık artar.

Ancak fraktal görüntüler, ölçekleme yoluyla değişmeden kalma özelliğine sahiptir. Böylece küçük ayrıntılar her yerde ve herhangi bir ölçeklendirme faktörü için görünür. Mandelbrot setinin ana şekli, yukarıdaki resimdeki ekranda görüldüğü gibi, çok daha küçük bir versiyonda başka bir yerde bulunabilir ve yeterince yakınlaştırırsanız görüntülenebilir (videoya bakın). Ancak, iki komşu piksel arasındaki koordinat farkı, doğruluk eksikliği nedeniyle ESP32'nin davranış farklılıklarını yakalamasını sağlamak için çok küçükse, fraktal etki gösterilemez…

İyi bir kesinlik elde etmek için kod, ESP32 tarafından 32 bit olarak kodlanan kayan noktaları kullanır. Bu, 6 veya 7'ye kadar yakınlaştırma düzeyi sağlar. Çift hassasiyetin (64 bit) kullanılması, daha yavaş hesaplamalar pahasına bu yakınlaştırma derinliğini arttırabilirdi, dolayısıyla 2 görüntü arasında daha uzun süreler olurdu.

Çifte kesinlik sağlamak için, koddaki tüm "float" olaylarını "double" olarak değiştirin ve kodu çalıştırın. Kısa bir süre önce daha büyük bir ekran için bir sürüm yaptım (HVGA 480 x 320 piksel): 16 bitlik kayan noktaların görüntüyü göstermesi 3 saniye sürer ve çiftler 10 ila 20 saniye (3 ila 6 kat daha uzun) sürer ancak 15'ten fazla yakınlaştırma seviyesini destekler. Bu bölümdeki üçüncü resim, Mandelbrot kümesinin en sağ kısmındaki yakınlaştırma düzeyi 14'ü göstermektedir.

Ekran nasıl bağlanır:

Bir SPI ekranı kullandım ve parametreler User_Setup.h dosyasında (TFT_eSPI kitaplık klasöründe) ayarlandı:

  • Sürücü: ekranınız için doğru sürücüyü kaldırın. Benimki #define RPI_ILI9486_DRIVER
  • Pin numaraları: dosyanın ESP32 bölümüne gidin ve

    • #define TFT_MISO 19
    • #define TFT_MOSI 23
    • #define TFT_SCLK 18
    • #define TFT_CS 15 // Chip seçim kontrol pini
    • #define TFT_DC 2 // Veri Komutu kontrol pini
    • #define TFT_RST 4 // Reset pini (RST pinine bağlanabilir)
    • #define TOUCH_CS 22 // Dokunmatik ekranın çip seçme pini (T_CS)
  • Yazı tipleri: onları değiştirmeye gerek yok
  • Diğer seçenekler: Aşağıdakileri seçtim

    • #define SPI_FREQUENCY 20000000
    • #define SPI_READ_FREQUENCY 20000000
    • #define SPI_TOUCH_FREQUENCY 2500000

Dosyanın diğer tüm satırları yorumlanır.

Ekranın dokunma kapasitesini kalibre edin

Bir ekran bölümünün veya bir düğmenin seçimi doğru değilse, hatta tamamen yanlışsa, TFT_eSPI kitaplığından dokunmatik kalibrasyon taslağını çalıştırın ve sağladığı diziyi kopyalayın / yapıştırın (ekran yönü için doğru değeri kullandığınızdan emin olun), manzara için 1 veya 3).

Adım 3: ESP32 Programı

ESP32 Programı
ESP32 Programı
ESP32 Programı
ESP32 Programı
ESP32 Programı
ESP32 Programı

Kod, 320 x 240 TFT dokunmatik ekranda görüntülenir ve TFT_eSPI kitaplığını kullanır. Birkaç üs değeri için Mandelbrot ve Julia kümelerini hesaplar ve fraktal yönü (yani her ölçek değişikliğinde aynı yapıların varlığı) görmek için ilgi alanlarını yakınlaştırmanıza olanak tanır.

Ekli kod, 480 x 320 ekran için bir sürümdür. Bu sürümde, ekranın boyutunu (piksel cinsinden genişlik ve yükseklik) değiştirebilirsiniz. TFT_eSPI kitaplığı, kitaplığın dizinine yerleştirilmesi gereken bir kurulum dosyasındaki (ekli) bağlantıları tanımlar.

Kod, çalıştırma talimatlarının görüntülenmesiyle başlar (resme ve videoya bakın)

Ekranın çoğu görüntüleri görüntülemek için ayrılmıştır, dokunmatik düğmeler ekranın sağ tarafında mevcuttur:

  • R: bir "sıfırlama" gerçekleştirir, i. e. görüntüyü maksimum ölçeğinde görüntüler,
  • U: "geri al" önceki adıma geri dönmenizi sağlar (yakınlaştırılan bölge ilgi çekici değilse, yakınlaştırmak için görüntünün başka bir bölümünü seçebilirsiniz),
  • M veya J: Mandelbrot'un setinden Julia'nın setine veya tam tersi şekilde geçiş yapmanızı sağlar.

Bazı tuşların etiketleri bağlama göre değişir: basıldığında yürütülecek işlevi gösterirler. Bu nedenle, şu anda Mandelbrot kümesini görüntülerseniz, M/J tuşu J'yi görüntüler, çünkü ona basarsanız Julia'nın kümesini görüntülersiniz (ve tersi).

Aynısı renk paleti seçimi için de geçerlidir. Yeşil paletle başlıyoruz. Anahtar, sonraki paleti (mavi olan) önerir. Paletler şunlardır: kırmızı, yeşil, mavi, gri, palet 1, palet 2 ve tekrar kırmızıya. Son ikisi, daha fazla kontrast sağlayan ve bazı detayları daha iyi görmeyi sağlayan çok renkli palet testleridir.

Sayı içeren anahtar, 2'den 7'ye (ve tekrar 2'ye) bir döngüde n üssünü seçmenize olanak tanır. Aynı ruhla, şu anda 2'deyseniz 3 görüntüler…

Son olarak, Julia kümesini görüntülerken, c sabitinin değerini seçmek gerekir: C tuşu, bir seçici sayesinde bunu yapmanızı sağlar (ikinci resme bakın). Bu sabitin değeri set ile birlikte görüntülenir.

Resmin üzerine tıklamak, seçilen noktanın çevresini yakınlaştırır. Dokunulan noktada küçük bir daire görüntülenir ve bir dikdörtgen setin yakınlaştırılan bölgesini vurgular.

3. resim, 320 x 240 piksel için hesaplama sürelerinin 0,8 ile 1,2 saniye arasında kaldığını, bu da yakınlaştırmayı ve görüntülemeyi kolaylaştırdığını göstermektedir. 480 x 320 piksel için 3 saniyeye ulaşır, ancak daha fazla ayrıntı sağlar.

Adım 4: Bazı Resimler Açıklandı…

Bazı Resimler Açıklandı…
Bazı Resimler Açıklandı…
Bazı Resimler Açıklandı…
Bazı Resimler Açıklandı…
Bazı Resimler Açıklandı…
Bazı Resimler Açıklandı…

En büyük resim, iyi bilinen Mandelbrot setidir. Bu görüntüde kullanılan karmaşık sayılar, apsiste -2.1 ile +0.7 arasında ve ordinatta -1.2 ile 1.2 arasında değişmektedir. Bu ilk görüntünün en sol tarafını yakınlaştırırsanız, sonunda, setin en sol ucunda bulunan orijinal setin daha küçük bir versiyonunu gösteren ikincisini elde etme şansınız vardır. Bu görüntülerin her ikisi için de üs ('n') 2'ye eşittir: bu, normalde Mandelbrot kümelerini görüntülemek için kullanılan değerdir.

Bu değeri 3 olarak değiştirirseniz (3 yazan tuşa tıklamanız yeterlidir), üçüncü resmi alırsınız. Bariz bir fark simetri faktörüdür: n=2 eksenel bir simetri verir (yani küme medyan yatay eksene göre simetriktir), ancak n=3 ile görüntü 120° döndürülerek (360°'nin üçte biri, dönüşle) değişmez hale gelir. simetri faktörü 3). Ve siyah şeklin kenarlarını yakınlaştırarak doğrulayabileceğiniz fraktal özelliklerini korur.

4. görüntü, apsiste 0.414 ve ordinatta 0.09'a eşit bir katsayı değeri seçildikten sonra elde edilen bir Julia kümesidir. Sağdaki yeşil tuştan da görülebileceği gibi kırmızı palet seçilir (yeşil, seçilecek bir sonraki renktir). Beşinci görüntü, sabitin (0.358) daha yüksek bir sanal kısmı olan Julia kümesinin aynı türünü gösterir.

Umarım bu programla oynamaktan keyif alırsınız ve güzel fraktal resimler gösterebilirsiniz. Mandelbrot ve Julia setlerini keşfetmekten ve paletlerle oynamaktan çekinmeyin: bunlar basit monokrom olanlarla görünmeyebilecek bazı detayları belirlemeye yardımcı olur. Hatta daha önce kimsenin görmediği bazı fraktal manzaraları keşfedebilirsiniz…

_

Daha fazla fraktal görüntü keşfetmek ister misiniz? Buraya tıklayın veya fraktal sanatı, hatta ascii fraktal'ı keşfedin. Belki bu talimat, böyle harika görüntüler oluşturmak istemenizi sağlayacaktır…

Matematik Yarışması ile Yapılan
Matematik Yarışması ile Yapılan
Matematik Yarışması ile Yapılan
Matematik Yarışması ile Yapılan

Matematikle Yapılan Yarışmada İkincilik Ödülü

Önerilen: