มาใช้ Mathematica ในการเรียนการสอนกัน ด้วยคำสั่ง Manipulate 2

ต่อจากครั้งที่แล้วครับ(http://www.sakngoi.com/?p=143)

คำสั่ง Manipulate นี้ Mathematica เพิ่มเข้ามาตั้งแต่ version 6 เป็นคำสั่งที่สามารถทำให้เราสามารถดูได้ครับว่ารูปแบบของกราฟหรือค่าจากการคำนวณอะไรบางอย่างที่เราสนใจจะเปลี่ยนไปอย่างไรถ้าหากเราเพิ่มหรือลดค่าที่เราสนใจที่เป็นส่วนหนึ่งในการคำนวณนั้น

เช่น อยากรู้ว่ากราฟของ sin\left(\omega\theta\right) ที่plot ตั้งแต่ \theta เท่ากับ 0-2\pi จะเปลี่ยนไปอย่างไรถ้าค่า \omega ค่อยเพิ่มขึ้นจาก 1-10 หรือ อย่างปัญหาในฟิสิกส์อยากรู้ว่าจะต้องยิงวัตถุจากจุดยอดของทรงกลมรัศมีขนาดหนึ่งด้วยมุมและอัตราเร็วเท่าใดวัตถุนั้นจึงจะเฉียดผิวของทรงกลมนี้พอดี และปัญหาอื่นๆอีกมากมาย สามารถดูตัวอย่างได้ที่ http://demonstrations.wolfram.com/

รูปแบบของคำสั่ง Manipulate ก็ตามที่แสดงด้านล่างนี้ครับ

รูปแบบคำสั่งนี้เป็นแบบ “จัดเต็ม”ครับ 🙂  แต่เราก็สามารถใส่แบบสั้นๆได้ครับ เช่นในการกำหนดตัวแปร อยากจะใส่เพียง {ตัวแปร,ค่าน้อยสุด,ค่ามากสุด} ก็ได้ครับ step ก็เป็นค่าอย่างเช่นจาก 1 ถึง 10 เราจะให้ค่าค่อยเพิ่มขึ้นครั้งล่ะเท่าไหร่จาก 1 ไปจนถึง 10  ส่วน options ก็จะเกี่ยวข้องกับการแสดงผลที่เกี่ยวข้องกับ slider หรือตัวควบคุมอื่นๆ เช่น Animator, Checkbox, ColorSetter, ColorSlider, InputField, Manipulator, PopupMenu, RadioButton หรือ RadioButtonBar, Setter หรือ SetterBar, Slider2D, Trigger and VerticalSlider ซึ่งเดี๋ยวจะพูดถึงทีหลังครับ

อันนี้เป็นตัวอย่างของกราฟ sin\left(\omega\theta\right)  โดย Manipulate จะสร้าง slider สำหรับการเปลี่ยนค่า \omega มาให้

Manipulate[

Plot[Sin[\omega \theta],{\theta,0,2\pi}]

,{\omega,1,10}

]

 

ส่วนอันนี้ก็เป็นการใช้ PolarPlot กับ cos(9 \theta) โดย \theta ค่อยๆเพิ่มจาก 0.01 ถึง \pi

Manipulate[
PolarPlot[Cos[9 \theta], {\theta, 0, T},
PlotRange -> {{-1, 1}, {-1, 1}}],
{{T, 0.01, “\theta (radian)”}, 0.01, \pi, Appearance -> “Labeled”}]

หรือจะลอง plot กราฟของฟังชั่นทางตรีโกนมิติ เช่น

Manipulate[
Plot[amp fun[freq x], {x, 0, 10}, PlotRange -> {-3, 3},
PlotStyle -> color, PlotLabel -> fun], {freq, 1, 5}, {amp, 1,
5}, {fun, {Sin, Cos, Tan, Csc, Sec, Cot}}, {{color,
Red}, {Purple -> “Purple”, Green -> “Green”, Blue -> “Blue”, Yellow -> “Yellow”}}]

ส่วนอันนี้ก็เป็นการเอาไปประยุกต์กับปัญหาฟิสิกส์ที่ว่าจะต้องยิงวัตถุจากจุดยอดของทรงกลมรัศมีขนาดหนึ่งด้วยมุมและอัตราเร็วเท่าใดวัตถุนั้นจึงจะเฉียดผิวของทรงกลมนี้พอดี(http://mpec.sc.mahidol.ac.th/forums/index.php/topic,345.0.html)

Manipulate[
Show[{Graphics[Circle[{0, 0}, r, {0, Pi}], Axes -> True],
Plot[Tan[theta] x – (9.8/(2 u^2 Cos[theta]^2)) x^2 + r, {x, 0,
r + 10}, PlotStyle -> Red,
PlotRange -> {{-r – 10, r + 10}, {0, r + 10}}]}],
{{u, 4.95, “initial speed(m/s)”}, 0.01, 50, 0.0001, Appearance -> “Labeled”},
{{theta, 0.5236, “launch angle(radian)”}, 0, Pi/2, 0.0001, Appearance -> “Labeled”},
{{r, 5, “circle radius(m)”}, 1, 10, Appearance -> “Labeled”}]

ส่วนอันนี้เป็น demonstration project ที่ผมลองทำส่งไปที่เวบ Wolfram ครับ

http://demonstrations.wolfram.com/AModelOfPlasmodiumFalciparumPopulationDynamicsInAPatientDuri/

ต่อ..สร้างโปรแกรมด้วย ManipulateMaker

อ ะ ไ ร สั ก อ ย่ า ง

อ ะ ไ ร สั ก อ ย่ า ง

มันต้องมีอะไรสักอย่างในจักรวาลนี้

ที่พลัดหลงไปจากมิติกาลเวลา

อะไรสักอย่างที่โคลัมบัสและยูลิซีสตกสำรวจ

อะไรสักอย่างที่นักดาราศาสตร์กรีกและอาหรับมิได้ค้นพบ

อะไรสักอย่างที่ศาสดาของโลกลืมเทศนาสั่งสอน

อะไรสักอย่างที่ขาดหายไประหว่างหลุมดำ

 

มันต้องมีความผิดพลาดบางอย่างเกิดขึ้น

ระหว่างรอยต่อของเผ่าพันธุ์มนุษยชาติ

ที่พลัดหลงครั้งน้ำท่วมโลก

อะไรสักอย่างที่ไม่ได้ไปพร้อมกับเรือโนอาห์

อะไรสักอย่างที่พระคัมภีร์โบราณมิได้จารึก

อะไรสักอย่างที่นอสตราดรามุสคาดไม่ถึง

 

มันต้องมีความเข้าใจผิดบางอย่างบนโลกใบนี้

ที่สูญหายไปจากฐานข้อมูลของพลโลก

อะไรสักอย่างที่เพลโตไม่คาดคิด

อะไรสักอย่างที่นิทเช่ไม่ได้กล่าวถึง

อะไรสักอย่างที่ไอสไตน์มิได้คำนวณ

อะไรสักอย่างที่ขาดหายไป…

จากชิ้นส่วนของความทรงจำของมนุษยชาติ

….ซะการีย์ยา อมตยา….

เพลงเถื่อนแห่งสถาบัน

เพลงเถื่อนแห่งสถาบัน

ดอกหาง นกยูง สีแดงฉาน บานอยู่เต็มฟากสวรรค์
คนเดินผ่าน ไปมากัน เขาด้นดั้น หาสิ่งใด
ปัญญา มีขาย ที่นี่หรือ จะแย่งซื้อ ได้ที่ไหน
อย่างที่โก้ หรูหรา ราคาเท่าใด จะให้พ่อ ขายนา มาแลกเอา
ฉันมา ฉันเห็น ฉันแพ้ ยินแต่ เสียงด่า ว่าโง่เง่า
เพลงที่นี่ ไม่หวาน เหมือนบ้านเรา ใครไม่เข้า ถึงพอ เขาเยาะเย้ย
นี่จะให้ อะไร กันบ้างไหม มหาวิทยาลัย ใหญ่โตเหวย
แม้นท่าน มิอาจให้ อะไรเลย วานนิ่งเฉย อย่าบ่นอย่าโวยวาย
ฉันเยาว์ ฉันเขลา ฉันทึ่ง ฉันจึง มาหา ความหมาย
ฉันหวัง เก็บอะไร ไปมากมาย สุดท้ายให้กระดาษฉันแผ่นเดียว
มืดจริงหนอ สถาบัน อันกว้างขวาง ปล่อยฉัน อ้างว้าง ขับเคี่ยว
เดินหา ซื้อปัญญา จนหน้าเซียว เทียวมา เทียวไป ไม่รู้วัน
ดอกหางนกยูง สีแดงฉาน บานอยู่เต็ม ฟากสวรรค์
เกินพอ ให้เจ้าแบ่งปัน จงเก็บกัน อย่าเดิน ผ่านเลยไป

วงกลมแห่งความตาย

จากที่มีคนถามปัญหาที่ http://www.pantip.com/cafe/wahkor/topic/X10570620/X10570620.html

มีชายหนึ่งล้านคนยืนกันเป็นวงกลม

ชายเหล่านี้ตั้งใจ จะฆ่าตัวตายหมู่ แต่เนื่องจากไม่มีใคร
กล้าฆ่าตัวตายจึงตกลงทำดังนี้ ให้ทุกคนล้อมเป็นวงกลม
จากนั้นให้เริ่มต้นที่คนแรก นำดาบฆ่าคนที่ 2
แล้วส่งดาบไปให้คนที่ 3 แล้วคนที่ 3 นำดาบนั้นฆ่าคนที่ 4
แล้วส่งดาบไปให้คนถัดไป ทำเช่นนี้ จนเหลือผู้รอดชีวิตอยู่คนเดียว
จึงค่อยฆ่าตัวตาย
ถ้าคุณบังเอิญอยู่ในกลุ่มคนพวกนี้ และเกิดไม่อยากถูกใครฆ่าขึ้นมา
คุณจึงพยายามไปยืนตำแหน่งที่จะเหลือรอดเป็นคนสุดท้าย
ถามว่าคุณจะไปยืนเป็นคนที่เท่าไหร่

 

เพื่อที่จะแก้ปัญหานี้แบบคนขี้เกียจผมก็ลองเขียนโปรแกรมโดยใช้ Mathematica ดูปรากฏว่าคำตอบที่ได้คือ

ต้องยืนที่ตำแหน่ง 951425

อันนี้โปรแกรมที่เขียนครับ

drp = Compile[{{ls, _Integer, 1}},
Select[ls, MemberQ[Drop[ls, {1, Length@ls, 2}], #] == False &]]

fn[ls_] :=
Module[{tmp}, tmp = drp[ls];(*Select[ls,MemberQ[Drop[ls,{1,Length@ls,
2}],#]==False&];*)
If[EvenQ[Length@ls], Developer`ToPackedArray@tmp,
Developer`ToPackedArray@RotateRight@tmp]
]

ls = Developer`ToPackedArray[Table[i, {i, 1, 10^6}]];

Nest[fn2, ls, 30]

{951425}

 

ซึ่งจริงๆแล้วปัญหานี้ก็คือรูปแบบหนึ่งของปัญหาที่เรียกว่า Josephus problem ครับ เราสามารถเขียนด้วย Mathematica

สั้นๆได้ตามนี้เลยครับ

Needs[“Combinatorica`”]
Last@InversePermutation[Josephus[10^6, 2]]
951425

 

ปล. อาจจะคำนวณนานหน่อยนะครับ 🙂