Mündəricat:

Mandelbrot və Julia ESP32: 4 Addımda Setlər (Şəkillərlə birlikdə)
Mandelbrot və Julia ESP32: 4 Addımda Setlər (Şəkillərlə birlikdə)

Video: Mandelbrot və Julia ESP32: 4 Addımda Setlər (Şəkillərlə birlikdə)

Video: Mandelbrot və Julia ESP32: 4 Addımda Setlər (Şəkillərlə birlikdə)
Video: Mandelbrot set, Julia set, both fractals or neither 2024, Iyul
Anonim
Image
Image
Mandelbrot və Julia ESP32 -də
Mandelbrot və Julia ESP32 -də
Mandelbrot və Julia ESP32 -də
Mandelbrot və Julia ESP32 -də

Əlbəttə ki, ən məşhuru Mandelbrot dəsti olan fraktalları bilirsiniz.

Burada ESP32 -də oynamaq üçün bir proqram var. ESP32 -ni seçdim, çünki hesablamaları standart bir Arduino -dan (daha yüksək saat tezliyi: 240 MHz) daha sürətli edəcəyini düşünürəm: hesablama və ekran üçün saniyədən bir saniyəyə qədər.

Kod 480 x 320 TFT sensor ekranda göstərilir. Bir neçə parametr dəyəri üçün Mandelbrot və Julia dəstlərini hesablayır və fraktal aspektini (yəni hər miqyas dəyişikliyində eyni strukturların mövcudluğunu) görmək üçün maraqlandığınız sahələri böyütməyə imkan verir. Hesablamaların dəqiqliyi məhdud olduğuna görə yaxınlaşdırma səviyyəsi məhduddur, lakin görüntü pozulmadan əvvəl yarım düzin yaxınlaşdırma edilə bilər.

Fraktalların sehrli dünyasını araşdırmağa hazır olun …

Addım 1: Mandelbrot və Julia Setləri nədir?

Mandelbrot və Julia Setləri nədir?
Mandelbrot və Julia Setləri nədir?
Mandelbrot və Julia Setləri nədir?
Mandelbrot və Julia Setləri nədir?
Mandelbrot və Julia Setləri nədir?
Mandelbrot və Julia Setləri nədir?

Mandelbrot dəsti, 19-cu əsrin sonlarında Peano, Sierpinski və Julia tərəfindən başladılan fraktal həndəsədə pionerlik işləri görmüş Fransız və Amerikalı riyaziyyatçı Benoit Mandelbrotun (1924-2010) adını daşıyır.

Fraktal obyektlər nədir?

Dəniz sahilinin xətti, buludların forması, ağac kimi xaotik görünə biləcək təbiətdəki düzensizliklər, dəyişən miqyasda çox mürəkkəb bir həndəsənin ifadəsidir. Bu kontekstdə, fraksiya ölçüsü anlayışı adi Evklid ölçüsünü (həmişə tamsayı olan) əvəz edir!

Fraktal bir obyekt elədir ki, onun hər hansı bir hissəsi bütövlə eynidir (buna özünə bənzərlik deyilir): quruluşu miqyas dəyişikliyinə görə dəyişməzdir.

"Fraktal" termini, Benoît Mandelbrot tərəfindən 1974 -cü ildə Latın kökü fractusdan yaradılmış "qırılmış", "düzensiz" mənasını verən bir neologizmdir. Həm isim, həm də sifətdir. Sahil xətlərinin konturu və ya Romanesko kələminin görünüşü kimi bir çox təbiət hadisəsi (şəkilə bax) təxmini fraktal formalara malikdir.

Benoît Mandelbrot bir qədər qeyri -adi bir karyeraya sahib idi: Lille Universitetində (Fransa) dərs dedikdən sonra, IBM -də vəzifə aldı və tez bir zamanda IBM Təqaüdçüsü oldu, bu da ona elmi tədqiqatları üçün böyük bir azadlıq verdi. 1980 -ci illərin əvvəllərində, IBM -dən ayrıldıqdan sonra Harvardda professor oldu, ancaq Yelədə daimi məskunlaşdı.

1960 -cı və 1970 -ci illərin əvvəllərindəki işləri onu "Fraktal Cisimlər" adlı məşhur bir məqalə dərc etdirməyə vadar etdi və burada riyazi ictimaiyyətin böyük bir hissəsi tərəfindən sadəcə maraq olaraq qəbul edilən bu obyektlərin təbiətin hər yerində tapıldığını göstərdi. Fizika, hidrologiya, maliyyə, meteorologiya, coğrafiya, geologiya, metallurgiya kimi müxtəlif sahələrdə bir çox nümunə verdi.

Mandelbrot dəsti nədir?

Başlamaq üçün bir proqram tərəfindən yaradılan gözəl bir rəsm olduğunu söyləyək. Və bu proqram olduqca sadədir. Bunları yaratmaq üçün bir çox kompüterdə yaradılan təsvirlər və bir çox kompüter proqramı var. Bəs bunun bir xüsusiyyəti nədir? Birincisi, Mandelbrot dəsti planın alt hissəsidir, xal toplusudur. Sahələri, həm də hamar əyriləri, filamentləri, çoxlu budaqların çıxdığı nöqtələri və digər şeyləri ehtiva edir. İkincisi: həqiqətən maraqlıdır və çox maraqlı bir tarixə malikdir.

20-ci əsrin əvvəllərində Fransız riyaziyyatçılar Pierre Fatou və Gaston Julia, holomorfik dinamika adlanan bir riyaziyyat alt sahəsini inkişaf etdirdilər. Mövcud olan ən sadə düsturlardan istifadə edərək rəqəmlər üzərində hərəkət edən xüsusi funksiyalarla maraqlanırdılar. Sözügedən ədədlər həqiqi və xəyali hissələr adlanan iki koordinatla (bir təyyarənin nöqtələri kimi) təmsil olunan kəmiyyətlərdir. Onlar 16. əsrdə polinomların köklərini və tənliklərin həllini tapmaq üçün riyaziyyatçılar tərəfindən icad edilmişdir, lakin riyaziyyat və fizika elmlərində geniş və dərin tətbiqlər tapmışlar. 2 kompleks ədəd əlavə edə, onları çoxalda və ya bölə bilərik və bir çox başqa şeylər edə bilərik. (beləliklə, ilk görüntünü unuda bilərsiniz …). Bu sistemlərin zənginliyini ortaya qoydular, indi Julianın dəstləri adlanan dəstləri təyin etdilər və özlərinə bənzərliklərini, buna görə də fraktal cəhətlərini araşdırdılar … ancaq söz o vaxt mövcud deyildi, çünki bu, yalnız çox sonra … Benoît Mandelbrot tərəfindən icad edilmişdir!

Təsisçilərin işindən sonra bu sahə unuduldu. Kompüterlər gəldikdə, Julia və Fatou tərəfindən açılan sahə də daxil olmaqla intensiv hesablama tələb edən bir çox riyazi hadisəni araşdırmağa kömək etdilər. Buna görə də Benoît Mandelbrot, 1980 -ci illərdə holomorfik dinamikaya aid müəyyən bir riyazi dəsti təmsil etmək üçün IBM kompüterlərindən istifadə etməyə qərar verdikdə., çox cəlbedici və çox maraqlı bir rəsm əldə etdi (əvvəlki hissənin ilk şəkli).

Mandelbrot dəsti nəyi təmsil edir? Əsasən, görüntünün hər nöqtəsi ilə əlaqəli əsas bir dinamik sistem var. Nöqtənin koordinatları tənzimlənən parametr kimi çıxış edir. Fərqli nöqtələr fərqli Julia dəstlərinə uyğundur və davranışlarından asılı olaraq nöqtəni müəyyən bir şəkildə rəngləməyə qərar verə bilərik. Mandelbrot dəsti, sistemin müəyyən bir xüsusiyyətə sahib olduğu parametrlər toplusudur.

Mandelbrot və Julia dəstlərini necə hesablamaq olar?

Bu dəstləri necə hesablayacağımıza dair bir az daha ətraflı məlumat verməliyik. Mandelbrot və Julia dəstləri sadə bir düsturun təkrarlanması ilə hesablanır, bizim vəziyyətimizdə z^n+c. z, ekrandakı bir nöqtənin koordinatlarını ifadə edən kompleks bir rəqəmdir. bir tam ədəddir, buna görə z^n özü ilə n dəfə vurulur və c sabitdir.

Mandelbrot dəsti üçün, görüntü sahəsindəki bütün nöqtələr üçün z -ni 0 -a qoyuruq. Sabit c, nəzərdən keçirilmiş nöqtənin koordinatlarının dəyərinə bərabər alınır və düstur təkrarlanır.

Budur qayda: bu düsturun təkrar tətbiqi bir -birindən ayrılmazsa (yəni çoxlu sayda hesablamalara səbəb olmazsa) bir nöqtə dəstin bir hissəsidir. Riyazi olaraq göstərilə bilər ki, düsturun nəticəsi 2 -dən çox olarsa (kompleks ədədlərdən bəhs etdiyimiz üçün modulda) iterasiya fərqlənəcək. Gözəl rəngləri tez əldə etmək üçün, nəticənin modulu 2 -dən çox olduqda və rəng həmin təkrarlamanın sayına uyğun gəldikdə, iterasiyanı dayandırırıq. Təkrarların sayı çox olarsa (əgər nöqtə Mandelbrot dəstinin bir hissəsidirsə) müəyyən bir eşikdən sonra dayandırırıq və qara rəngi bu nöqtəyə bağlayırıq.

Julia dəsti oxşar şəkildə hesablanır, lakin hesablamalar 0 -da başlanmır, lakin nəzərdən keçirilən nöqtənin koordinatlarının dəyərindədir və c sabit istifadəçi tərəfindən seçilir və bütün görüntü üçün eyni qalır.

Budur, ümid edirəm ki, aydındır … Bu izahatlar istifadə üçün təlimatların qalan hissəsini daha yaxşı anlamağa kömək edir.

Addım 2: Nə lazımdır?

Nə lazımdır?
Nə lazımdır?
Nə lazımdır?
Nə lazımdır?
Nə lazımdır?
Nə lazımdır?
Nə lazımdır?
Nə lazımdır?

Maddi sənəd:

  • 1 ədəd ESP32 lövhəsi
  • Toxunma ekranı və qələm ilə 1 TFT ekran
  • 1 ədəd taxta və tel

Bu belədir. Ümumi dəyəri 10 ABŞ dollarından aşağıdır.

Espressif -in ESP32, 240 MHz tezliyində işləyən iki nüvəli mikro nəzarətçidir və bu, onu sürətli və mürəkkəb təkrarlanan hesablama üçün yaxşı bir namizəd halına gətirir. Bu layihədə istifadə etmədiyim WiFi və Bluetooth imkanlarına malikdir.

Təlimat dəsti 32 bit ölçüdədir. 16 və 32 bitlik dəyişənlərlə hesablama çox sürətlidir ki, bu da yaxınlaşdırma məqsədi üçün əsas olan dəqiq hesablamalara imkan verir. Bu tətbiqdə, 320 x 240 ekran üçün, hər biri 100 dəfəyə qədər işləyə bilən təkrarlanan bir proses istifadə edərək hesablanan təxminən 75.000 piksellik bir şəkil hazırlanır. Bu, hər biri bir eksponentasiya, yəni bir neçə vurma olan 7, 500, 000 vahid hesablamalara səbəb ola bilər …

Beləliklə, hesablama sürəti burada vacibdir, lakin dəqiqlik əsasdır. Nə qədər çox yaxınlaşdırsanız, dəstin göstəriləcək hissəsinin ölçüsü o qədər kiçik olar. Bu o deməkdir ki, 320 x 240 piksellik təsvirin hər biri qonşularına çox yaxın olan bir rəqəmi təmsil edir. Zoom artdıqca bu yaxınlıq artır.

Ancaq fraktal şəkillər ölçüyə görə dəyişməz qaldıqları bir xüsusiyyətə malikdir. Kiçik detallar hər yerdə və hər hansı bir miqyas faktoru üçün görünür. Mandelbrot dəstinin əsas forması, yuxarıdakı şəkildəki ekranda göründüyü kimi, daha kiçik bir versiyada başqa bir yerdə tapıla bilər və kifayət qədər yaxınlaşdırsanız göstərilir (videoya baxın). Ancaq iki qonşu piksel arasındakı koordinat fərqi, ESP32 -nin davranış fərqlərini tutmasını təmin etmək üçün çox kiçikdirsə, dəqiqlik olmadığı üçün fraktal effekt göstərilə bilməz …

Yaxşı bir dəqiqlik əldə etmək üçün kod, ESP32 tərəfindən 32 bitlə kodlanmış floatlardan istifadə edir. Bu, 6 və ya 7 zum səviyyəsinə qədər imkan verir. İkiqat həssaslıq (64 bit) istifadə etməklə, bu hesablama dərinliyi daha yavaş hesablamalara görə artmış olardı, beləliklə də 2 şəkil arasında daha uzun müddət olardı.

İkiqat dəqiqlik əldə etmək üçün koddakı "float" ın bütün təzahürlərini "ikiqat" olaraq dəyişdirin və kodu işlədin. Bu yaxınlarda daha böyük bir ekran üçün bir versiya hazırladım (HVGA 480 x 320 piksel): 16 bit üzmək görüntünü göstərmək üçün 3 saniyə çəkir və ikiqat 10 ilə 20 saniyə (3 ilə 6 qat daha uzun) çəkir, lakin 15 -dən çox zoom səviyyəsini dəstəkləyir. Bu fəsildəki üçüncü görüntü Mandelbrot dəstinin ən sağ hissəsindəki zoom səviyyəsini 14 göstərir.

Ekranı necə bağlamaq olar:

Bir SPI ekranı istifadə etdim və parametrlər User_Setup.h faylında (TFT_eSPI kitabxana qovluğunda) təyin olunur:

  • Sürücü: ekranınız üçün düzgün sürücünü qeyd edin. Mənimki #define RPI_ILI9486_DRIVER idi
  • Pin nömrələri: faylın ESP32 hissəsinə gedin və seçin

    • #define TFT_MISO 19
    • #define TFT_MOSI 23
    • #define TFT_SCLK 18
    • #define TFT_CS 15 // Çip seçmə idarəetmə pinini
    • #define TFT_DC 2 // Data Command nəzarət pin
    • #define TFT_RST 4 // Pin sıfırla (RST pininə qoşula bilər)
    • #deuine TOUCH_CS 22 // Sensorlu ekranın çipini seçin (T_CS)
  • Şriftlər: onları dəyişməyə ehtiyac yoxdur
  • Digər seçimlər: Aşağıdakıları seçdim

    • #SPI_FREQUENCY 20000000 təyin edin
    • #SPI_READ_FREQUENCY 20000000 təyin edin
    • #SPI_TOUCH_FREQUENCY 2500000 təyin edin

Faylın bütün digər sətirləri şərh olunur.

Ekranın toxunma qabiliyyətini kalibr edin

Bir ekran hissəsinin və ya düymənin seçimi dəqiq deyilsə və ya hətta tamamilə səhvdirsə, TFT_eSPI kitabxanasından toxunma kalibrləmə eskizini işlədin və təqdim etdiyi koda kopyalayın / yapışdırın (ekran istiqaməti üçün doğru dəyəri istifadə etdiyinizə əmin olun., Mənzərə üçün 1 və ya 3).

Addım 3: ESP32 Proqramı

ESP32 proqramı
ESP32 proqramı
ESP32 proqramı
ESP32 proqramı
ESP32 proqramı
ESP32 proqramı

Kod 320 x 240 TFT sensor ekranda göstərilir və TFT_eSPI kitabxanasından istifadə edir. Mandelbrot və Julia dəstlərini bir neçə eksponent dəyərlər üçün hesablayır və fraktal aspektini (yəni hər miqyas dəyişikliyində eyni quruluşların mövcudluğunu) görmək üçün maraq dairələrini böyütməyə imkan verir.

Əlavə edilmiş kod 480 x 320 ekran üçün bir versiyadır. Bu versiyada, ekranın ölçüsünü (piksel genişliyi və hündürlüyü) dəyişə bilərsiniz. TFT_eSPI kitabxanası, kitabxananın qovluğuna daxil edilməli olan bir quraşdırma faylında (əlavə olunmuş) əlaqələri təyin edir.

Kod əməliyyat təlimatlarını göstərməklə başlayır (şəkil və videoya baxın)

Ekranın çox hissəsi şəkilləri göstərmək üçün ayrılmışdır, ekranın sağ tərəfində toxunma düymələri mövcuddur:

  • R: "sıfırlama" həyata keçirir, yəni. e. görüntünü maksimum miqyasda göstərir,
  • U: "geri al" əvvəlki addıma qayıtmağa imkan verir (yaxınlaşdırılmış bölgə maraqlı deyilsə, böyütmək üçün görüntünün başqa bir hissəsini seçə bilərsiniz),
  • M və ya J: Mandelbrot dəstindən Julianın dəstinə və əksinə keçməyə imkan verir.

Bəzi düymələrin etiketləri kontekstə görə dəyişir: basıldıqda yerinə yetiriləcək funksiyanı göstərir. Beləliklə, hazırda Mandelbrot dəstini göstərirsinizsə, M/J düyməsini J göstərir, çünki basarsanız Julianın dəstini göstərəcəksiniz (və əksinə).

Eyni şey rəng palitrası seçiminə də aiddir. Yaşıl palitradan başlayaq. Açar növbəti palitranı təklif edir (mavi). Paletlər bunlardır: qırmızı, yaşıl, mavi, boz, palitrası 1, palitrası 2 və geri qırmızı. Son ikisi, bəzi detalları daha yaxşı görməyə imkan verən daha çox kontrast təmin edən çox rəngli palet testləridir.

Nömrəsi olan açar, 2 -dən 7 -ə qədər döngədə (və 2 -yə qayıdaraq) n göstəricisini seçməyə imkan verir. Eyni ruhda, hazırda 2 yaşındasınızsa 3 göstərir …

Nəhayət, Julia dəstini göstərərkən c sabitinin dəyərini seçmək lazımdır: C düyməsi bir seçici sayəsində bunu etməyə imkan verir (ikinci şəkilə bax). Bu sabitin dəyəri set ilə birlikdə göstərilir.

Təsvirə tıklayaraq seçilmiş nöqtənin ətrafına yaxınlaşır. Toxunan nöqtədə kiçik bir dairə göstərilir və düzbucaqlı dəstin böyüdülmüş zonasını vurğulayır.

3 -cü şəkil, hesablama müddətlərinin 320 x 240 piksel üçün 0,8 ilə 1,2 saniyə arasında qaldığını göstərir ki, bu da böyütməyi və göstərməyi rahatlaşdırır. 480 x 320 piksel üçün 3 saniyəyə çatır, lakin daha ətraflı məlumat verir.

Addım 4: Bəzi Şəkillər Açıqlandı…

Bəzi Şəkillər Açıqlandı…
Bəzi Şəkillər Açıqlandı…
Bəzi Şəkillər Açıqlandı…
Bəzi Şəkillər Açıqlandı…
Bəzi Şəkillər Açıqlandı…
Bəzi Şəkillər Açıqlandı…

Ən böyük şəkil məşhur Mandelbrot dəstidir. Bu görüntüdə istifadə olunan kompleks ədədlər absisdə -2.1 ilə +0.7 arasında, ordinatda -1.2 ilə 1.2 arasında dəyişir. Bu ilk görüntünün ən sol hissəsini böyütsəniz, çox güman ki, ikincisini əldə edəcəksiniz ki, bu da dəstin ən sol tərəfində olan orijinal dəstin daha kiçik bir versiyasını göstərir. Bu görüntülərin hər ikisi üçün ('n') göstəricisi 2 -ə bərabərdir: normal olaraq Mandelbrot dəstlərini göstərmək üçün istifadə olunan dəyərdir.

Bu dəyəri 3 olaraq dəyişdirsəniz (3 deyən düyməni basın), üçüncü şəkli əldə edəcəksiniz. Aşkar bir fərq simmetriya faktorudur: n = 2 eksenel simmetriya verir (yəni çoxluq üfüqi oxa qarşı simmetrikdir), lakin n = 3 ilə görüntü 120 ° fırlanaraq dəyişməz olur (360 ° -in üçdə biri, fırlanma) simmetriya faktoru 3). Qara formanın kənarlarını yaxınlaşdıraraq yoxlaya biləcəyiniz fraktal xüsusiyyətlərini saxlayır.

4 -cü görüntü, absisdə 0,414 və ordinatda 0,09 -a bərabər bir əmsal dəyəri seçdikdən sonra əldə edilən Julia dəstidir. Qırmızı palitra, sağdakı yaşıl düymədən göründüyü kimi seçilir (yaşıl, seçiləcək növbəti rəngdir). Beşinci görüntü, sabitin daha yüksək xəyali bir hissəsi olan Julia dəstini göstərir (0.358).

Ümid edirəm ki, bu proqramla oynamaqdan zövq alacaqsınız və gözəl fraktal şəkillər göstərə biləcəksiniz. Mandelbrot və Julia dəstlərini araşdırmaqdan və palitralarla oynamaqdan çəkinməyin: onlar sadə monoxromlarla görünməyən bəzi detalları müəyyən etməyə kömək edir. Sizdən əvvəl heç kimin görmədiyi bəzi fraktal mənzərələri belə kəşf edə bilərsiniz …

_

Daha fraktal şəkillər kəşf etmək istəyirsiniz? Sadəcə bura vurun və ya fraktal sənəti və ya hətta ascii fraktalı araşdırın. Bəlkə də bu təlimat sizi belə möhtəşəm görüntülər yaratmaq istəyinizə səbəb olacaq …

Riyaziyyat Yarışması ilə hazırlanmışdır
Riyaziyyat Yarışması ilə hazırlanmışdır
Riyaziyyat Yarışması ilə hazırlanmışdır
Riyaziyyat Yarışması ilə hazırlanmışdır

Riyaziyyatla Yarışmada İkinci Mükafat

Tövsiyə: