วงแหวนเว็บ

neizod's speculation

insufficient data for meaningful answer

โปสเตอร์ Mandelbrot

Friday, November 19, 2021, 11:20 PM

เรื่องของเรื่องคือสั่งโปสเตอร์สุดคูลขนาด 3x2 ตารางฟุตจากร้านนึง แล้วก็ไปซื้อกรอบรูปจากอีกร้าน ซึ่งไอ้เจ้าโปสเตอร์ตัวดีดันถูกบริษัทขนส่งเล่นตลกส่งช้าอ้อมโลกไปสามเดือน … ในเมื่อที่บ้านมีกรอบรูปเปล่าๆ ทิ้งไว้ ก็เลยมาลองทำโปสเตอร์ใส่เองดีกว่า มองไปมองมาก็เอาเซต Mandelbrot เนี่ยแหละ

จะติดก็ตรงที่ว่าแม้เซต Mandelbrot จะเป็นอะไรที่ป๊อปมาก (มากซะจนคนนอกสายคณิตศาสตร์ก็น่าจะเคยเห็นผ่านตามาบ้าง) แต่รูปที่มีความละเอียดสูงๆ ระดับสำหรับงานพิมพ์ระดับ A1 นั้นไม่มีเลย (หรือมีแต่เราหาไม่เจอเอง?) และแม้จะมีรูปที่ละเอียดแต่ก็ไม่เห็นแบบที่มีสีสันเหมาะสมกับบรรยากาศในบ้านอยู่ดี เพราะงั้นงานนี้อยากได้ต้องทำเอง 55555 👉 จิ้มโหลดโค้ดโลดดด

ถึงเราจะเคยเล่นอะไรเกี่ยวกับ fractal มาบ้าง แต่สำหรับเซต Mandelbrot แล้วเรากลับมีความรู้ (ทั้งบนพื้นฐานความจริงและในจินตนาการ) เริ่มต้นที่ศูนย์เลยทีเดียว ก็ต้องขอบคุณ Numberphile และ Mathologer ที่อธิบายปูพื้นฐานไว้ได้อย่างละเอียดสุดๆ 👏👏👏

สร้างรูปเซต Mandelbrot

โดยเจ้า Mandelbrot นั้นมันเริ่มมาจากสมการสุดเรียบง่ายอย่าง $f_c(z) = z^2+c$ ที่เราจะเอาไปหาลำดับจากการเรียกซ้ำสมการนี้ไปเรื่อยๆ ซึ่งก็คือเอาผลลัพธ์จากรอบก่อนหน้าไปใส่เป็นตัวแปรสำหรับรอบถัดไป หากลำดับที่ได้ไม่ลู่ออกอย่างไร้ขอบเขต ก็ถือว่าค่าคงที่ $c$ ตั้งต้นเป็นสมาชิกของเซตนั่นเอง กล่าวคือถ้าให้

\[\overset{\langle k\rangle}{f_c}(z) = \overbrace{f_c(f_c( \cdots f_c(z) \cdots ))}^\text{$k$ times}\]

สนใจค่าคงที่ $c$ ใดๆ และเริ่มต้นตั้งค่า $z=0$ เราอยากรู้ว่าลำดับนี้ลู่ออกอย่างไร้ขอบเขตหรือไม่

\[f_c(0),\quad \overset{\langle2\rangle}{f_c}(0),\quad \overset{\langle3\rangle}{f_c}(0),\quad \cdots,\quad \overset{\langle\infty\rangle}{f_c}(0),\quad \cdots\]

โดยเรานับว่าการลู่ออกมีอยู่เพียงวิธีเดียว คือ $\abs{\overset{\langle\infty\rangle}{f_c}(0)} = \infty$ เท่านั้น สำหรับลำดับบางแบบที่ค่าไม่ได้ลู่เข้าไปหยุดนิ่งอยู่ที่ค่าใดค่าหนึ่ง (ตามที่เราคุ้นเคย) แต่เด้งไปมาเป็นคาบระหว่างค่าต่างๆ (เช่นที่ $c={-}1$ จะได้ว่าสมาชิกในลำดับวิ่งสลับกันไปมาเป็นคาบความยาวสองระหว่างค่า $0$ และ $-1$) จะไม่ถือว่าลู่ออกแต่อย่างใด

เห็นได้ไม่ยากว่า สำหรับจำนวนจริง $c$ ใดๆ ช่วงที่ไม่ลู่ออกคือช่วงปิดจาก $-2$ ถึง $+\frac14$ แล้วเราจะสนใจแค่จำนวนจริงทำไมหละ ถ้ายอมให้ $c$ เป็นจำนวนเชิงซ้อน เราจะได้เซต Mandelbrot อย่างที่คุ้นเคยกันดีนั่นเอง

เซต Mandelbrot (สีขาว) ในพิกัดเชิงซ้อนตั้งแต่ $(-\frac{10}4,+\frac54i)$ ที่มุมซ้ายบน ไปจนถึง $(+\frac54,-\frac54i)$ ที่มุมขวาล่าง

แต่หากระบายสีแบ่งแค่ระหว่างสมาชิกในเซตกับนอกเซตก็คงธรรมดาไป วิธีหนึ่งที่น่าสนใจและแพร่หลายก็คือการระบายสีค่า $c$ ที่เมื่อนำไปผ่านฟังก์ชัน $\overset{\langle k\rangle}{f_c}(0)$ แล้วลู่ออก โดยเลือกสีตามลำดับความเร็วว่าต้องทดสอบจุดนั้นด้วยการเอาไปผ่านฟังก์ชัน $f_c$ กี่ $k$ รอบจึงจะมั่นใจได้ว่าลำดับมันจะลู่ออกจริงๆ ซึ่ง threshold ยอดนิยมที่ผ่านการพิสูจน์มาแล้วก็คือ $\abs{\overset{\langle k\rangle}{f_c}(0)} > 2$ จะทำให้ลำดับลู่ออกแน่นอน ใช้ความรู้นี้ประกอบกับการเขียนโปรแกรมอีกเล็กน้อยก็ทำให้ได้ผลลัพธ์เป็นรูปสวยๆ (?) ตามข้างต้นแล้ว 😊

เร่งความเร็วกับการทดสอบหัวใจสำคัญ

อย่างไรก็ตามโปรแกรมที่ได้นั้นคำนวณช้ามากกกกกก (รันทิ้งไว้เป็นชั่วโมง) ซึ่งก็ไม่น่าแปลกใจเพราะมีหลายจุดที่ไม่ยอมลู่ออกเสียที จึงต้องนำมันไปผ่านฟังก์ชัน $f_c$ เพื่อทดสอบซ้ำเรื่อยๆ (จนกว่าจะถึงลิมิตความเหนื่อยว่าไม่อยากทดสอบจุดนั้นแล้ว) ดังนั้นถ้าเราสามารถหาคำตอบได้อย่างรวดเร็วเลยว่าจุดที่สนใจจุดนั้นอยู่ในเซต Mandelbrot หรือไม่ เพื่อให้เราข้ามการวนรอบทดสอบการลู่ออกไปเลยก็คงดีไม่น้อย

ซึ่งบริเวณที่ใหญ่ที่สุดในเซต ก็คือส่วนที่เรียกว่าหัวใจสำคัญ (main cardioid – แปลออกมาแล้วเท่ดี 5555) ที่ถ้าใครเคยพล็อตฟังก์ชันตรีโกณมิติในระนาบเชิงขั้วก็คงบอกได้ทันทีว่ามันเป็นพล็อตรูปหัวใจที่มีหน้าตาคล้าย $r=1-\cos\theta$ แต่เราจะแก้สมการนี้ในระนาบเชิงซ้อนได้อย่างไรหละ?

หากเราไล่ติดตามผลลัพธ์ต่างๆ ในบางลำดับ จะพบว่ามีบางค่า $c$ ที่ให้ผลลัพธ์ $\overset{\langle\infty\rangle}{f_c}(0)$ ลู่เข้าไปหยุดที่จุดเพียงจุดเดียว เราเรียกจุดนั้นว่าจุดตรึง (fixed point) หากให้ $z_\ast$ เป็นจุดตรึงนั้น จะได้ว่า $\overset{\langle\infty\rangle}{f_c}(0) = z_\ast = f_c(z_\ast)$ นั่นเอง และเมื่อแทนค่าตามนิยาม $f_c$ กลับมาก็จะได้ว่า

\[0 = z_\ast^2 - z_\ast + c\]

ถึงตอนนี้ก็ง่ายแล้ว เพราะแค่ใช้สูตรสุดน่าเกลียด $-b\pm\sqrt{blah}$ ที่เรารู้จักกันไม่ดีมาตั้งแต่ม.ต้น เพื่อแก้สมการเชิงซ้อนนี้ได้เลย ซึ่งจะทำให้ได้ผลลัพธ์ว่า

\[z_\ast = \frac{1 \pm \sqrt{1-4c}}{2}\]

แต่นี่ยังเป็นแค่ครึ่งทางการคำนวณ เพราะสิ่งที่เราต้องการหาจริงๆ คือค่า $c$ ที่สอดคล้องกับเงื่อนไขบางอย่าง ที่ทำให้หาจุดตรึง $z_\ast$ เหล่านั้นได้ต่างหาก โดยการคำนวณอีกส่วนที่เราจะสนใจคือพฤติกรรมของจุดเพื่อนบ้านละแวกใกล้กับ $z_\ast$ ที่หากนำบรรดาเพื่อนบ้านไปผ่าน $f_c$ แล้วเพื่อนบ้านยังขยับเข้าหา $z_\ast$ เรื่อยๆ เราจะเรียก $z_\ast$ เช่นนี้ว่าเป็นจุดตรึงดึงดูด (attracting fixed point) และเราสามารถเช็คว่าจุดนั้นๆ มีคุณสมบัติดังกล่าวหรือไม่ผ่านการหาค่าความจริงจากอสมการอนุพันธ์ $\abs{f_c’(z_\ast)}<1$ ได้ทันที ดังนั้นเราจึงได้อสมการเงื่อนไขคือ

\[\abs{f_c'(z_\ast)} = \abs{2z_\ast} < 1\]

ซึ่งก็คือ สำหรับค่า $c$ ใดๆ เราเพียงแค่ทดสอบว่า

\[\abs{1\pm\sqrt{1-4c}} < 1\]

หรือไม่ หากอสมการนี้เป็นจริงก็แปลว่าค่า $c$ นั้นไม่มีวันลู่ออก และมีผลลัพธ์เป็นสมการรูปหัวใจนั่นเอง ❤️

แล้วกลุ่มก้อนอื่นๆ หละ?

สังเกตว่าอสมการทดสอบหัวใจสำคัญนั้นยืนยันได้แค่การเป็นสมาชิกเซต สำหรับจุดอื่นๆ ที่ทดสอบแล้วไม่ถูกต้องตามอสมการ จุดนั้นอาจไม่จำเป็นต้องลู่ออกก็ได้ แต่มันอาจกระโดดไปมาเป็นคาบ เช่นที่เราเห็นกันไปแล้วว่า $c=-1$ จะให้คาบความยาวสอง คำถามคือเรายังสามารถเช็คค่าพวกนี้ได้อยู่หรือไม่?

สมมติสนใจลำดับไม่ลู่ออกที่มีคาบความยาวสอง เราอาจจะมองว่ามันเป็นจุดตรึงก็ได้ เพียงแต่ต้องเปลี่ยนไปมองมันบนฟังก์ชันตัวใหม่ สมมติสนใจเฉพาะจุดตรึง $\overset{\langle\infty\rangle}{f_c}(0)=z_*$ ดังนั้น $z_\ast = \overset{\langle2\rangle}{f_c}(z_\ast)$ หรือก็คือ

\[\begin{align} z_\ast &= f_c(f_c(z_\ast)) \\ &= (z_\ast^2 + c)^2 + c \\ &= z_\ast^4 + 2cz_\ast^2 + c^2 + c \end{align}\]

กลายเป็นว่าเราต้องแก้สมการกำลังสี่เพื่อหา $z_\ast$ อย่างนั้นหรือ? เปล่าเลย! เพราะยังไงซะเราก็สนใจ $c$ เป็นหลักอยู่แล้ว ดังนั้นจัดรูปเป็น

\[0 = c^2 + (2z_\ast^2+1)c + (z_\ast^4-z_\ast)\]

โชคดีที่สมการนี้จับพจน์กำลังสี่มาตัดกันทิ้งได้หมด ดังนี้

\[\begin{align} c &= \frac{-(2z_\ast^2+1) \pm \sqrt{(2z_\ast^2+1)^2 - 4(z_\ast^4-z_\ast)}}2 \\ &= \frac{-(2z_\ast^2+1) \pm \sqrt{4z_\ast^2 + 4z_\ast + 1}}2 \\ &= \frac{-(2z_\ast^2+1) \pm (2z_\ast + 1)}2 \\ &= (z_\ast - z_\ast^2) \quad\quad\text{or}\quad\quad (- z_\ast^2 - z_\ast - 1) \end{align}\]

สังเกตว่าเราเคยแก้กรณี $c=z_\ast-z_\ast^2$ ไปแล้วในหัวใจหลัก ซึ่งก็ไม่ถือว่าแปลกอะไรที่สมการข้างต้นจะให้คำตอบนี้ซ้ำกลับมาด้วย เพราะคาบความยาวสองนั้นย่อมสามารถสร้างได้จากการนำคาบความยาวหนึ่งมาวนซ้ำสองครั้งนั่นเอง

ดังนั้นสนใจเฉพาะ $c=-z_\ast^2-z_\ast-1$ ซึ่งให้คำตอบเป็นคาบความยาวเท่ากับสองพอดีเพียงอย่างเดียว เช่นเดิมเราสนใจอสมการอนุพันธ์ $\abs{\overset{\langle2\rangle}{f_c’}(z_\ast)} = \abs{4z_\ast^3+4cz_\ast} < 1$ ตรงนี้จะทริกกี้หน่อยเพราะเราจะเริ่มโดยการแทนค่า $c$ ลงไปก่อน

\[\begin{align} 4\abs{z_\ast(z_\ast^2 + c)} &= 4\abs{z_\ast(z_\ast^2 - z_\ast^2 - z_\ast - 1)} \\ &= 4\abs{z_\ast(z_\ast+1)} \\ &= 4\abs{z_\ast^2 + z_\ast} \\ &< 1 \end{align}\]

แล้วจึงนำ $\abs{z_\ast^2+z_\ast}$ แทนค่ากลับลงไปที่ $c=-z_\ast^2-z_\ast-1$ ซึ่งทำให้ได้

\[\abs{1+c} < \frac14\]

หรือก็คือได้วงกลมรัศมี $\frac14$ ที่มีจุดโฟกัสอยู่ที่ $(-1,0i)$ ที่เราเรียกว่าดิสก์สำคัญ (main disk) นั่นเอง 💫

ส่วนกลุ่มอื่นๆ ที่มีคาบยาวกว่านี้ … น่าจะแก้สมการยากน่าดู 😂😂😂😂😂

อ้างอิง

neizod

author