Categories
Mathematica

เรียก compiled function จาก compiled function

โดยปกติ Mathematica หรือภาษา Wolfram จะมีปัญหากับการเรียก function ที่สร้างจาก Compile ใน function ที่จะสร้างจาก Compile อีกทีได้ (ส่วนใหญ่เป็นเรื่องที่เกี่ยวกับว่า Funcions ไหนที่มัน compile ได้หรือไม่ได้) แต่ใน version 12 นี้เราสามารถที่จะทำแบบนั้นได้ ถ้า function เหล่านั้นถูก compile ด้วยคำสั่ง FunctionCompile ซึ่งผมมองว่ามันสะดวกอย่างมาก และที่สำคัญเราสามารถที่จะ export สร้างเป็น library ไฟล์ได้ด้วย โดยคำสั่ง FunctionCompileExport สกุลไฟล์ที่สร้างได้ก็ได้แก่

ตัวอย่างการเรียกใช้ compiled function ใน compiled function อีกที ก็สมมุติให้ผมมี function สำหรับทำ bisection เพื่อหาค่าที่ทำให้ function ที่สนใจเป็น 0 หรือใกล้ 0 มากๆ

BisectionMethod = FunctionCompile[
    Function[
        {Typed[f, {"Real64"} -> "Real64"], Typed[lim0, "Real64"], Typed[lim1, "Real64"]},
      Module[{Maxiter = 100, tol = 10.^-8, iter = 0, x0 = lim0, x1 = lim1, mid = 0.0, f0, f1, fmid},
      f0 = f[x0]; 
      f1 = f[x1];
            While[Abs[x1 - x0] >= tol && iter++ < Maxiter,
                mid = (x1 + x0)/2.;
                fmid = f[mid];
                If[Xor[fmid > 0, f0 > 0],
                    x1 = mid; f1 = fmid,
                    x0 = mid; f0 = fmid]];
               mid]]]

โดยfunction ที่ผมจะหา root คือ f(x) = sin(x)+exp(x)

f = FunctionCompile[Function[Typed[arg, "Real64"], Sin[arg] + Exp[arg]]]

จะเห็นได้ว่าทั้ง BisectionMethod และ f ถูกสร้างจาก FunctionCompile แต่ f จะถูกเรียกเข้าไปใช้ใน BisectionMethod อีกที

BisectionMethod[f, -1.0, 1.0]-FindRoot[Sin[x] + Exp[x], {x, -1}][[1, 2]]
(* -5.18667*10^-11 *)
Categories
Mathematica

เรื่องการเรียกใช้ package ใน package อีกทีของภาษา Wolfram

พอดีกำลังรับงานพัฒนาโมเดลตัวหนึ่งด้วยภาษา Wolfram แล้วเจอปัญหาเรื่องการเรียกใช้ Package ในอีก Package หนึ่ง code ที่เขาส่งมาให้ช่วยดูให้มันมีการเรียกใช้ package ตั้งแต่คำสั่ง BeginPackage เช่น

BeginPackage[ "Package`", {"Package1`", "Package2`"}]
  ...

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

ผมก็เลยเปลี่ยนวิธีการเรียก packages ด้วย Needs ไปใช้วิธีเรียกทีล่ะตัวหลังคำสั่ง BeginPackage แทน เช่น

BeginPackage[ "Package`"]
  Needs[ "Package1`"]
  Needs[ "Package2`"]
  ...

ด้วยวิธีนี้ตัว คำสั่งจาก package1 หรือ package2 จะถูกเรียกใช้ได้ภายใน package แต่ด้านนอก package จะเรียกไม่ได้ พูดง่ายๆคือไม่มีผลอะไรกับตัวแปรนอก package

Categories
Mathematica

Wolfram animation in Jupyter

หลังๆมานี้ตั้งแต่ Wolfram Engine มันใช้ได้ฟรี ผมก็มักจะแนะนำให้คนโน่นคนนี้ใช้มันอยู่เรื่อยๆ หลายคนที่ก็ชอบ ส่วนอีกหลายคนก็ยังรู้สึกอึดอัดเพราะมันยังไม่ชินหรือไม่ก็เพราะ UI มันไม่มีไม่น่าใช้ ยิ่งแนะนำให้ใช้กับ Jupyter ยิ่งหนักเลยเพราะยังทำ Animation ไม่ได้หรือพวก 3D ทั้งหลายก็หมุนไม่ได้ zoom ก็ไม่ได้ ยิ่งคำสั่งพวก Manipulate ที่ถือได้ว่าเป็นสิ่งหลักที่ถูกใช้ในหลายๆงานก็ใช้ไม่ได้เลย

ส่วนตัวผมก็ยังถือว่ามันไม่ได้แย่ขนาดนั้น เพราะทางWolframเองก็คงเข้าใจว่าถ้าเอาWolfram engine ไปใช้โดยไม่มีUI ที่เหมือน Mathematica notebook คนคงมาใช้งานมันน้อยแน่ๆ เขาเลยเอา WolframPlayer ติดมาด้วยกับ Wolfram engine ซึ่งนั่นหมายความว่าผู้ใช้ก็ต้อง Export สิ่งที่ต้องการอย่าง 3D, Animation อื่น ๆมาอยู่ในรูปแบบ notebook (.nb) หรือ .cdf แล้วเปิดในตัว player แทน

ซึ่งถ้าใช้ตัว Jupyter กับ Wolfram ก็สามารถที่จใช้คำสั่ง RunProcess เรียกตัว Player มาเปิดไฟล์ที่ Exportได้ อย่างเช่น

outfile=FileNameJoin[{Directory[],outputfilename}];

RunProcess[{"C:\Program Files\Wolfram Research\Wolfram Engine\12.0\SystemFiles\FrontEnd\Binaries\Windows-x86-64\WolframPlayer.exe",outfile}]
Categories
Mathematica

อ่านตัวเลขจากภาพ

มีคนถามคำถามนี้ใน Facebook ของสมาคมโปรแกรมเมอร์ไทย

คำถามนี้สามารถทำได้ง่ายๆด้วยภาษา Wolfram ครับ โดยใช้คำสั่ง TextRecognize ตามนี้ครับ

https://www.wolframcloud.com/obj/sompob/Published/demo_3Oct19.nb
Categories
Mathematica

แสดงผลลัพธ์จาก 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 ตามวิธีที่เขาแนะนำไว้ครับ

Categories
Mathematica

เขียน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}
 ]

 

 

Categories
Mathematica

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

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

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

 

Categories
Mathematica

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

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

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

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

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


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

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[π], ll], {nl}];
outls =
Table[Solve[{x, y} ∈ 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 <>
" π≈" <>
ToString@estimatedPi[ll, nl, diff, ncross], FontSize -> 20,
Bold]]];

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


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

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

Categories
Mathematica

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

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

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

 

 

Categories
Mathematica

three lectures of wolfram language by prof Richard Gaylord

part 1

part 2

part 3