SciDraw

SciDraw คือแพ็กเกจที่ช่วยให้สร้างกราฟสวยๆในMathematica ครับ ช่วงนี้ผมใช้บ่อยเลยอยากมาแชร์ครับ มันเป็นแพ็คเกจที่ถูกพัฒนาโดย Mark A. Caprio, University of Notre Dame มาหลายปีแล้วครับ แต่ก็ยังเห็นมีคนใช้กันอยู่บ้างโดยเฉพาะในกลุ่มนักฟิสิกส์ ส่วนตัวผมก็ว่ามันใช้งานง่ายนะครับ แนะนำให้ลองศึกษาจากคู่มือที่เขาแชร์ไว้ที่ SciDraw: Publication-quality scientific figures with Mathematica (nd.edu) ดูครับมีตัวอย่างพอสมควรที่จะทำความเข้าใจได้ไม่ยาก ความสามารถหลักๆที่ผมใช้ก็คือการเอากราฟมารวมกัน ซ้อนกัน หรือวาด ใส่เส้นตามตำแหน่งที่ต้องการ

หาพื้นที่แรเงา

เห็นคนถามคำถามนี้ในเวบpantip

ช่วยหาพื้นที่ส่วนที่แรเงาหน่อยครับ – Pantip

คำถามลักษณะแบบนี้เราสามารถเขียนcode ในภาษาWolfram แก้ปัญหาได้ง่ายๆเลยครับ ด้วยการใช้คำสั่งอย่าง RegionDifference เพื่อดูความแตกต่างกันของพื้นที่ โดยจากโจทย์เราก็เพียงเอา พื้นที่ของสี่เหลี่ยมเป็นตัวตั้งแล้วลบออกด้วยพื้นที่วงกลมสำหรับพื้นที่ A ส่วนพื้นที่ B ก็ทำตรงกันข้ามคือเอาพื้นที่วงกลมตั้งลบออกด้วยพื้นที่สี่เหลี่ยม คำตอบที่ได้จาก Wolfram หาร4 ก็จะได้คำตอบสำหรับ พื้นที่ 1/4ของพื้นที่ที่ต่างกัน code ตัวอย่างด้านล่างนี้ผมใช้ Manipulate ครอบอีกทีเพื่อดูค่าที่รัศมีวงกลมหรือด้านของสี่เหลี่ยมต่างๆ

ใช้ neural network ทำ linear regression ง่ายๆใน ภาษา Wolfram

พอดีเมื่อวานมีพูดแนะนำเทคนิค neural network ในที่ทำงาน แล้วมีคนถามว่าใช้ทำ linear regression ได้ไหม ผมก็บอกว่าได้เลยทำให้ดูเป็นตัวอย่าง code ที่แชร์นี้ก็เป็นตัวอย่างที่ผมทำเมื่อวานครับ ซึ่งก็เริ่มด้วยการ generate ข้อมูลที่ดูเหมือนเป็นเส้นตรงมา จากนั้นก็สร้าง neural network โดยใช้ linear layer ที่มี input กับ output ค่าเดียว โดย loss function ที่ใช้คือ mean square จากกนั้นก็ใช้คำสั่ง NetTrain ในการหา weight กับ bias ของ linear layer จากนั้นก็ลอง plot เปรียบเทียบผลที่ได้กับคำสั่ง LinearModelFit

คำสั่ง NetTrain มันก็เหมือนกับ NMinimize กับ FindMinimum ที่จะหาจุดต่ำสุดของ Function ที่เราสนใจซึ่งในกรณีนี้ก็คือ mean square

OpenCL ในภาษา Wolfram

มีคนถามมาว่าช่วยทำตัวอย่างให้ดูหน่อยในการใช้ OpenCL ใน Mathematica ซึ่งผมก็บอกไปแล้วว่ามันตัวอย่างเยอะเลยในhelp Mathematica เอง 🙂 แต่ก็ยังอยากให้ผมทำให้ดู ตัวอย่างที่ทำให้ดูก็เป็นการประมาณค่า Pi โดยอาศัยที่เรียกว่า Monte carlo โดยประมาณจากการสุ่มจุดลงในสี่เหลี่ยมจัตุรัสที่มีวงกลมรัศมีครึ่งหนึ่งของความยาวด้านสี่เหลี่ยมจัตุรัส แล้วดูว่ามีกี่จุดที่อยู่ในวงกลม ซึ่งค่า Pi จะสามรถประมาณได้จาก

Pi = 4 * จำนวนจุดในวงกลม / จำนวนจุดที่สุ่มมาทั้งหมด

อันนี้เป็น code ที่ผมเขียนโดยใช้ OpenCL ใน Mathematica เพื่อหาดูว่าจุดไหนบ้างที่อยู่ในวงกลมซึ่งมีจุดศูนย์กลาง (0.5,0.5) ในสี่เหลี่ยนจัตุรัส

<< OpenCLLink`

scr = "
  __kernel void myPie( __global double *X, __global double *Y, 
__global mint *inC, mint np) {
      int indx = get_global_id(0);
      double d; //distance
  	if (indx < np) {
  		d = sqrt((X[indx]-0.5)*(X[indx]-0.5)+(Y[indx]-0.5)*(Y[indx]-0.5));
          if(d <= 0.5)
inC[indx] = 1;   
  	}
  }
  ";

fn = OpenCLFunctionLoad[scr, 
  "myPie", {{_Real, _, "Input"}, {_Real, _, "Input"}, {_Integer, _, 
    "Output"}, _Integer}, 16 ];

np = 10^6;
x = OpenCLMemoryLoad[RandomReal[1, np]];
y = OpenCLMemoryLoad[RandomReal[1, np]];
inc = OpenCLMemoryLoad[ConstantArray[0, np]];
Print["my Pi : ", (OpenCLMemoryGet@(fn[x, y, inc, np] // First) // 
    Total)*4.0/np]

OpenCLMemoryUnload[x, y, inc]

ทดลองรันดูสัก 100 ครั้ง โดยที่แต่ล่ะครั้งสุ่มมา 10^7 จุด แล้วดูว่ามันให้ค่าประมาณแตกต่างเท่าไหร่เมื่อเทียบกับค่าจริง (จาก Mathematica) จากรูปด้านล่าง เส้นประสีดำคือที่ได้จากการประมาณ สีแดงคือเส้นค่า Pi จาก Mathematica

ส่วนอีกอันก็เป็นการหมุนภาพ โดยที่มีจุดหมุนอยู่ที่กลางภาพครับ

scr = "
  __kernel void test1( __global float * mat1, __global float * mat2, 
float theta, mint width, mint height) {
      int xIndex = get_global_id(0);
  	int yIndex = get_global_id(1);
  	int indx = xIndex + yIndex*width;
  
  	 if (xIndex >= width || yIndex >= height)
  		return ;
  
  	//image centre
  	float x0 = width/2;
  	float y0 = height/2;
  
  	//relative position
  	int xprime = xIndex-x0;
  	int yprime = yIndex-y0;
  
  	float sinTheta = sin(theta);
  	float cosTheta = cos(theta);
  
  	int nx =(xprime*cosTheta - yprime*sinTheta + x0);
  	int ny =(xprime*sinTheta + yprime*cosTheta + y0);
  	mat2[indx] = mat1[nx + width*ny];
  }
  
  ";

Clear[test];
test = OpenCLFunctionLoad[scr, 
  "test1", {{"Float", _, "Input"}, {"Float", _, "Output"}, 
   "Float", _Integer, _Integer}, {16, 16}, 
  "ShellOutputFunction" -> Print];

ว่าด้วยเรื่อง Paclets ของภาษา Wolfram

เพิ่งอัพเดท Mathematica ไปใช้ 12.1 แล้วเจอเรื่อง paclet ที่เปลี่ยนไป (ในทางที่ดีขึ้น) เลยเดี๋ยวจะมาเล่าให้ฟัง ขอแปะแหล่งข้อมูลไว้ก่อน

1. https://www.wolframcloud.com/obj/tgayley/Published/PacletDevelopment.nb

2. https://www.wolfram.com/broadcast/video.php?sx=paclet&v=2833

3. https://reference.wolfram.com/language/guide/Paclets.html