แสดงผลลัพธ์จาก wolfram script แบบกราฟฟิค

ตั้งแต่ Wolfram Engine สามารถใช้ได้ฟรีนี่ทำให้ผมมีอะไรได้ลองเล่นเยอะเลย ถึงแม้จะมี Wolfram Mathematica อยู่แล้วนะเนี้ย

ตัว Wolfram Engine ที่เราสามารถโหลดมาใช้ได้ฟรี(http://www.wolfram.com/engine/) นี้จะเป็นแบบ text mode ไม่มี UI มาให้ ก็อาจจะทำให้ลำบากหน่อยถ้าอยากจะดูผลลัพธ์ที่เป็นกราฟฟิค เพราะอาจต้อง Export เป็นไฟล์ไปก่อนแล้วค่อยเปิดดู แต่ถ้าอยากจะให้ตัว Wolfram Engine มันแสดงผลกราฟฟิคให้ดูเราก็สามารถที่จะใช้ตัวแพ็กเกจ JavaGraphics ช่วยได้ครับวิธีก็เพียงโหลด

<<JavaGraphics`

ก่อนที่จะให้มันแสดงผลลัพธ์กราฟฟิคของคำสั่งที่ต้องการ ตัวอย่างครับ

หรือถ้าใครสนใจจะใช้ผ่าน UI อย่าง jupyter ก็ลองดูที่ projects ตามนี้ดูนะครับ

สวนตัวแนะนำ WolframLanguageForJupyter ครับ

วิธการติดตั้งที่อยากแนะนำก็คือลง Anaconda พอลงเสร็จก็รัน Anaconda prompt แล้วรัน wolframscript

จากนั้นก็ติดตั้ง WolframLanguageForJupyter ตามวิธีที่เขาแนะนำไว้ครับ

เขียนcodeแก้ปัญหาจากpantipเล่น

https://pantip.com/topic/38221485/

code สำหรับปัญหานี้

https://www.wolframcloud.com/objects/sompob/test/pantip_01Nov18.nb

Manipulate[
Show[
  Graphics[{EdgeForm[Pink], FaceForm[Blue], 
    Rectangle[{1 - Cos[-15 Degree], 0}, {x, 
      x - (1 - Cos[-15 Degree])}]}],
  Graphics[{EdgeForm[LightBlue], FaceForm[Black], 
    Rotate[Rectangle[{0, 0}], -15 Degree, {1, 0}],
    PlotRange -> {{-2, 2}, {-2, 2}} }],
  Graphics[
   Text["Area of the Big Square:" <> 
     ToString[(x - (1. - Cos[15 Degree]))^2/(0.5*Sin[15 Degree]*
         Cos[15 Degree])], {0.25, 1.5}]]
   ],
 {{x, 1.259, "side"}, 0.1, 2, 0.001}
 ]

 

 

Mathematica package รวบรวมคำสั่งเมีย

ศรีภรรยาผมขอบมีคำถามเกี่ยวกับคอมพิวเตอร์แปลกๆมาถามเสมอ เช่นไอ้โน้น ไอ้นี่ทำไง สุดท้ายผมก็ต้องทำอยู่ดีขัดคำสั่งไม่ได้ โดยแต่ล่ะคำถามก็จะไปจบที่ผมต้องเขียนโปรแกรมเพื่อแก้ปัญหาให้ ซึ่งส่วนใหญ่ผมจะเขียนโดยใช้ภาษา Wolfram ครับ โดยทุกวันนี้เริ่มมีจำนวนคำสั่งมากขึ้นเรื่อย ตอนนี้ก็น่าจะประมาณ 20 คำสั่งได้ ผมก็เลยคิดว่าถ้าเช่นนั้นผมก็เอามารวมเป็น package เลยแล้วกันเผื่อว่าใครอยากจะใช้ด้วย โดยคำสั่งส่วนมากจะเกี่ยวกับปัญหาทางด้าน bioinformatics ครับ ซึ่งมันอาจจะมี package หรือโปรแกรมภาษาอื่นทำในสิ่งที่ผมเขียนไว้นี้ไว้หมดแล้วก็ได้ แต่ผมไม่ได้เช็คนะครับเพราะไม่มีเวลาค้นดูและเวลามันจำกัดครับ ช้าไม่ได้เพราะผมอาจถึงแก่ชีวิตได้

ใครสนใจลองดูที่ https://github.com/slphyx/Nao ผมจะทยอยเพิ่มจำนวนคำสั่งเรื่อยๆครับ

 

ปัญหาเข็มของบึฟฟองBuffon’s Needle

เห็นมีคนพูดถึงปัญหานี้ในกลุ่มผู้ใช้ R ของไทยเราเลยเอามาเขียนโปรแกรมทำบ้างแต่ใช้ภาษา Wolfram แทนเพราะจะเขียนได้สั้นมาก

โปรแกรมที่เขียนนี้จะวาดเส้นแนวนอนที่มีระยะห่างตามที่กำหนดและก็สุ่มวางเข็มตามขนาดและจำนวนที่ต้องการลงไปแล้วนับดูว่าที่กี่เล่มที่ทับเส้น จากนั้นก็คำนวณประมาณค่า pi จากสูตรที่เขียนไว้ที่ https://en.wikipedia.org/wiki/Buffon%27s_needle ซึ่งก็คือ

โดย l คือความยาวเข็ม, n  คือจำนวนเข็ม, t คือระยะห่างระหว่างเส้นบรรทัด และ h คือจำนวนเข็มที่ทับเส้นบรรทัด

สำหรับวาดเส้นของเข็มและเส้นบรรทัด

genNeedle[{x_, y_}, \[Theta]_, len_] := 
 Line[{{(x + 0.5 len Cos[\[Theta]]), (y + 0.5 Sin[\[Theta]])}, {(x - 
      0.5 len Cos[\[Theta]]), (y - 0.5 len Sin[\[Theta]])}}]

horizontalLine[diff_, len_, {x0_, y0_}, n_] := 
 Table[Line[{{x0, y0 + (i diff)}, {len, y0 + (i diff)}}], {i, n}]

สำหรับประมาณค่า pi

estimatedPi[needlelength_, nneedles_, linespace_, ncross_] := 
 2.*needlelength*nneedles/(linespace*ncross)

สำหรับ simulation

run[nl_, nfl_, ll_, diff_] := 
  Module[{fls, ls, outls, pnts, ncross}, 
   fls = horizontalLine[diff, 10, {0, 0}, nfl];
   ls = Table[
     genNeedle[{RandomReal[{0, 10}], RandomReal[{0, nfl*diff}]}, 
      RandomReal[\[Pi]], ll], {nl}];
   outls = 
    Table[Solve[{x, y} \[Element] RegionIntersection[fls[[i]], #], {x,
          y}] & /@ ls, {i, Length@fls}];
   pnts = Point[{x, y}] /. Flatten[outls, 2];
   ncross = Length@Flatten[outls, 2];
   Graphics[{fls, ls, Red, PointSize[Medium], 
     If[Length@Flatten[outls, 2] > 0, pnts]}, 
    PlotLabel -> 
     Style["จำนวนเข็มที่ทับเส้น:" <> ToString@ncross <> 
       " \[Pi]\[TildeTilde]" <> 
       ToString@estimatedPi[ll, nl, diff, ncross], FontSize -> 20, 
      Bold]]];

ทดลองเล่นดู โดยใช้เข็ม 100 เล่ม และกำหนดให้มีเส้นบรรทัด 10 เส้น โดยระยะห่างระหว่างบรรทัดกับความยาวเข็มเท่ากัน

nlines = 10;
nneedles = 100;
ndlength = 1;
linespace = 1;
run[nneedles, nlines, ndlength, linespace]

สำหรับmathematica notebook สามารถdownloadได้จากhttps://github.com/slphyx/Buffon-s-Needle

ตัวอย่างการใช้ InputField ใน Manipulate

ตัวอย่างการใช้ InputField ใน Manipulate ของ Mathematica ครับ

ใน Manipulate นอกเหนือจาก พวก Slider และ Menu ต่าง ๆแล้ว เราสามารถที่จะใช้ InputField เพื่อรับค่าจาก users ได้โดยตรงครับ รายละเอียดการใช้งานต่างๆ สามารถดูเพิ่มเติมได้ที่ http://reference.wolfram.com/language/ref/InputField.html ครับ