Talaan ng mga Nilalaman:

Si Mandelbrot at Julia ay Nagtakda sa ESP32: 4 na Hakbang (na may Mga Larawan)
Si Mandelbrot at Julia ay Nagtakda sa ESP32: 4 na Hakbang (na may Mga Larawan)

Video: Si Mandelbrot at Julia ay Nagtakda sa ESP32: 4 na Hakbang (na may Mga Larawan)

Video: Si Mandelbrot at Julia ay Nagtakda sa ESP32: 4 na Hakbang (na may Mga Larawan)
Video: Бенуа Мандельброт: Фракталы и искусство изломанности 2024, Hulyo
Anonim
Image
Image
Si Mandelbrot at Julia ay Nagtakda sa ESP32
Si Mandelbrot at Julia ay Nagtakda sa ESP32
Si Mandelbrot at Julia ay Nagtakda sa ESP32
Si Mandelbrot at Julia ay Nagtakda sa ESP32

Tiyak na alam mo ang mga bali, ang pinakatanyag dito ay ang hanay ng Mandelbrot.

Narito ang isang programa upang makapaglaro sa ESP32. Pinili ko ang ESP32 dahil sa palagay ko mas mabilis itong gagawa ng mga kalkulasyon kaysa sa isang pamantayan ng Arduino (mas mataas na dalas ng orasan: 240 MHz): mga isang segundo hanggang isang segundo at kalahati para sa pagkalkula at pagpapakita.

Nagpapakita ang code sa isang 480 x 320 TFT touch screen. Kinakalkula nito ang mga set ng Mandelbrot at Julia para sa maraming mga halaga ng parameter, at pinapayagan kang mag-zoom in sa mga lugar na interesado upang makita ang aspal ng bali (ibig sabihin, ang pagkakaroon ng parehong mga istraktura sa bawat pagbabago ng scale). Ang antas ng pag-zoom ay limitado dahil sa limitadong kawastuhan ng mga kalkulasyon, ngunit ang isang kalahating dosenang mga pag-zoom ay maaaring gawin bago mapahina ang imahe.

Maghanda upang galugarin ang magic mundo ng mga fraktal …

Hakbang 1: Ano ang Mga Set ng Mandelbrot at Julia?

Ano ang Mga Itinakda ng Mandelbrot at Julia?
Ano ang Mga Itinakda ng Mandelbrot at Julia?
Ano ang Mga Itinakda ng Mandelbrot at Julia?
Ano ang Mga Itinakda ng Mandelbrot at Julia?
Ano ang Mga Itinakda ng Mandelbrot at Julia?
Ano ang Mga Itinakda ng Mandelbrot at Julia?

Ang hanay ng Mandelbrot ay ipinangalan kay Benoit Mandelbrot (1924-2010), isang Pranses at Amerikanong dalub-agbilang na gumawa ng pionnering na gawain sa fraktal na geometry, na pinasimulan sa pagtatapos ng ika-19 na siglo ng, bukod sa iba pa, Peano, Sierpinski at Julia.

Ano ang mga bali na bagay?

Ang mga iregularidad ng kalikasan, na maaaring mukhang magulo, tulad ng linya ng baybayin ng dagat, ang hugis ng mga ulap, isang puno, sa katunayan ay ang pagpapahayag ng isang napaka-kumplikadong geometry sa pagbabago ng sukat. Sa kontekstong ito, ang paniwala ng dimensional na praksyonal ay pumapalit sa karaniwang dimensyon ng Euclidean (na palaging isang integer)!

Ang isang bagay na bali ay tulad ng anumang bahagi nito ay magkapareho sa kabuuan (ito ay tinatawag na pagkakatulad sa sarili): ang istraktura nito ay walang pagbabago sa pagbabago ng laki.

Ang katagang "fraktal" ay isang neologism na nilikha ni Benoît Mandelbrot noong 1974 mula sa Latin root fragus, na nangangahulugang "broken", "irregular". Parehong isang pangngalan at pang-uri. Maraming mga likas na phenomena - tulad ng balangkas ng mga baybayin o ang hitsura ng Romanesco cabbage (tingnan ang larawan) - ay may tinatayang mga hugis ng bali.

Si Benoît Mandelbrot's ay may isang medyo hindi tipiko na karera: pagkatapos magturo sa University of Lille (France), kumuha siya ng posisyon sa IBM kung saan siya ay mabilis na naging isang IBM Fellow, na nagbigay sa kanya ng isang malaking kalayaan para sa kanyang siyentipikong pag-aaral. Noong unang bahagi ng 1980s, pagkatapos niyang umalis sa IBM, naging propesor siya sa Harvard, ngunit permanenteng nanirahan sa Yale.

Ang kanyang gawa noong 1960s at maagang bahagi ng 1970 ay humantong sa kanya upang mag-publish ng isang sikat na artikulong may pamagat na "Mga Fractal Objects" kung saan ipinakita niya na ang mga bagay na ito, na isinasaalang-alang ng isang malaking bahagi ng pamayanan ng matematika bilang mga simpleng pag-usisa lamang, ay matatagpuan kahit saan sa likas na katangian. Nagbigay siya ng maraming mga halimbawa sa iba't ibang mga larangan tulad ng pisika, hydrology, pananalapi, meteorolohiya, heograpiya, heograpiya, metalurhiya….

Ano ang hanay ng Mandelbrot?

Upang magsimula, sabihin natin na ito ay isang magandang pagguhit na nabuo ng isang programa. At ang program na ito ay medyo simple. Mayroong maraming mga guhit na binuo ng computer at maraming software ng computer upang mabuo ang mga ito. Kaya't ano ang espesyal sa isang ito? Una, ang hanay ng Mandelbrot ay isang subset ng plano, isang koleksyon ng mga puntos. Naglalaman ito ng mga lugar ngunit din makinis na mga kurba, filament, mga punto kung saan nagmula ang maraming mga sanga, at iba pang mga bagay. Pangalawa: talagang nakakaakit at mayroong isang napaka-kagiliw-giliw na kasaysayan.

Sa simula ng ika-20 siglo, ang mga Pranses na matematiko na sina Pierre Fatou at Gaston Julia ay bumuo ng isang sub-domain ng matematika na tinatawag na holomorphic dynamics. Interesado sila sa mga partikular na pag-andar, kumikilos sa mga numero, gamit ang ilan sa pinakasimpleng mga formula na magagamit. Ang mga bilang na pinag-uusapan ay kumplikadong mga numero, dami na kinakatawan ng dalawang mga coordinate (tulad ng mga punto ng isang eroplano) na tinatawag na tunay at haka-haka na mga bahagi. Ang mga ito ay naimbento noong ika-16 na siglo ng mga matematiko upang matulungan silang makahanap ng mga ugat ng mga polynomial at ang solusyon ng mga equation ngunit nakakita ng malawak at malalim na aplikasyon sa matematika at pisikal na agham. Maaari kaming magdagdag ng 2 kumplikadong mga numero, i-multiply o hatiin ang mga ito, at gumawa ng maraming iba pang mga bagay. Pinag-aralan nina Fatou at Julia ang mga pag-aari ng ilang mga dinamikong system kung saan ang isang kumplikadong numero ay nag-iiba ayon sa isang simpleng panuntunan na paulit-ulit na paulit-ulit: hindi na kailangan ng mga kumplikadong matematika dito (kaya, maaari mong kalimutan ang unang imahe …). Inihayag nila ang kayamanan ng mga sistemang ito, tinukoy ang mga hanay na ngayon ay tinawag na mga set ni Julia, at pinag-aralan ang kanilang pagkakatulad sa sarili, samakatuwid fraktal na aspeto … ngunit ang salita ay hindi umiiral sa oras na iyon dahil naimbento lamang ito kalaunan, ni… Benoît Mandelbrot!

Matapos ang gawain ng mga nagtatag, ang domain na ito ay nahulog sa limot. Nang dumating ang mga computer, tumulong sila upang tuklasin ang maraming mga phenomena sa matematika na nangangailangan ng masinsinang computing, kasama ang domain na binuksan nina Julia at Fatou. Sa gayon, nang magpasya si Benoît Mandelbrot na gamitin ang mga computer ng IBM noong 1980 upang kumatawan sa isang tiyak na hanay ng matematika na nauugnay sa holomorphic dynamics, nakakuha siya ng isang napaka-kaakit-akit at napaka-nakakaintriga na pagguhit (unang larawan ng nakaraang seksyon).

Ano ang kinakatawan ng hanay ng Mandelbrot? Talaga, mayroong isang napapailalim na sistema ng pabagu-bago na nauugnay sa bawat punto ng imahe. Ang mga coordinate ng point ay kumikilos bilang isang adjustable parameter. Ang magkakaibang mga puntos ay tumutugma sa iba't ibang mga hanay ng Julia at depende sa kanilang pag-uugali, maaari kaming magpasya na kulayan ang punto sa isang partikular na paraan. Ang hanay ng Mandelbrot ay ang hanay ng mga parameter kung saan ang system ay may isang tiyak na pag-aari.

Paano makalkula ang mga set ng Mandelbrot at Julia?

Kailangan naming pumunta sa isang maliit na karagdagang detalye sa kung paano makalkula ang mga hanay na ito. Ang mga set ng Mandelbrot at Julia ay kinakalkula ng paulit-ulit na pag-ulit ng isang simpleng pormula, sa aming kaso z ^ n + c. Ang z ay isang kumplikadong numero na kumakatawan sa mga coordinate ng isang punto sa display. ay isang integer exponent, kaya ang z ^ n ay katumbas ng z na pinarami ng sarili nitong n beses, at ang c ay isang pare-pareho.

Para sa itinakdang Mandelbrot, para sa lahat ng mga puntos sa lugar ng pagpapakita, pinasimulan namin ang z hanggang 0. Ang pare-pareho na c ay kinukuha katumbas ng halaga ng mga coordinate ng isinasaalang-alang na punto at ang formula ay inuulit.

Narito ang panuntunan: ang isang punto ay bahagi ng hanay kung ang paulit-ulit na aplikasyon ng formula na ito ay hindi magkakaiba (ibig sabihin ay hindi hahantong sa mga kalkulasyon patungo sa malalaking numero). Maaari itong maipakita sa matematika na kung ang resulta ng formula ay lumampas sa 2 (sa modulus dahil pinag-uusapan natin ang mga kumplikadong numero) ang pag-ulit ay magkakaiba. Kaya upang mabilis na makakuha ng magagandang kulay, ihihinto namin ang pag-ulit kapag ang modulus ng resulta ay lumampas sa 2 at ang kulay ay tumutugma sa bilang ng partikular na pag-ulit. Kung ang bilang ng mga pag-ulit ay naging masyadong malaki (kaya kung ang punto ay bahagi ng hanay ng Mandelbrot) titigil kami pagkatapos ng isang naibigay na threshold at iugnay ang itim na kulay sa puntong ito.

Ang set ng Julia ay kinakalkula sa isang katulad na paraan ngunit ang mga kalkulasyon ay hindi naisauna sa 0 ngunit sa halaga ng mga coordinate ng isinasaalang-alang na punto at ang pare-pareho c ay pinili ng gumagamit at mananatiling pareho para sa buong imahe.

Iyon lang, inaasahan kong malinaw ito … Ang mga paliwanag na ito ay makakatulong upang mas maunawaan ang natitirang mga tagubilin para magamit.

Hakbang 2: Ano ang Kailangan Mo?

Ano'ng kailangan mo?
Ano'ng kailangan mo?
Ano'ng kailangan mo?
Ano'ng kailangan mo?
Ano'ng kailangan mo?
Ano'ng kailangan mo?
Ano'ng kailangan mo?
Ano'ng kailangan mo?

Bill ng materyal:

  • 1 board ng ESP32
  • Ipinapakita ang 1 TFT na may touchscreen at stylus
  • 1 tinapay at wires

Ayan yun. Kabuuang gastos sa ilalim ng 10 USD.

Ang ESP32 ng Espressif ay isang dalawahang pangunahing microcontroler na tumatakbo sa 240 MHz, na ginagawang isang mahusay na kandidato para sa mabilis at kumplikadong paulit-ulit na computing. Mayroon itong mga kapasidad ng WiFi at Bluetooth na hindi ko ginagamit sa proyektong ito.

Ang hanay ng pagtuturo ay 32 piraso ng laki. Ang computing na may 16 at 32 bit variable ay napakabilis na nagbibigay-daan sa mga tumpak na pagkalkula, na kung saan ay pangunahing layunin sa pag-zoom. Sa application na ito, para sa isang 320 x 240 display, ang isang imahe ay halos gawa sa 75, 000 mga pixel, na ang bawat isa ay kinakalkula gamit ang isang umuulit na proseso na maaaring tumakbo ng hanggang sa 100 beses. Maaari itong humantong sa 7, 500, 000 na mga pagkakaisa na nagkakaisa, na ang bawat isa ay isang exponentiation, ibig sabihin maraming mga multiplikasyon…

Kaya't ang bilis ng pagkalkula ay mahalaga dito, ngunit ang kawastuhan ay pangunahing. Kung mas marami kang mag-zoom, mas maliit ang sukat ng bahagi ng itinakdang ipapakita. Nangangahulugan ito na ang bawat isa sa 320 x 240 na mga pixel ng imahe ay kumakatawan sa isang numero na napakalapit sa mga kapit-bahay nito. Habang tumataas ang pag-zoom, tataas ang kalapitan na ito.

Ngunit ang mga imaheng fraktal ay may ganitong pag-aari na mananatili silang hindi nababago ng pag-scale. Lumilitaw ang mga maliliit na detalye saanman at para sa anumang kadahilanan sa pag-scale. Ang pangunahing hugis ng hanay ng Mandelbrot, tulad ng nakikita sa display sa larawan sa itaas, ay matatagpuan sa iba pang lugar sa isang mas maliit na bersyon, at maipakita kung mag-zoom ka ng sapat (tingnan ang video). Ngunit kung ang pagkakaiba ng coordinate sa pagitan ng dalawang mga pixel ng kapitbahay ay masyadong maliit upang paganahin ang ESP32 na mahuli ang kanilang pagkakaiba sa pag-uugali, dahil sa kawalan ng kawastuhan, hindi maipakita ang fractal effect…

Upang makakuha ng mahusay na katumpakan, ang code ay gumagamit ng floats, na naka-code sa 32 bits ng ESP32. Nagbibigay-daan ito hanggang sa 6 o 7 mga antas ng pag-zoom. Ang paggamit ng dobleng katumpakan (64 bits) ay nadagdagan ang lalim ng pag-zoom na ito, sa halagang mas mabagal na pagkalkula, kaya't mas mahaba ang oras sa pagitan ng 2 mga imahe.

Upang gawin itong dobleng katumpakan, baguhin lamang ang lahat ng mga paglitaw ng "float" sa "doble" sa code at patakbuhin ang code. Kamakailan lamang ay gumawa ako ng isang bersyon para sa isang mas malaking display (HVGA 480 x 320 pixel): 16 bits floats tumatagal ng 3 segundo upang maipakita ang imahe, at ang mga doble ay tumatagal sa pagitan ng 10 at 20 segundo (3 hanggang 6 beses na mas mahaba) ngunit suportahan ang higit sa 15 mga antas ng pag-zoom. Ang pangatlong imahe sa kabanatang ito ay nagpapakita ng antas ng pag-zoom 14 sa kanang bahagi sa hanay ng Mandelbrot.

Paano ikonekta ang display:

Gumamit ako ng isang SPI display, at ang mga parameter ay nakatakda sa User_Setup.h file (sa folder ng TFT_eSPI library):

  • Driver: huwag paganahin ang tamang driver para sa iyong display. Ang sa akin ay # tukuyin ang RPI_ILI9486_DRIVER
  • Mga numero ng pin: pumunta sa seksyon ng ESP32 ng file at pumili

    • # tukuyin ang TFT_MISO 19
    • # tukuyin ang TFT_MOSI 23
    • # tukuyin ang TFT_SCLK 18
    • #define TFT_CS 15 // Chip select control pin
    • # tukuyin ang TFT_DC 2 // Pin ang kontrol ng Data Command
    • #define TFT_RST 4 // Reset pin (maaaring kumonekta sa RST pin)
    • #define TOUCH_CS 22 // Chip select pin (T_CS) ng touch screen
  • Mga Font: hindi na kailangang baguhin ang mga ito
  • Iba pang mga pagpipilian: Pinili ko ang sumusunod

    • # tukuyin ang SPI_FREQUENCY 20000000
    • # tukuyin ang SPI_READ_FREQUENCY 20000000
    • # tukuyin ang SPI_TOUCH_FREQUENCY 2500000

Ang lahat ng iba pang mga linya ng file ay nagkomento.

I-calibrate ang kapasidad ng pagpindot ng display

Kung ang pagpili ng isang bahagi ng screen o isang pindutan ay hindi tumpak, o kahit na ganap na mali, patakbuhin ang touch calibration sketch mula sa TFT_eSPI library at kopyahin / i-paste sa code ang array na ibinibigay nito (tiyaking gagamitin ang tamang halaga para sa orientation ng display, 1 o 3 para sa landscape).

Hakbang 3: Programa ng ESP32

Programa ng ESP32
Programa ng ESP32
Programa ng ESP32
Programa ng ESP32
Programa ng ESP32
Programa ng ESP32

Ipinapakita ang code sa isang 320 x 240 TFT touch screen, at ginagamit ang TFT_eSPI library. Kinakalkula nito ang mga set ng Mandelbrot at Julia para sa maraming mga halaga ng exponent, at pinapayagan kang mag-zoom in sa mga lugar na interesado upang makita ang aspal ng bali (ibig sabihin, ang pagkakaroon ng parehong mga istraktura sa bawat pagbabago ng scale).

Ang nakalakip na code ay isang bersyon para sa 480 x 320 display. Sa bersyon na ito, maaari mong baguhin ang laki (lapad at heigth sa mga pixel) ng display. Ang TFT_eSPI library ay tumutukoy sa mga koneksyon sa isang setup file (naka-attach) na dapat ilagay sa direktoryo ng library.

Nagsisimula ang code sa pamamagitan ng pagpapakita ng mga tagubilin sa pagpapatakbo (tingnan ang larawan at video)

Karamihan sa screen ay nakalaan para sa pagpapakita ng mga imahe, ang mga pindutang pindutin ay magagamit sa kanang bahagi ng screen:

  • R: gumaganap ng isang "reset", i. e. ipinapakita ang imahe sa maximum scale,
  • U: Pinapayagan ka ng "i-undo" na bumalik sa nakaraang hakbang (kung ang naka-zoom na rehiyon ay hindi kawili-wili, maaari kang pumili ng isa pang bahagi ng imahe upang mag-zoom in),
  • Pinapayagan ka ng M o J: na lumipat mula sa hanay ni Mandelbrot sa set ni Julia at sa kabaligtaran.

Ang mga label ng ilang mga susi ay nagbabago ayon sa konteksto: ipinapakita nila ang pagpapaandar na naisakatuparan kung pinindot. Kaya't kung kasalukuyan mong ipinapakita ang hanay ng Mandelbrot, ipinapakita ng key ng M / J ang J dahil kung pipindutin mo ito ay ipapakita mo ang hanay ni Julia (at vice versa).

Nalalapat ang pareho sa pagpili ng paleta ng kulay. Nagsisimula kami sa berdeng paleta. Iminungkahi ng susi ang susunod na palette (ang asul na isa). Ang mga paleta ay: pula, berde, asul, kulay abo, paleta 1, palette 2 at pabalik sa pula. Ang huling dalawa ay maraming kulay na mga pagsubok sa papag na nagbibigay ng higit na kaibahan, pinapayagan na mas makita ang ilang mga detalye.

Ang susi na may isang numero ay nagbibigay-daan sa iyo upang piliin ang exponent n, sa isang loop mula 2 hanggang 7 (at bumalik sa 2). Sa parehong espiritu, ipinapakita nito ang 3 kung kasalukuyan kang nasa 2…

Sa wakas, kapag ipinapakita ang set ng Julia, kinakailangan upang piliin ang halaga ng pare-pareho c: pinapayagan ka ng C key na gawin ito, salamat sa isang tagapili (tingnan ang pangalawang larawan). Ang halaga ng pare-pareho na ito ay ipinapakita kasama ang hanay.

Ang pag-click sa imahe ay nag-zoom sa paligid ng napiling punto. Ang isang maliit na bilog ay ipinapakita sa hinawakan na point at ang isang rektanggulo ay nagha-highlight sa naka-zoom zone ng hanay.

Ipinapakita ng ika-3 larawan na ang mga oras ng computing mananatili sa pagitan ng 0.8 at 1.2 segundo para sa 320 x 240 pixel, na ginagawang komportable upang mag-zoom at ipakita. Umabot ito ng 3 segundo para sa 480 x 320 pixel, ngunit nagbibigay ng higit pang mga detalye.

Hakbang 4: Ipinaliwanag ang Ilang Larawan…

Ipinaliwanag ang Ilang Larawan…
Ipinaliwanag ang Ilang Larawan…
Ipinaliwanag ang Ilang Larawan…
Ipinaliwanag ang Ilang Larawan…
Ipinaliwanag ang Ilang Larawan…
Ipinaliwanag ang Ilang Larawan…

Ang pinakamalaking larawan ay ang kilalang hanay ng Mandelbrot. Ang mga kumplikadong numero na ginamit sa imaheng ito ay mula sa -2.1 hanggang +0.7 sa abscissa, at -1.2 hanggang 1.2 sa ordinate. Kung mag-zoom ka sa kaliwang bahagi ng unang imaheng ito, malamang na makuha mo ang pangalawa, na nagpapakita ng isang mas maliit na bersyon ng orihinal na hanay na natagpuan sa kaliwang bahagi ng hanay. Para sa parehong mga imaheng ito, ang exponent ('n') ay katumbas ng 2: iyon ang halagang karaniwang ginagamit upang ipakita ang mga hanay ng Mandelbrot.

Kung binago mo ang halagang ito sa 3 (i-click lamang sa key na sinasabi na 3), nakukuha mo ang pangatlong imahe. Ang isang malinaw na pagkakaiba ay ang symmetry factor: n = 2 ay nagbibigay ng isang axial symmetry (ibig sabihin, ang set ay simetriko laban sa panggitna na pahalang na axis), ngunit may n = 3 ang imahe ay nagiging walang pagbabago sa pamamagitan ng pag-ikot ng 120 ° (isang third ng 360 °, pag-ikot kadahilanan ng mahusay na proporsyon ng 3). At pinapanatili nito ang mga katangian ng bali, na maaari mong i-verify sa pamamagitan ng pag-zoom sa mga gilid ng itim na hugis.

Ang ika-4 na imahe ay isang set ng Julia na nakuha pagkatapos pumili ng isang halaga ng koepisyent na katumbas ng 0.414 sa abscissa at 0.09 sa ordinate. Ang pulang paleta ay napili, tulad ng makikita ng berdeng key sa kanan (berde, na ang susunod na kulay na pipiliin). Ang ikalimang imahe ay nagpapakita ng parehong uri ng Julia set, kung saan ang isang mas mataas na haka-haka na bahagi ng pare-pareho (0.358).

Inaasahan kong masisiyahan ka sa paglalaro ng programang ito at maipakita mo ang magagandang mga larawan ng bali. Huwag mag-atubiling galugarin ang mga hanay ng Mandelbrot at Julia, at i-play ang mga palette: makakatulong silang makilala ang ilang mga detalye na maaaring hindi nakikita ng mga simpleng monochrome. Maaari mo ring matuklasan ang ilang mga fraktal landscapes na wala pang nakakita sa iyo bago …

_

Nais bang matuklasan ang higit pang mga imahe ng bali? Mag-click lamang dito o galugarin ang mga fractal art o kahit ang fractal ng instagram. Marahil ay maituturo ito sa iyo na nais na lumikha ng napakahusay na mga imahe …

Ginawa ng Math Contest
Ginawa ng Math Contest
Ginawa ng Math Contest
Ginawa ng Math Contest

Pangalawang Gantimpala sa Made with Math Contest

Inirerekumendang: