โมดูล (Module)

บางครั้งเวลาเรากำหนดฟังค์ชันเราต้องใช้ตัวแปรชั่วคราวในระหว่างการคำนวณ  และมีขั้นตอนในการคำนวณหลายขั้นตอน วิธีที่เราควรใช้คือ Module[ ]

Module เหมือนกับการ scope ตัวแปร ที่ถูกกำหนด (defined) ให้เห็นเฉพาะใน Module เท่านั้น เนื่องจาก Mathematica จะให้ ตัวแปรเป็น global และเห็นได้ทุกแห่งถ้าเราไม่บอกให้ Mathematica รู้ว่าตัวแปรควรจะเป็น local variables ด้วยคำสั่ง Module[{localvar1, localvar2, ...}, expression1; expression2; expression3;...;expressionN]

localvar1, localvar2, ... คือตัวแปรชั่วคราว

expression1; expression2;...;expressionN คือชุดคำสั่งที่มาทำงานต่อๆกัน  เครื่องหมาย ";" จำเป็นจะต้องมีหลังทุกคำสั่งภายใน Module ยกเว้นคำสั่งสุดท้าย ซึ่งจะมีหรือไม่ก็ได้ โดยปกติคำสั่งสุดท้ายจะไม่มี ";" ต่อท้าย ซึ่งแปลว่าผลลัพท์ของคำสั่งสุดท้ายคือค่าที่ฟังค์ชันจะส่งกลับไปให้ผู้เรียกใช้ฟังค์ชันนั้นๆ ถ้าคำสั่งสุดท้ายมี ";" ต่อท้าย ฟังค์ชันก็จะไม่ส่งค่าใดๆกลับ

คัวอย่างแรก เราจะสร้าง ฟังค์ชัน myCircleArea[ ] ที่จะรับค่า diameter (เส้นผ่าศูนย์กลาง) แล้วคำนวณ พื้นที่ออกมา
ระหว่างการคำนวณ myCircleArea จะใช้ตัวแปรชั่วคราวชื่อ radius (รัศมี) และ area (พื้นที่)

In[97]:=

myCircleArea[diameter_] := Module[{radius, area}, radius = diameter/2 ; area = Pi radius^2 ; area]

ส่วน {radius, area} ใน myCircleArea[diameter_]:=Module[{radius,area},... คือการประกาศว่าฟังค์ชัน myCircleArea จะใช้ตัวแปรชั่วคราว สองตัวคือ radius และ area

ส่วน radius = diameter/2; คือการกำหนดค่าของ radius  เครื่องหมาย ";" จำเป็นจะต้องมีหลังทุกคำสั่งภายใน Module ยกเว้นคำสั่งสุดท้าย ซึ่งจะมีหรือไม่ก็ได้ โดยปกติคำสั่งสุดท้ายจะไม่มี ";" ต่อท้าย ซึ่งแปลว่าผลลัพท์ของคำสั่งสุดท้ายคือค่าที่ฟังค์ชันจะส่งกลับไปให้ผู้เรียกใช้ฟังค์ชันนั้นๆ
ถ้าคำสั่งสุดท้ายมี ";" ต่อท้าย ฟังค์ชันก็จะไม่ส่งค่าใดๆกลับ

ส่วน area = Pi radius^2; คือการกำหนดค่าของพื้นที่ของวงกลม  A = πr^2  เนื่องจากคำสั่งนี้ไม่ใช่คำสั่งสุดท้าย จึงต้องมี ";"

area ในบรรทัดสุดท้ายเป็นคำสั่งให้ Mathematica คำนวณค่าของตัวแปร area ซึ่งคือค่าที่ฟังค์ชันจะส่งกลับไปให้ผู้เรียกใช้ฟังค์ชัน myCircleArea

ต่อไปเราทดลองใช้ myCircleArea กับวงกลมที่มีเส้นผ่าศูนย์กลาง เท่ากับ 2 และ 20 หน่วย

In[98]:=

myCircleArea[2]

Out[98]=

π

In[99]:=

myCircleArea[20]

Out[99]=

100 π

ตัวอย่างที่ซับซ้อนขึ้น: ฟังค์ชันที่หาค่าคลาดเคลื่อนจากการทดลอง comError[ ]
ถ้า f = f(x, y, z, ...) และ x, y, z, ... เป็นอิสระต่อกัน (covariance(x_i,x_j) = 0 ถ้า i ≠ j )
(Δf)^2 = (Δx∂_x f)^2+ (Δy∂_y f)^2+ (Δz∂_z f)^2+...

เราจะคำนวณ Δf ด้วย comError[ ]

comError[f,vars,dvars] ใช้ arguments เหล่านี้คือ
f คือฟังค์ชันที่เราสนใจ
vars คือลิสต์ของตัวแปรที่ f ต้องการ
dvars คือลิสต์ของ standard deviations ของตัวแปรที่ f ต้องการ

ในการคำนวณี่หาค่าคลาดเคลื่อนจากการทดลอง เราจะใช้ตัวแปรชั่วคราวที่จะเป็นจำนวนตัวแปรใน vars (เรียกว่า numvars) และ ลิสต์ของ partial derivatives ของ f เทียบกับ vars (เรียกว่า df)

เราจะเขียนคำอธิบายไว้ใน (* ..... *)  
จะมีคำสั่ง Length, Print, Apply, Table, D ซึ่งคุณอาจจะไม่เห็นมาก่อน ขอให้ข้ามไป (หรือ กด Help/Master Index หรือ ? ดูเพิ่มเติมเอง)  ผมจะมาอธิบายคำสั่งเหล่านี้ในครั้งต่อๆไป

In[100]:=

comError[f_, vars_, dvars_] := Module[{numvars, df}, (* ประกา ... rror คือคู่ลำดับ {f, Δf} *)

ทดลองกับฟังค์ชัน f3(x,y,z) = x+y+z

In[101]:=

f3[x_, y_, z_] := x + y + z comError[f3, {x, y, z}, {Δx, Δy, Δz}]

General :: spell1 : Possible spelling error: new symbol name \"Δy\" is similar to existing symbol \"Δx\".  More…

General :: spell : Possible spelling error: new symbol name \"Δz\" is similar to existing symbols  {Δx, Δy} .  More…

functions: x + y + z

Result and Uncertainty:\t{x + y + z} ± { (Δx^2 + Δy^2 + Δz^2)^(1/2) }

Out[102]=

{x + y + z, (Δx^2 + Δy^2 + Δz^2)^(1/2)}

In[103]:=

comError[f, {x}, {Δx}]

functions: x^2

Result and Uncertainty:\t{x^2} ± {2 (x^2 Δx^2)^(1/2) }

Out[103]=

{x^2, 2 (x^2 Δx^2)^(1/2)}

In[104]:=

comError[f2, {x, y, d}, {Δx, Δy, Δd}]

General :: spell : Possible spelling error: new symbol name \"Δd\" is similar to existing symbols  {Δx, Δy, Δz} .  More…

functions:  (x^2 + y^2)/(2 d^2)

Result and Uncertainty:\t{ (x^2 + y^2)/(2 d^2) } ± { (((x^2 + y^2)^2 Δd^2)/d^6 + (x^2 Δx^2)/d^4 + (y^2 Δy^2)/d^4)^(1/2) }

Out[104]=

{(x^2 + y^2)/(2 d^2), (((x^2 + y^2)^2 Δd^2)/d^6 + (x^2 Δx^2)/d^4 + (y^2 Δy^2)/d^4)^(1/2)}

แทนค่า x = 1, y = 0, d= 0.1, Δx=0.01,Δy=0.01,Δd=0.01

In[105]:=

RowBox[{comError[f2, {x, y, d}, {Δx, Δy, Δd}],  , /.,  , RowBox[{{, RowBox[{x&# ...  , RowBox[{Δy,  , ,  , 0.01}], ,,  , RowBox[{Δd,  , ,  , 0.01}]}], }}]}]

functions:  (x^2 + y^2)/(2 d^2)

Result and Uncertainty:\t{ (x^2 + y^2)/(2 d^2) } ± { (((x^2 + y^2)^2 Δd^2)/d^6 + (x^2 Δx^2)/d^4 + (y^2 Δy^2)/d^4)^(1/2) }

Out[105]=

RowBox[{{, RowBox[{50., ,, 10.0499}], }}]

ถ้าเราไม่ใช้ Module[ ] ตัวแปรอะไรก็ตามที่เรากำหนดระหว่างการคำนวณของเรา ก็จะคงอยู่ให้เห็นหลังจากการคำนวณเสร็จสิ้นไปแล้ว และมักจะไปทับซ้อนตัวแปรที่มีชื่อเหมีอนกัน ทำให้เรามีโอกาสทำผิดพลาดมากขึ้น  ถ้ามีเหตุการณ์อย่างนั้นเกิดขึ้น เราจะต้องใช้ Clear[ ] หรือ Remove[ ] ตัวแปรเหล่านั้น

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


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

ในตอนด่อๆไป ผมจะเน้นรายละเอียดในเรื่องต่างๆมากขึ้น ถ้าใครมีอะไรสนใจเป็นพิเศษ ก็ช่วยบอกไว้ใน http://mpec.sc.mahidol.ac.th/ หรือเมล์ผม ที่ [email protected] นะครับ


Created by Mathematica  (July 26, 2005)