สวัสดี...ครับ
สัมมนา เรื่อง Filled Julia Set เสนอ อาจารย์ พัชรี เลิศวิจิตรศิลป์ จัดทำโดย นาย พจศิษฏ์ ปัดภัย 42041004 อาจารย์ที่ปรึกษา ผศ. ประวัติ พัฒนิบูลย์
Filled Julia Set
แนะนำ งานศิลปะส่วนใหญ่มักเริ่มมาจากรูปทรงเรขาคณิตพื้นฐาน เช่น เส้นตรง วงกลม วงรี รูปหลายเหลียม ภาคตัดกรวย ฯลฯ หรือแม้แต่ในธรรมชาติเองก็ตามก็ยังมีรูปทรงทางเรขาคณิต เช่น การโคจรรอบดวงอาทิตย์ของโลกเป็นรูปวงรีที่สวยงาม แต่มีอีกหลาย ๆสิ่งในธรรมชาติที่ซับซ้อนและไม่เป็นระเบียบ ซึ่งไม่สามารถใช้รูปทรงเรขาคณิตที่เราคุ้นเคยได้ เช่น รูปภูเขา ต้นไม้ สัตว์ ความซับซ้อนของทางเดินเลือดในร่างกายของมนุษย์ รวมทั้งโครงสร้างของระบบประสาท ดังนั้น Fractal จึงมามีบทบาทสำคัญในการสร้างรูปที่มีความซับซ้อน และสามารถประยุกต์นำไปใช้ประโยชน์ในทางคอมพิวเตอร์ได้ เช่น คอมพิวเตอร์กราฟิก
Fractal คือ วัตถุหรือสิ่งที่ถูกมองทางเรขาคณิตซึ่งมีการเปลี่ยนแปลงทั้งขนาดและทิศทางอยู่ตลอดเวลาโดยมีการเปลี่ยนแปลงในลักษณะเดิมซ้ำ ๆ กันไปเรื่อย ๆ ตัวอย่าง Fractal ในธรรมชาติ เช่น เส้นใยประสาทในสมอง เนื้อเยื้อประสาท บรอคโคลี ต้นไม้ ทางเดินเลือดในร่างกายของมนุษย์ ฯลฯ ซึ่งมีการเปลี่ยนแปลงในลักษณะเดิมซ้ำ ๆ กันไปเรื่อย ๆ
Iteration กำหนดให้ F เป็นฟังก์ชัน เลือก x0 เป็นค่าเริ่มต้นแทนลงใน F แล้วได้ผลลัพธ์คือ x1 แล้วนำ x1 แทนลงใน F ทำซ้ำไป เรื่อย ๆ แสดงได้ดังนี้ F(x0) = x1 F(x1) = F(F(x0)) = x2 F(x2) = F(F(F(x0))) = x3 ….. F(xn-1) = F(…( F( x0)…) = xn
เราแทนการทำซ้ำ n ครั้ง ด้วย F n(x0) และเรียกว่า iterat อันดับที่ n ของ F เช่น F(F( x0)) = F2(x0) เรียกว่า iterat อันดับที่ 2 ของ F ตัวอย่าง กำหนดให้ F(x) = x2 + 1 จะได้ F2(x) = (x2 + 1)2 + 1 F3(x) = ((x2 + 1)2 + 1)2 + 1 ….
Orbit นิยาม กำหนดให้ x0 เป็นจำนวนจริง Orbit ของ x0 ภายใต้ F คือ ลำดับของจุด x0 , x1 , x2 , x3 , … , xn , … โดยที่ x1 = F(x0) x2 = F 2(x0) … xn = F n(x0) และเรียกจุด x0 ว่า Seed of the Orbit
ตัวอย่าง กำหนดให้ F(x) = เมื่อเลือก x0 = 256 เป็นจุดเริ่มต้น จะได้ Orbit ของ x0 คือ x0 = 256 x1 = = 16 x2 = = 4 x3 = = 2 x4 = = 1.41 …..
Fixed Point ในกรณีที่ทำซ้ำไปเรื่อย ๆ ปรากฏว่าได้ค่าเท่าเดิมเราจะเรียกค่านั้นว่า Fixed Point กล่าวคือ ที่ F(x0) = x0 ซึ่งจะได้ว่า F2(x0) = F3(x0) = …. = Fn(x0) = x0
กำหนดให้ F(x) = sin x เมื่อเริ่มต้นที่ x0 = 0 ตัวอย่าง กำหนดให้ F(x) = sin x เมื่อเริ่มต้นที่ x0 = 0 จะได้ F(x0) = F2(x0) = …. = Fn(x0) = sin 0 = 0 เพราะฉะนั้น 0 คือ fixed point ของ F(x) = sin x ฟังก์ชันหนึ่งอาจมี fixed point ได้หลายจุด ขึ้นอยู่กับการ เลือก x0 เช่น 0,1,-1 เป็น fixed point ของ F(x) = x3 และ 0,1 เป็น fixed point ของ F(x) = x2
จากการศึกษาพบว่าพฤติกรรมที่เป็นไปได้ของ Orbit ของ x0 คือ 1) Orbit จะลู่เข้าสู่ fixed point หรือ เป็นคาบ 2) Orbit จะลู่ออกสู่ อนันต์ (infinity) 3) Orbit อาจอยู่ในช่วงใดช่วงหนึ่ง หรืออาจกล่าวได้ว่า Orbit มีขอบเขต
Complex Dynamics ในทำนองเดียวกันหากพิจารณาในฟังก์ชันจำนวน เชิงซ้อน Orbit ของ z0 คือ ลำดับ z0, F( z0), F 2( z0), …., Fn( z0),…. เมื่อ z0 คือ จำนวนเชิงซ้อน
Julia Set (Gaston Julia) เป็นการศึกษาถึงการส่งของ ฟังก์ชันที่มีการทำซ้ำ ๆ (Iteration) บนระนาบเชิงซ้อน ในเบื้องต้นเราพิจารณาฟังก์ชัน Quadratic โดยเขียนแทนด้วย Qc(z) = z2 + c เมื่อ z คือ จำนวนเชิงซ้อน c คือ จำนวนเชิงซ้อนคงที่
Q 0(z) = z2 คือ z0 = reiθ Q0 (z0) = z1 = r2 ei(2θ) ถ้าเขียน z ในรูป z = reiθ จะได้ Orbit ของ z0 ภายใต้ Q 0(z) = z2 คือ z0 = reiθ Q0 (z0) = z1 = r2 ei(2θ) Q02(z0) = z2 = r4 ei(4θ) Q03(z0) = z3 = r8 ei(8θ) …. Q0n(z0) = zn =
เมื่อ |z| > 1 จะได้ว่า Q0n(z) → ∞ เมื่อ n → ∞ จาก r = |z| เมื่อ |z| > 1 จะได้ว่า Q0n(z) → ∞ เมื่อ n → ∞ |z| < 1 จะได้ว่า Q0n(z) → 0 เมื่อ n → ∞ |z| = 1 จะได้ วงกลมรัศมี 1 หน่วย
นิยาม Orbit ของ z ภายใต้ Q c(z) จะมีขอบเขต (bounded) ถ้ามี K ที่ทำให้ |Qcn(z)| < K ทุก n นิยาม Filled Julia Set ของ Qc (z) คือ เซตของจุดซึ่ง Orbits มีขอบเขต แทนด้วย Kc และ Julia Set ของ Qc(z) คือ ขอบเขตของ Filled Julia Set แทนด้วย Jc
ในการจะหา Filled Julia Set ตามนิยามเราต้อง ตรวจสอบดูว่า Orbit ของ z ใดมีขอบเขตคือต้องตรวจสอบดูว่า |Qcn(z)| → ∞ เมื่อ n → ∞ ทฤษฎีบท ถ้า |z| ≥ |c| > 2 แล้ว | Qcn(z)| → ∞ เมื่อ n → ∞
พิสูจน์ โดยอสมการอิงสามเหลี่ยม |Qc (z)| ≥ |z|2 - |c| ≥ |z|2 - |z| (จาก |z| ≥ |c| ) = |z|(|z| - 1) จาก |z| > 2 จะมี λ > 0 ที่ซึ่ง |z| - 1 > 1 + λ ดังนั้น |Qc(z)| > (1 + λ)|z| |Qcn(z)| > (1 + λ)n|z| ดังนั้น Orbits ของ z ลู่ออกสู่อนันต์
การคำนวณ Filled Julia Set แนวคิด เราจะอาศัยหลักการตามทฤษฎีข้างต้นคือจะแบ่งพื้นที่บนระนาบออกเป็นตารางจุดเล็ก ๆ แล้วตรวจดูว่าจุดในตารางนั้นมี Orbits ที่ลู่ออกสู่อนันต์หรือไม่ ถ้าไม่มีก็จะให้ตารางจุดนั้นเป็นสีดำ โดยการทำซ้ำ( Iteration) ตามที่กำหนด และภายใต้เงื่องไข |Qcn(z)| < 2 เพราะถ้าค่า |z| ≥ |c| > 2 แล้ว จะลู่ออกสู่อนันต์ตามทฤษฎี
โปรแกรมการคำนวณ Filled Julia Set โปรแกรมที่แสดงต่อไปนี้เขียนขึ้นโดยใช้ mathematica โดยเริ่มจากฟังก์ชัน quadratic แล้วประยุกต์ไปเป็น ฟังก์ชัน sin z ,cos z และ ฟังก์ชัน exponential
ฟังก์ชัน quadratic Qc(z) = z2 + c Orbitcheckqu [z_,c_,iters_] :=(s=z; i=1; While [i≤iters&&Abs[s]<2,i++;s=s^2+c]; If [i==iters+1,{Re[z],Im[z]}#&/@{1,-1},{}]) FilledJuliaqu[c_,{meshx_,meshy_},{x0_,x1_}, {y0_,y1_}, iters_]:= Show[ Graphics[{PointSize[0.002], Map[Point, Flatten[Outer[orbitcheckqu[#1+I#2,N[c],iters]&, Range[x0,x1,(x1-x0)/meshx], Range[y0,y1,(y1-y0)/meshy]],2]]}], AspectRatio → Automatic ,PlotRange → All ]
C = - 0.12256117 + 0.74486177I FilledJuliaqu[c,{500,500},{-1.31,0.52},{0,1.11},30]
C = - 0.11 + 0.86I FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},30]
C = - 1.32 FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50]
C = - 0.5 + 0.57I; FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50];
C = - 0.360284 + 0.100376I; FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50];
FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50]; C = - 0.32 + 0.043I; FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50];
FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50]; C = - 0.390541 – 0.586788I; FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50];
FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50]; C = - 0.3 + 0.4I; FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50];
FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50];
FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},30]; C = - 0.75 + 0.1I; FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},30];
FilledJuliaqu[c,{400,400},{-1.5,1.5},{-1.5,1.5},40]; C = - 0.75 + 0.1I; FilledJuliaqu[c,{400,400},{-1.5,1.5},{-1.5,1.5},40];
FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50]; C = - 0.7382 + 0.0827I; FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50];
FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},90]; C = - 0.75 + 0.1I; FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},90];
FilledJuliaqu[c,{500,500},{-.5,1.5},{1.5,1.5},30];
FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50]; C = 0.27334 + 0.00742I; FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50];
FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50]; C = - 0.2 + 0.75I; FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50];
FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50]; C = - 0.1194 + 0.6289I; FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50];
FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50]; C = 0.25 + 0.52I; FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50];
FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50]; C = 0.377 – 0.248I; FilledJuliaqu[c,{500,500},{-1.5,1.5},{-1.5,1.5},50];
ฟังก์ชัน cos z Fc(z) = (c) cos z Orbitcheckcos [z_,c_,iters_] :=(s=z; i=1; While [i≤iters&&Abs[s]<50,i++;s=c*cos[s]]; If [i==iters+1,{Re[z],Im[z]}#&/@{1,-1},{}]) FilledJuliacos[c_,{meshx_,meshy_},{x0_,x1_}, {y0_,y1_},iters_]:= Show[ Graphics[{PointSize[0.002], Map[Point, Flatten[Outer[orbitcheckqu[#1+I#2,N[c],iters]&, Range[x0,x1,(x1-x0)/meshx], Range[y0,y1,(y1-y0)/meshy]],2]]}], AspectRatio → Automatic,PlotRange → All ]
FilledJuliacos[c,{1050,1050},{-3,3},{-3,3},60];
ฟังก์ชัน sin z Fc(z) = (c) sin z Orbitchecksin [z_,c_,iters_] :=(s=z; i=1; While [i≤iters&&Abs[s]<50,i++;s=c*sin[s]]; If [i==iters+1,{Re[z],Im[z]}#&/@{1,-1},{}]) FilledJuliasin[c_,{meshx_,meshy_},{x0_,x1_}, {y0_,y1_},iters_]:= Show[ Graphics[{PointSize[0.002], Map[Point, Flatten[Outer[orbitcheckqu[#1+I#2,N[c],iters]&, Range[x0,x1,(x1-x0)/meshx], Range[y0,y1,(y1-y0)/meshy]],2]]}], AspectRatio → Automatic,PlotRange → All ]
FilledJuliasin[c,{600,600},{-1.5,1.5},{-1.5,1.5},50]; C = 1 + 0.2I; FilledJuliasin[c,{600,600},{-1.5,1.5},{-1.5,1.5},50];
FilledJuliasin[c,{500,500},{-3,3},{-5,5},50]; C = 1 + 0.1I; FilledJuliasin[c,{500,500},{-3,3},{-5,5},50];
FilledJuliasin[c,{400,400},{-3,3},{-3,3},30]; C = 0.61 + 0.81I; FilledJuliasin[c,{400,400},{-3,3},{-3,3},30];
FilledJuliasin[c,{400,400},{-3,3},{-3,3},50]; C = 0.61 + 0.81I; FilledJuliasin[c,{400,400},{-3,3},{-3,3},50];
FilledJuliasin[c,{400,400},{-3,3},{-3,3},100]; C = 0.61 + 0.81I; FilledJuliasin[c,{400,400},{-3,3},{-3,3},100];
FilledJuliasin[c,{1000,1000},{-3,3},{-5,5},100]; C = 0.61 + 0.81I; FilledJuliasin[c,{1000,1000},{-3,3},{-5,5},100];
ฟังก์ชัน exponential Fc(z) = (c) ez orbitcheckep[z_,c_,iters_] :=(s=z; i=1; While[i≤iters&&Abs[s]<50,i++;s=c*Exp[s]]; If [i==iters+1,{Re[z],Im[z]}#&/@{1,-1},{}]) FilledJuliaep[c_,{meshx_,meshy_},{x0_,x1_}, {y0_,y1_},iters_]:= Show[ Graphics[{PointSize[0.002], Map[Point, Flatten[Outer[orbitcheckqu[#1+I#2,N[c],iters]&, Range[x0,x1,(x1-x0)/meshx], Range[y0,y1,(y1-y0)/meshy]],2]]}], AspectRatio → Automatic,PlotRange → All ]
C=-2.5+1.5I FilledJuliaep[c,{1000,1000},{-3,3},{-2,2},50];
สวัสดี