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

เรื่อง plane geometry ใน Mathematica 12

Wolfram Mathematica 12 ที่เพิ่งจะเปิดตัวไปมีความสามารถเพิ่มขึ้นมาเยอะพอสมควรเลย และหนึ่งจากหลายความสามารถที่เพิ่มเข้ามานี้ที่ผมชอบมากก็คือความสามารถในเรื่องเรขาคณิตที่เรียกว่า Synthetic Geometry

เจ้า Synthetic Geometry ก็เป็นสาขาที่ศึกษาเรขาคณิตที่หาข้อสรุปจากการใช้เรื่องสัจพจน์หรือข้อความคาดการณ์ต่างๆเป็นเครื่องมือหลักในการแก้ปัญหา ลองดูความหมายเพิ่มเติมที่ https://en.wikipedia.org/wiki/Synthetic_geometry  นะครับ

ใน Mathematica 12 นี้เราสามารถที่จะสร้างไดอะแกรมของปัญหาได้จากคำสั่ง GeometricScene เช่น

ถ้ามีสามเหลี่ยมที่มีมุมทั้งสามมุมอยู่ที่ จุด (0,0),(1,0),(0,1) หรือสามเหลี่ยมมุมฉากที่มีฐานและความสูงคือ 1 หน่วย เราก็สามารถสร้างได้แบบนี้ครับ

จากคำสั่งด้านบน GeometricScene เราเพียงแต่บอกว่าเรามีจุดอะไรบ้าง ซึ่งในที่นี้ก็คือจุด a,b,c ที่อยู่ที่ {0,0},{1,0},{0,1} ตามลำดับ และก็บอกว่าให้สร้าง สามเหลี่ยมโดยใช้จุดที่กำหนดไว้

จากนั้นผมทดลองหาพื้นที่ของสามเหลี่ยมนี้ ซึ่งก็ผลลัพธ์ที่ได้ก็คือ 1/2

มาลองทำอะไรที่มันดูซับซ้อนขึ้นมาอีกหน่อยครับ  สมมุติว่าผมต้องการหาพื้นที่ของสามเหลี่ยมที่มีเหลี่ยมทั้งสามที่จุด k,l,n

และมีวงกลมที่ผ่านจุดทั้งสามนี้

โดยผมกำหนดให้ว่าระยะระหว่างจุด k และ n  คือ 3 หน่วย และมีจุด m อีก หนึ่งจุดที่อยู่ด้านนอกวงกลม โดยกำหนดให้ มุมที่ทำระหว่าง จุด l,m,n เท่ากับ 120 องศา และแขนของมุมทั้งสอง (เส้นตรงจากจุด m ไป n กับ เส้นตรงจาก จุด m ไป l) นี้ต้องเป็นเส้นสัมผัสวงกลม และก็ให้ เส้นตรง จากจุด m ไป l กับเส้นตรง จุด k n นี้ขนานกัน  555 ดูจะสับสนซับซ้อนอย่างค่อยเป็นค่อยไปนะครับ แต่ถ้าเห็น code และจะเข้าใจดีขึ้นครับ

สังเกตุนะครับว่าเราไม่ได้ระบุพิกัดของจุดใดๆเลย หลังจากที่อธิบายไดอะแกรมของเราเรียบร้อยแล้วผ่านคำสั่ง GeometricScene แล้วเราก็ให้ Mathematica สร้างภาพออกมาโดยใช้คำสั่ง RandomInstance ซึ่งมันก็จะสุ่มจุดขึ้นมาและวาดตามเงื่อนไขที่เรากำหนดไป ซึ่งถ้าเรารัน คำสั่ง RandomInstance และไม่กำหนด RandomSeeding ภาพวาดที่ออกมามันจะไม่ซ้ำกันเลยครับ ดังนั้นเราสามารถกำหนดหรือ fix ภาพ ได้จากการกำหนดค่า RandomSeeding ครับ

จากภาพที่วาดออกมาเราสามารถหาพื้นที่ของสามเหลี่ยน kln ได้ตามนี้ครับ

จากตัวอย่างข้างบนจะเห็นว่าผมใช้คำสั่ง GeometricAssertion เป็นตัวบอกว่า object ที่วาดขึ้นนั้น เช่น เส้นตรง วงกลม หรือจุดต่าง มันมีปฏิสัมพันธ์กันอย่างไร อย่างเช่น ผมต้องการ เส้นตรง kn กับเส้นตรง lm ขนานกัน ผมก็เพียงพิมพ์

GeometricAssertion[{Line[{k,n}],Line[{l,m}]},”Parallel”]

แต่ความเจ๋งของ Mathematica 12 ในเรื่อง Synthetic Geometry มันอยู่ตรง คำสั่ง FindGeometricConjecture นี้ครับ เจ้าคำสั่ง FindGemetricConjecture เป็นคำสั่งที่จะช่วยหาข้อสรุปต่างๆ จากตัวภาพที่วาดจากคำสั่ง GemetricScene ครับ เพื่อให้เห็นความสามารถของคำสั่งนี้ ผมจะลองให้มันหาดูว่ามุมภายในครึ่งวงกลมจะเป็นมุมฉากหรือเปล่าตามทฤษฎีของเธลิส เริ่มจากกำหนดจุด {a,b,c} อยู่บนวงกลมที่มีจุดศูนย์กลางที่จุด o และจุด o เป็นจุดกึ่งกลางระหว่างจุด a กับ c พอวาดเสร็จก็ให้หาข้อสรุปดู ตาม code ด้านล่างนี้

จะเห็นได้ว่าจาก คำสั่ง FindGeometricConjectures มันบอกว่าเส้นตรง ab กับ เส้นตรง cb มันตั้งฉากกัน ซึ่งมันก็โชว์อีกว่ามุม b ที่เกิดจากจุด abc มันทำมุม 90 องศา

ลองดูอีกสักตัวอย่าง เพื่อดูว่า จุด X,Y,Z ที่เกิดจากการตัดกันตามภาพล่างนี้อยู่บนระนาบเดียวกันหรือเปล่า

 ซึ่งจากผลที่ได้ X,Y,Z อยู่บนเส้นตรงเดียวกันครับ

ใครที่สนใจอยากดูตัวอย่างเพิ่มเติมลองไปดูได้ที่ https://www.wolfram.com/language/12/plane-geometry/

The dynamics of Plasmodium falciparum during the expansion phase of the asexual stage of infection

The dynamics of Plasmodium falciparum during the expansion phase of the asexual stage of infection

https://www.wolframcloud.com/objects/sompob/models/NJWandImmune.nb

 

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

 

 

My Green Apple

ทดลองเล่น WolframCloud

เจ๋งมากกกกกก เขียนสั้น deploy ก็ง่าย (เชียร์ให้คนมาใช้กันเยอะๆ 555)

 

แสดง output จาก ggplot ใน Mathematica

ลองดูตัวอย่างที่ผมเขียนนี้ครับ  ไอเดียก็คือว่าให้มันเขียนภาพเป็นไฟล์ pdf ด้วยคำสั่ง ggsave แล้วเรียกกลับมาใน Mathematica ด้วย Import  โค้ดที่เขียนนี้ดัดแปลงมาจาก https://mathematica.stackexchange.com/questions/16726/how-to-get-a-plot-generated-by-r-returned-in-an-output-cell

 

 

 

มาลองทำให้โค้ดMathematicaรันเร็วขึ้น

โค้ดที่เขียนด้วยMathematicaหรือภาษา Wolfram นั้นมันจะมีวิธีที่ช่วยให้มันรันได้เร็วขึ้นอยู่หลายวิธีครับ ขึ้นกับปัญหาและวิธีการเขียน ที่จะโชว์ให้ดูนี้ผมก็ใช้เทคนิคง่ายๆด้วยการทำ parallel ด้วยคำสั่ง ParallelTable และ compile ด้วยคำสั่ง Compile ครับ  โค้ดตัวอย่างที่จะเอามาลองนี้เป็นโค้ดที่ใช้วาดรูป Mandelbrot set ครับ

แบบที่ 1 เป็นโค้ดเริ่มต้นที่ยังไม่มีการทำให้มันเร็วครับเขียนโดยใช้ loop จากคำสั่ง Table

AbsoluteTiming[
 test1 = Block[{i, x, p}, 
    Table[i = 0; x = 0. I; p = r + I c; 
     While[Abs@x <= Sqrt[2] && i < 9^3, x = x^2 + p; ++i]; 
     Tanh[Power[i/9^3, (7)^-1]], {c, -1, 1, .01}, {r, -2, 1, .01}]];]

(* เวลาที่ใช้คือ 77.4437 วินาที *)

แบบที่ 2 ในแบบนี้ผมทดลองให้มันรันแบบขนานโดยใช้คำสั่ง ParallelTable เครื่องที่ผมใช้นี้มันมี 4 cores ครับ เวลาก็ลดลง ถ้าคิดง่ายๆก็ใช้เวลาเหลือเกือบๆ 1 ใน 4

AbsoluteTiming[
 test2 = Block[{i, x, p}, 
    ParallelTable[i = 0; x = 0. I; p = r + I c; 
     While[Abs@x <= Sqrt[2] && i < 9^3, x = x^2 + p; ++i]; 
     Tanh[Power[i/9^3, (7)^-1]], {c, -1, 1, .01}, {r, -2, 1, .01}]];]

(* เวลาที่ใช้คือ 23.8938 วินาที *)

แบบที่ 3  แบบนี้ก็คือเอาแบบที่ 1 มา compile เป็น binary code ด้วยคำสั่ง Compile เวลาก็เร็วขึ้นอย่างเห็นได้ชัด

test3 = Compile[{}, 
  Block[{i, x, p}, 
   Table[i = 0; x = 0. I; p = r + I c; 
    While[Abs@x <= Sqrt[2] && i < 9^3, x = x^2 + p; ++i]; 
    Tanh[Power[i/9^3, (7)^-1]], {c, -1, 1, .01}, {r, -2, 1, .01}]]]

AbsoluteTiming[test3[];]

(* เวลาที่ใช้คือ 2.68316 วินาที *)

แบบที่ 4  แบบนี้ก็คือแบบที่ 3 ที่เอามารันแบบขนานด้วยคำสั่ง ParallelTable ซึ่งเวลาที่ใช้ก็เร็วขึ้นอีกกว่าแบบที่ 3

test4 = Compile[{{c, _Real}, {r, _Real}},
   Module[{i, x, p},
    i = 0; x = 0. I; p = r + I c; 
    While[Abs@x <= Sqrt[2] && i < 9^3, x = x^2 + p; ++i]; 
    Tanh[Power[i/9^3, (7)^-1]]
    ]
   ];

ParallelTable[
   test4[c, r], {c, -1, 1, .01}, {r, -2, 1, .01}]; // AbsoluteTiming

(* เวลาที่ใช้คือ 1.04455 วินาที *)

แบบที่ 5 แบบนี้เหมือนกับแบบที่ 4 แต่แทนที่จะให้มัน compile เป็น binary code โดย Mathematica เอง ก็ให้มันแปลงเป็นภาษา C ด้วย option CompilationTarget -> “C” เลยโดยใช้ compiler อย่าง gcc ครับ เวลาก็เร็วขึ้นอีกประมาณ 60% จากแบบที่ 4 ครับ

Needs["CCompilerDriver`GenericCCompiler`"]

$CCompiler = {"Compiler" -> GenericCCompiler, 
   "CompilerInstallation" -> "C:/Rtools/mingw_64", 
   "CompilerName" -> "x86_64-w64-mingw32-gcc.exe"};


test5 = Compile[{{c, _Real}, {r, _Real}},
   Module[{i, x, p},
    i = 0; x = 0. I; p = r + I c; 
    While[Abs@x <= Sqrt[2] && i < 9^3, x = x^2 + p; ++i]; 
    Tanh[Power[i/9^3, (7)^-1]]
    ], CompilationTarget -> "C"];

ParallelTable[
   test5[c, r], {c, -1, 1, .01}, {r, -2, 1, .01}]; // AbsoluteTiming

(* เวลาที่ใช้ 0.393584 วินาที *)

 

external packages / tools / resources ของ Mathematica ที่สนใจ

แนะนำ Link นี้ครับสำหรับผู้สนใจใช้งาน Mathematica ขุมทรัพย์อีกแห่งเลยครับ 🙂

https://stackoverflow.com/questions/4198961/what-is-in-your-mathematica-tool-bag

เทคนิคเจ๋งๆเพียบเลยครับ

 

 

ใช้งาน gcc ที่มากับ Rtools ใน Mathematica

ใน Rtools จะมี compiler ของ gcc (mingw) มาด้วยแล้วทั้งที่เป็นแบบ 32 bits และ 64 bits หากอยากจะเอาไปใช้ใน Mathematica ก็ต้องเรียกผ่าน CCompilerDriver`GenericCCompiler` ครับ แล้วเพียงเซ็ต Path ของ gcc จาก Rtools นี้ให้ถูก เช่น

Needs["CCompilerDriver`GenericCCompiler`"]

ทดลองเรียกใช้งาน

greeter = CreateExecutable[StringJoin[
 "#include <stdio.h>\n",
 "int main(){\n",
 " printf(\"Hello MinGW-w64 world.\\n\");\n",
 "}\n"],
 "helloworld", "Compiler" -> GenericCCompiler, 
 "CompilerInstallation" -> "C:/Rtools/mingw_64", 
 "CompilerName" -> "x86_64-w64-mingw32-gcc.exe"]

Import["!\""<>greeter<>"\"","Text"]
Hello MinGW-w64 world.

ที่นี้ถ้าอยากจะให้ Mathematica มันเรียกใช้เจ้า mingw 64 จาก Rtools นี้ตลอด อย่างเช่นคำสั่ง Compile ก็สามารถทำได้โดยเซ็ตค่าที่มันเกี่ยวข้องอย่างเช่น Path กับตัวแปร $CCompiler ได้เลยครับ

$CCompiler = {"Compiler" -> GenericCCompiler, 
 "CompilerInstallation" -> "C:/Rtools/mingw_64", 
 "CompilerName" -> "x86_64-w64-mingw32-gcc.exe"};

f = Compile[{x, y}, Sqrt[x^2 + y^2], CompilationTarget -> "C"]

Table[{x, f[x, 5/4 x]}, {x, 0, 6, 0.5}]

 

ทดลองใช้ C# กับงานวิจัย

ปกติผมจะใช้ Mathematica เป็นหลักในการทำงานโดยมากจะเป็นพวกแบบจำลองคณิตศาสตร์ที่ตองการเห็นว่าผลลัพธ์จะเปลี่ยนแปลงไปอย่างไรถ้าตัวแปรที่สนใจบางตัวมีการเปลี่ยนแปลง เพิ่มขึ้นหรือลดลง ซึ่งแน่นอนผมใช้พวกคำสั่ง Manipulate หรือ Dynamic เป็นหลัก แต่มาระยะหลังนี้เริ่มมีการใช้ R ในที่ทำงานกันเยอะ ผมเลยเขียนโมเดลของงานที่ทำใน R ไปพอสมควร แต่มันก็ติดปัญหาว่ามันช้ามากกับหลายโมเดลที่ทำอยู่ถึงแม้จะหันไปใช้ Rcpp แต่ก็รู้สึกว่าเสียเวลาเขียน wrapper functions ห่อพวกมันอีกทีใน R แถมเวลาส่งงานให้ Prof ทั้งหลายก็ติดเรื่อง compiler อีก แถมต้องมาเขียน shiny อีกดูวุ่นวายไปหมด สุดท้ายกลับมาตายรังที่ Mathematica เหมือนเดิม เขียนโมเดลเสร็จ อยากจะส่งให้ชาวบ้านดูก็ใช้เพียงแค่คำสั่ง Deploy ไปบนcloud เท่านั้นจบเลย …แต่มันก็แลกมาด้วยค่าใช้จ่ายพอสมควร

ผมเลยหาทางเลือกอื่นๆที่มันประหยัดกับบางงานกับโมเดลที่ไม่ดูซับซ้อนและใช้เวลาทำไม่นาน หันซ้ายหันขวาก็มาจบที่ C# หลังจากดูแล้วก็มี library ที่พอช่วยงานได้อย่าง math.net แถม UI ก็ทำง่ายเพียงลากแปะเท่านั้น เลยทดลองใช้ดู ผลปรากฏว่าเป็นที่น่าพอใจ  ถึงจะดูยุ่งยากในส่วน UI แต่ก็รู้สึกว่าไม่ได้เลวร้ายอะไร ส่งงานก็ง่ายแถมก็ไม่ต้องติดตั้งอะไรให้ดูวุ่นวาย

ตัวอย่างงงานที่ทำที่พอให้ดูได้ครับ


สนใจอยากทดลองเล่นก็ download ได้เลยครับ