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

จากตอนที่แล้ว เดี๋ยวผมจะพูดถึงการใช้งาน slider กับตัวควบคุมอื่นๆ ของ Manipulate ครับ

ดูตัวอย่างไปก่อนนะครับ

Manipulate[
Module[{anglegraph, maingraph},
anglegraph[th_, showtext_] := Show[
Graphics[{
{Lighter[Gray, 0.5], Circle[{0, 0}, 1]},
{Darker[Green, 0.2], Thick, Circle[{0, 0}, 1, {0, th}]},
{Lighter[Gray, 0.5], Line[{{0, 0}, {Cos[th], Sin[th]}}]},
{Red, Thick, Line[{{Cos[th], 0}, {Cos[th], Sin[th]}}]},
If[showtext,
Rotate[Text[
Style[N[Sin[th]], 11], {Cos[th] – 0.15, Sin[th]/2}],
3 Pi/2, {Cos[th] – 0.15, Sin[th]/2}], {}],
{Lighter[Red, 0.3], Dashing[Medium],
Line[{{Cos[th], Sin[th]}, {2, Sin[th]}}]}
}],
PlotRange -> 1, ImageSize -> 145, BaseStyle -> {12}, Axes -> True,
Ticks -> {{-1, 1}, {-1, 1}}, PlotRange -> {{-1, 1}, {-1, 1}},

maingraph[th_, showtext_] := Module[{},
Show[Plot[{Sin[x]}, {x, 0.0001, th},
PlotRange -> {{0, 2 Pi}, {-1, 1}},
ImagePadding -> {{30, 12}, {0, 0}}, PlotRangeClipping -> False,
PlotStyle -> Gray,
Ticks -> {Table[{n Pi/4, n Pi/4}, {n, 0, 8}],
Table[n, {n, -1, 1, 1/2}]},
GridLines -> {Table[{n Pi/4, Lighter[Gray, 0.7]}, {n, -2, 8}],
Table[{n, Lighter[Gray, 0.7]}, {n, -1, 1, 1/2}]},
ImageSize -> {Automatic, 145}],
Graphics[{If[showtext,
Rotate[Text[Style[N[Sin[th]], 11], {th + 0.15, Sin[th]/2}],
3 Pi/2, {th + 0.15, Sin[th]/2}], {}],
{Lighter[Red, 0.3], Dashing[Medium],
Line[{{th, Sin[th]}, {-2, Sin[th]}}]},
{Darker[Green, 0.2], Thick, Line[{{0, 0}, {th, 0}}]},
{Red, Thick, Line[{{th, 0}, {th, Sin[th]}}]}
}], AspectRatio -> Automatic, BaseStyle -> {12}]];

DynamicModule[{pt = {Cos[ptctrl], Sin[ptctrl]}, pt2 = {ptctrl, 0}},
Labeled[Grid[{
{LocatorPane[Dynamic[pt,
{(pt = {Cos[pt2[[1]]], Sin[pt2[[1]]]}) &,
(pt = Normalize[#];
pt2 = {If[pt2 == {2 Pi, 0}, 2 Pi,
Mod[ArcTan[#[[1]], #[[2]]], 2 Pi]], 0}) &,
(pt = Normalize[#]; ptctrl = pt2[[1]]) &}],
Dynamic[
anglegraph[
If[pt2 == {2 Pi, 0}, 2 Pi,
Mod[ArcTan[pt[[1]], pt[[2]]], 2 Pi]], showvalue]]],
LocatorPane[Dynamic[pt2,
{(pt2 = {If[pt2 == {2 Pi, 0}, 2 Pi,
Mod[ArcTan[pt[[1]], pt[[2]]], 2 Pi]], 0}) &,
(pt2 = {#[[1]], 0}; pt = {Cos[#[[1]]], Sin[#[[1]]]}) &,
(pt2 = {#[[1]], 0}; ptctrl = #[[1]]) &}],
Dynamic[
maingraph[
If[pt2 == {2 Pi, 0}, 2 Pi,
Mod[ArcTan[pt[[1]], pt[[2]]], 2 Pi]], showvalue]]]}},
Spacings ->
0], {Row[{Style[“Illustrating “, “Label”, 20, Gray],
Text@Style[“sin(“, Red, 24],
Text@Style[“x”, Italic, Bold, Darker[Green, 0.3], 24],
Style[“)”, Red, 24]}],
Style[“”, 10, Lighter[Gray, 0.7], “Label”]}, {{Top,
Left}, {Bottom, Right}}]]
],
{{showvalue, False, “show value”}, {False, True}},
{{ptctrl, Pi/6, “angle”}, 0, 2 Pi},
TrackedSymbols :> {showvalue, ptctrl}]



 var WolframCDF = WolframCDF || new cdf_plugin(); WolframCDF.addCDFObject("CDF_71e079c8ee4019cbe432280f840ca7178736f08b", "http://www.sakngoi.com/wp-content/uploads/2011/09/sine.cdf", 320, 415); 



ส่วนอันนี้เป็นตัวอย่างที่เราสามารถลากเขียนกราฟได้ครับ

Manipulate[
points = If[Last[points] == p, points, points~Join~{p}];
ListLinePlot[points, PlotRange -> {{-100, 100}, {-100, 100}},
PlotLabel -> (“จำนวนจุด ” <> ToString@Length[points])],
Button[“Clear”, clear = True; points = {{0, 0}};
p = {0, 0};], {{p, {0, 0}}, Locator},
Initialization :> {
points = {{0, 0}};
clear = False;
}
]



 var WolframCDF = WolframCDF || new cdf_plugin(); WolframCDF.addCDFObject("CDF_978520ab8c0a68b662eab5f7158436bc3e008b4f", "http://www.sakngoi.com/wp-content/uploads/2013/10/waadroob.cdf", 320, 415); 



Manipulate[Quiet@DynamicModule[{g=9.81,m=1.,deqns,xsol,ysol,times,periods,periodNumber},

deqns={(*parabolic*){a (1+x[t]^2) Derivative[2][x][t]==-\[Mu] Derivative[1][x][t]/m-x[t] (g+2 a Derivative[1][x][t]^2)},(*elliptic*){\[Mu] Derivative[1][x][t]/m+Derivative[2][x][t]==x[t] (-g Sqrt[1-x[t]^2]/a+Derivative[1][x][t]^2/(-1+x[t]^2))}};
{xsol,times}=Reap@NDSolveValue[{deqns[[i]],x[0]==.999,Derivative[1][x][0]==0,WhenEvent[x[t]==0,Sow[t]]},x,{t,tMax}];
ysol[t_]:={(*parabolic path*)a (xsol[t]^2-1),(*elliptic path*)-a Sqrt[1-xsol[t]^2]}[[i]];
periodNumber=Position[times[[1]],Nearest[times[[1]],tt][[1]]][[1,1]]-1;
periods=Differences[times[[1]]];
Column[{Row[{“swing# “,periodNumber,”: “,If[periodNumber!=0,periods[[periodNumber]],0],” seconds”}],Dynamic@Show[{Plot[{a (x^2-1),-a Sqrt[1-x^2]}[[i]],{x,-1,1},PlotStyle->Thick],Graphics[{Red,Disk[.98 {xsol[tt],ysol[tt]},.02]}]},AspectRatio->Automatic,ImageSize->400,PlotRange->{{-1,1},{-1.25,0.05}}]}]],{{i,1,”path”},{1->”parabolic”,2->”elliptic”},Setter},{{a,1},.5,1.25,.001,Appearance->”Labeled”},{{\[Mu],.15},0,.25,.01,Appearance->”Labeled”},Control[{{tt,0},0,.5 tMax,.01,Trigger,AnimationRate->1}],{{tMax,100},None}]



 var WolframCDF = WolframCDF || new cdf_plugin(); WolframCDF.addCDFObject("CDF_b53a1db452cceb16d93903c091beaf1857949f6a", "http://www.sakngoi.com/wp-content/uploads/2013/11/rolling.cdf", 425, 415); 



## P. falciparum in a patient during treatment with artesunate

หลังจากที่ดูของคนอื่นมานาน ก็เลยลองทำส่งบ้าง 🙂

มันเป็นโมเดลที่จำลองว่าปริมาณของเชื้อมาลาเรียในร่างกายของคนไข้จะเปลี่ยนไปอย่างไรระหว่างการรักษาด้วยยาอาทีซูเนท

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

## มาใช้ 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$}

]



 var WolframCDF = WolframCDF || new cdf_plugin(); WolframCDF.addCDFObject("CDF_dc81d11a3e801aeebf44eccc21e6ae4443cbe094", "http://slphyx.sakngoi.com/temp/sin.cdf", 410, 310); 



ส่วนอันนี้ก็เป็นการใช้ 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”}]



 var WolframCDF = WolframCDF || new cdf_plugin(); WolframCDF.addCDFObject("CDF_275db15031badfc6e943b34388144c60de01e98c", "http://slphyx.sakngoi.com/temp/cospolar.cdf", 320, 415); 



หรือจะลอง 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”}}]



 var WolframCDF = WolframCDF || new cdf_plugin(); WolframCDF.addCDFObject("CDF_f86e4b8e34ff6c8bf70f873ef8bb8ecedd3470c5", "http://slphyx.sakngoi.com/temp/elementcdf.cdf", 410, 450); 



ส่วนอันนี้ก็เป็นการเอาไปประยุกต์กับปัญหาฟิสิกส์ที่ว่าจะต้องยิงวัตถุจากจุดยอดของทรงกลมรัศมีขนาดหนึ่งด้วยมุมและอัตราเร็วเท่าใดวัตถุนั้นจึงจะเฉียดผิวของทรงกลมนี้พอดี(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”}]



 var WolframCDF = WolframCDF || new cdf_plugin(); WolframCDF.addCDFObject("CDF_7ee22d039f126018406b6cf991a016f566a214bd", "http://slphyx.sakngoi.com/temp/projectile.cdf", 410, 450); 



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

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



 var WolframCDF = WolframCDF || new cdf_plugin(); WolframCDF.addCDFObject("CDF_7a3027bc831723b0caa5d6f4c2efd3bc0932985f", "http://www.sakngoi.com/wp-content/uploads/2013/04/pnas.cdf", 606, 559); 



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

ผมจะมาเล่าให้ฟังครับว่าเราจะใช้โปรแกรมที่ชื่อ Mathematica ในการเรียนการสอนได้อย่างไร ด้วยคำสั่ง Manipulate แต่ก่อนจะไปถึงตอนนั้น ผมขอแนะนำว่าคนที่ไม่รู้ว่า Mathematica คืออะไรแล้วมันใช้ทำอะไรได้บ้างลองดูจากวีดีโอแนะนำนี้ดูครับ  QuickTour ส่วนใครที่กำลังเริ่มต้นเรียนรู้ใช้งานสามารถอ่านคำแนะนำการใช้งานเบื้องต้นของท่านอ.พงศกร สายเพ็ชร์ ได้ครับหรือจะไปพูดคุยสอบถามการใช้งาน Mathematica ได้ที่ http://mpec.sc.mahidol.ac.th/forums/ ครับ

ตัวอย่างจากการใช้คำสั่ง Manipulate ในการสร้างapplicationแบบต่างๆมีตัวอย่างมากมายที่ http://demonstrations.wolfram.com/ ต้องติดตั้ง Wolfram CDF Player ก่อนนะครับถึงจะเปิดดูพวกตัวอย่างนั้นได้  เจ้าตัว CDF Player นี้เองที่เราจะเปิดอ่านไฟล์พวก .nb หรือ .cdf ได้แต่จะไม่สามารถแก้ไขได้ครับ ต้องใช้ Mathematica อย่างเดียวครับ ถ้าจะสร้างหรือแก้ไฟล์ .nb  ส่วนไฟล์ .cdf นั้น Mathematica เปิดดูได้อย่างเดียวครับจะไม่สามารถแก้ไขตัว application ได้ครับ

ต่อตอนสองครับ(http://www.sakngoi.com/?p=290)