Categories
Mathematica

รายงานผลเลือกตั้งด้วย Mathematica

พอดีผมเห็นในทีวีหลายช่องมีการรายงานผลเลือกตั้งด้วยกราฟสวยๆเยอะมากก็คิดว่าน่าจะมาลองทำให้ดูครับว่า Mathematica ก็ทำได้ 🙂

เร็วด้วยสิ ข้อมูลที่จะเอามาเขียนกราฟผมก็ไปดูดเอามาจากเวบของคณะกรรมการการเลือกตั้งครับ

Mathematica สามารถแสดงแผนภาพหรือกราฟได้หลายแบบครับ ลองดูเพิ่มเติมได้ที่ http://reference.wolfram.com/mathematica/guide/ChartingAndInformationVisualization.html

ผมเลือกแผนภาพวงกลมครับ ซึ่งผลที่ได้ก็ตามที่แสดงด้านล่างนี้ครับ

วิธีการที่ผมทำก็คืออ่านข้อมูลจากเวบกกต http://ect.thaigov.net/election2554/report_partylist.html ด้วยคำสั่ง Import ซึ่งข้อมูลที่อ่านเข้ามาจะเป็น list ของแต่ล่ะบรรทัด ซึ่งผมดูไว้แล้วว่าข้อมูลที่จะเอามาใช้จะเริ่มที่บรรทัด 14 ถึง 53 ของข้อมูลในหน้าเวบนั้น

data=Import[“http://ect.thaigov.net/election2554/report_partylist.html”,”Data”][[14;; 53]];

ถ้าเราดูห้าบันทัดแรกของข้อมูลที่อ่านเข้ามาก็จะได้ว่า
data[[1;; 5]]
{{“หมายเลข 1″, ” พรรค เพื่อไทย”, “11,655,382 คะแนน”}, {“หมายเลข 2″,
” พรรค ชาติพัฒนาเพื่อแผ่นดิน”, “353,362 คะแนน”}, {“หมายเลข 3″,
” พรรค ประชาธิปไตยใหม่”, “103,176 คะแนน”}, {“หมายเลข 4″,
” พรรค ประชากรไทย”, “28,730 คะแนน”}, {“หมายเลข 5″,
” พรรค รักประเทศไทย”, “792,989 คะแนน”}}

จะเห็นได้ว่าข้อมูลทั้งหมดที่อ่านเข้ามาจะเป็นแบบ String ดังนั้นถ้าจะเอาข้อมูลไปใช้ในการทำแผนภูมิหรือกราฟก็ต้องมีการปรับเปลี่ยนกันหน่อย ซึ่งผมก็ได้เขียนคำสั่งง่ายๆสำหรับเปลี่ยนข้อมูลไปเป็นแบบที่ต้องการ

ber[dat_]≔Module[{tmp},tmp=Characters@dat;ToExpression@StringJoin@tmp[[9;;Length@tmp]]];
เป็นคำสั่งที่กะเอาไว้สำหรับดึงตัวแลขของหมายเลขแต่ล่ะพรรคออกมา

party[dat_] := Module[{tmp},
tmp = Characters@dat;
tmp[[6 ;; Length@tmp]] // StringJoin
];
ก็เป็นคำสั่งสำหรับดึงเอาชื่อพรรคออกมา

score[dat_] := Module[{tmp}, tmp = Characters[dat];
ToExpression@StringJoin@Select[#, # != “,” &] &@
Drop[tmp, {Length@tmp – 5, Length@tmp}]
];

ส่วนอันนี้ก็เป็นคำสั่งสำหรับดึงเอาคะแนนออกมา

เวลาจะเอาข้อมูลไปใช้ ผมก็ต้องสร้างข้อมูลขึ้นหรือจัดให้อยู่ในรูปแบบที่เราต้องการ ซึ่งในตัวอย่างผมก็จัดข้อมูลเป็นคู่ของชื่อพรรคกับคะแนนที่ได้
alldat = {party@#[[2]], score@#[[3]]} & /@ data;
อันนี้ตัวอย่างของ alldat ห้าอันแรก
alldat[[1 ;; 5]]
{{” เพื่อไทย”, 11655382}, {” ชาติพัฒนาเพื่อแผ่นดิน”,
353362}, {” ประชาธิปไตยใหม่”, 103176}, {” ประชากรไทย”,
28730}, {” รักประเทศไทย”, 792989}}

แต่ก่อนจะเอาไปใช้ผมก็ให้มันมีการเรียงลำดับจากมากไปน้อยก่อนด้วยคำสั่ง Sort

dat4plot = Sort[alldat, #1[[2]] > #2[[2]] &];

ซึ่งในรูปแผนภูมิวงกลมนั้นผมให้มันแสดงข้อมูลเป็นเปอร์เซ็นต์โดยแสดงเฉพาะพรรคที่ได้คะแนนมากกว่า 0.5%

PieChart3D[
Select[100. dat4plot[[All, 2]]/N@Total@(dat4plot[[All, 2]]), # >
0.5 &], SectorOrigin -> {Automatic, 1},
ChartLegends -> {dat4plot[[All, 1]]}]

Categories
Mathematica Uncategorized

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

Categories
Mathematica

DateListPlot

มีคนถามมาว่ามีข้อมูลตามมด้านล่างนี้จะเอาไป plot ได้ยังไง

20110508000128    1
20110508000315    5
…………. .
20110508235824    x

ซึ่งใน column แรกข้อมูลคือวันที่และเวลาที่อยู่ติดกัน และ column ที่สองก็คือข้อมูลจากการวัดอะไรสักอย่าง

ผมก็บอกคนที่ถามไปว่าไม่ยาก:)  ใน Mathematica ก็น่าจะทำได้

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

function ชื่อ DateListPlot ครับ ดูรายละเอียดได้ที่ http://reference.wolfram.com/mathematica/ref/DateListPlot.html

อันนี้เป็น function ที่ผมเขียนขึ้นมาใช้ในการเปลี่ยนรูปแบบของข้อมูลครับ

convertdata[yourdatapoint_] := Module[
{output, ls, dat1, dat2, year, month, date, hour, minute, second},
dat1 = yourdatapoint[[1]];
dat2 = yourdatapoint[[2]];
ls = Characters@ToString@dat1;
year = ToExpression@StringJoin@ls[[1 ;; 4]];
month = ToExpression@StringJoin@ls[[5 ;; 6]];
date = ToExpression@StringJoin@ls[[7 ;; 8]];
hour = ToExpression@StringJoin@ls[[9 ;; 10]];
minute = ToExpression@StringJoin@ls[[11 ;; 12]];
second = ToExpression@StringJoin@ls[[13 ;; 14]];
output = {{year, month, date, hour, minute, second}, dat2};
output
];

หรือจะเขียนแบบนี้โดยใช้ StringTake ก็ได้เหมือนกันครับ

convertdata[yourdatapoint_] :=
Module[{output, ls, dat1, dat2, year, month, date, hour, minute,
second},
dat1 = yourdatapoint[[1]];
dat2 = yourdatapoint[[2]];
ls = ToString@dat1;
{year, month, date, hour, minute, second} =
ToExpression /@
StringTake[
ls, {{1, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}}];
output = {{year, month, date, hour, minute, second}, dat2};
output
];

เอาไปใช้กับข้อมูลก็สามารถทำได้แบบนี้ครับ

data = {{20110508000128, 1}, {20110508000315, 5}, {20110508000411,
10}, {20110508001130, 20}};

DateListPlot[convertdata2 /@dat a, Joined -> True]

 

Categories
Mathematica Uncategorized

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

จากที่มีคนถามปัญหาที่ 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

 

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

Categories
Mathematica

switching between notebooks in Mathematica

ถ้าจะสวิชระหว่าง notebooks ใน Mathematica กด Ctrl+F6

shortcut อื่นๆดูได้ที่
http://reference.wolfram.com/mathematica/tutorial/KeyboardShortcutListing.html

Categories
Mathematica

การใส่ไฟล์ CDF ใน HTML

เครื่องที่จะเปิดดูไฟล์ต้องลง CDF player ก่อนนะครับ

ถ้าจะ embed ไฟล์ cdf ลงใน html สามารถทำได้ตามนี้ครับ

<embed src="ไฟล์.cdf" width="588" height="380">

หรือ

<object classid="clsid:612AB921-E294-41AA-8E98-87E7E057EF33"
width="500" height="300"
type="application/vnd.wolfram.cdf.text">
<param name="src" value="ไฟล์.cdf">
<embed width="500" height="300" src="ไฟล์.cdf"
type="application/vnd.wolfram.cdf.text">
</object>

หรือจะใช้ script

<script type="text/javascript" src="http://www.wolfram.com
/cdf-player/plugin/v2.1/cdfplugin.js"></script>
<script type="text/javascript">
	var cdf = new cdfplugin();
	cdf.embed('/path/to/ไฟล์.cdf', width, height);
</script>

ที่มา

http://wolfram.com/cdf/adopting-cdf/deploying-cdf/web-delivery.html

 

####

เสียดายที่ CDF ใช้ไม่ได้กับ browser ตัวใหม่ๆแล้ว ทาง Wolfram เองก็แนะนำให้ใช้กับ Wolframcloud แทน ดูเพิ่มเติมได้ที่นี่ครับ http://www.wolfram.com/cdf/adopting-cdf/deploying-cdf/web-delivery-cloud.html

Categories
IT Mathematica Uncategorized

MathLink แบบง่ายๆ

เดี๋ยวมาเล่าให้ฟังครับ เขียนหัวข้อไว้ก่อน 😛

MathLink

Categories
IT Mathematica

มาใช้ 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)

Categories
Mathematica

การใส่สีพื้นหลังของกราฟจากคำสั่ง Plot

การใส่สีพื้นหลังของกราฟจากคำสั่ง Plot มีหลายวิธีครับ ด้านล่างนี้เป็นตัวอย่างครับ

Plot[Sin[x], {x, 0, 4 \[Pi]}, PlotStyle -> Red, Background -> Gray]

 

Graphics[Inset[
Plot[Sin[x], {x, 0, 4 \[Pi]}, PlotStyle -> White,
Frame -> {True, True, False, False},
FrameStyle -> Directive[White, 12]]], Background -> Gray]

 

bg = Graphics[
Polygon[{{0, 0}, {1, 0}, {1, 1}, {0, 1}},
VertexColors -> {Black, Black, White, White}],
AspectRatio -> Full];
Plot[Sin[x], {x, 0, 4 \[Pi]}, PlotStyle -> Red,
Prolog -> Inset[bg, Scaled[{0, 0}], Scaled[{0, 0}], Scaled[{1, 1}]]]

Categories
Mathematica

เขียน Mathematica package แบบง่ายๆ

มาลองเขียน Mathematica package แบบง่ายๆกันครับ

Mathematica package คืออะไร Mathematica package ก็คือชุดคำสั่งหรือโปรแกรมที่ถูกเขียนขึ้นเพื่อใช้ในการคำนวณเฉพาะด้าน ซึ่งจะมีสกุล .m

โดยถ้าเปิดไฟล์ .m ด้วย text editor อย่างเช่น notepad หรือ Mathematica เองเราจะเห็น code ข้างในมีคำสั่งหลักๆดังนี้ เช่น

BeginPackage[ “ชื่อpackage`”]
คำสั่ง1::usage = “คำสั่ง1[ x] คำอธิบายการใช้คำสั่ง1”
Begin[ “Private`”]
คำสั่ง1[ x_] :=  ….
End[]
EndPackage[]

การเรียกใช้งาน package ใน Mathematica เพียงใช้คำสั่ง Get หรือเครื่องหมาย << เช่น ถ้าpackage เราชื่อ MyPackage ก็เพียงพิมพ์
Get[MyPackage`]
หรือ
<<MyPackage`

ตัวอย่าง Package ชื่อ MyPackage ซึ่งมีคำสั่งอยู่ สองคำสั่งคือ fun1[x ] สำหรับหาค่า x^3 กับ fun2[x,y] สำหรับหาค่า sin(x)*cos(y)

BeginPackage[ “MyPackage`”]

fun1::usage = “fun1[ x] calculates x^3 ”
fun2::usage = “fun2[ x,y] calculates sin(x)*cos(y)”

Begin[ “Private`”]

fun1[ x_] := x^3

fun2[x_,y_]:=Sin[x ] * Cos[y]

End[]
EndPackage[]

ในการทดลองเขียน package ก็เพียงเปิด Mathematica แล้วพิมพ์ Code ของ package
ลงไปใน notebook แล้ว save เป็นแบบ Mathematica package ดูขั้นตอนตามรูปครับ

ในการเรียกใช้งาน package ก่อนอื่นเราต้องทำการบอก Mathematica ก่อนว่า package (MyPackage.m) ของเราอยู่ที่ไหน
ในตัวอย่างนี้สมมุติว่า MyPackage.m อยู่ที่ C:/TEMP ซึ่งเราสามารถบอก Mathematica
โดยใช้คำสั่ง AppendTo เพื่อเพิ่ม “C:/TEMP” เข้าไปในตัวแปร $Path
ซึ่งเป็นตัวแปรที่เก็บ Path หลักๆที่ Mathematica จะใช้ในการค้นหา Package ต่างๆ
หรือจะใช้ Needs[“MyPackage`”,”C:/TEMP/MyPacjage.m”] ในการเรียกใช้งานก็ได้ครับ