Tag Archives: python

วิทย์ม.ต้น: ให้คอมพิวเตอร์คำนวณความน่าจะเป็น และใช้วิธีสุ่ม (sampling) เมื่อปัญหาใหญ่เกิน

(ลิงก์ดาวโหลดอยู่ด้านล่าง)

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

คราวนี้ผมให้แบบฝึกหัดเด็กๆไปหาคำตอบของคำถามนี้ครับ: ซื้อขนมชนิดหนึ่ง ในกล่องมีให้สะสมตุ๊กตากล่องละแบบ มีตุ๊กตาทั้งหมด 4 แบบ สะสมครบ 4 แบบจะได้รับรางวัลพิเศษ เราไม่รู้ว่าแต่ละกล่องมีตุ๊กตาแบบไหนแต่ตุ๊กตาแต่ละตัวมีโอกาสเท่าๆกันที่จะอยู่ในขนมแต่ละกล่อง ถ้าซื้อขนมนี้มา 8 กล่องถามว่าความน่าจะเป็นที่จะได้รางวัลพิเศษมีเท่าไหร่

เราก็สามารถให้คอมพิวเตอร์สร้างรูปแบบขนม 8 กล่องที่เป็นได้ทั้งหมด และนับว่ารูปแบบไหนมีตุ๊กตาครบ 4 แบบดังนี้:

ผมให้เด็กๆหัดใช้ all() และ any() และ list comprehension ด้วย หน้าตาโปรแกรมก็อออกมาประมาณนี้:

ถ้าเราอยากรู้ว่าโอกาสได้รางวัลเป็นเท่าไรเมื่อซื้อมา 4 กล่อง เราก็สามารถแก้ไขโปรแกรมเราได้ประมาณนี้:

ถ้าเราอยากคำนวณความน่าจะเป็นเมื่อซื้อจำนวนกล่องอื่นๆโดยไม่ต้องเข้าไปแก้ไขโปรแกรมตลอด เราสามารถใช้ itertools.product() ได้:

ถ้าเราพยายามคำนวณสำหรับจำนวนกล่องมากๆ วิธีแจกแจงจำนวนกล่องที่เป็นไปได้ทั้งหมดจะทำได้ยาก เพราะจำนวนแบบที่เป็นไปได้เพิ่มขึ้นรวดเร็วมากเมื่อจำนวนกล่องเพิ่ม (เท่ากับ 4N เมื่อ N คือจำนวนกล่อง) ถ้าเราซื้อ 20 กล่อง จำนวนที่เป็นไปได้จะเป็นล้านล้านแบบ (เลข 12 หลัก) ถ้าซื้อ 30 กล่อง จำนวนที่เป็นไปได้จะเป็นล้านล้านล้านแบบ (เลข 18 หลัก) เราต้องใช้วิธีอื่นประมาณความน่าจะเป็น

ในที่นี้เราสามารถประมาณคำตอบด้วยวิธีสุ่มได้ วิธีก็ง่ายมากคือสมมุติให้คอมพิวเตอร์เข้าไปซื้อขนมหลายๆครั้ง แล้วดูว่าได้รางวัลกี่ครั้ง อัตราส่วนจำนวนครั้งที่ได้รางวัลต่อจำนวนครั้งที่เข้าไปซื้อก็คือค่าประมาณของความน่าจะเป็นที่ได้รางวัลนั่นเอง โปรแกรมก็จะมีหน้าตาประมาณนี้:

เมื่อวาดกราฟความน่าจะเป็น vs. จำนวนกล่องก็จะได้ภาพแบบนี้:

ผมบันทึกตัวอย่างเหล่านี้ไว้ให้เด็กๆและผู้สนใจเข้ามาดูทบทวนโดยสามารถโหลด Jupyter Notebook ได้ที่นี่ หรือดูออนไลน์ได้ที่นี่นะครับ

วิทย์ม.ต้น: ให้คอมพิวเตอร์แก้ปัญหาสมการเชิงเส้นให้เรา

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

คราวนี้ผมให้แบบฝึกหัดเด็กๆไปหัดเขียนฟังก์ชันว่าเส้นตรงสองเส้นตัดกันตรงไหน หน้าตาจะออกมาประมาณนี้ครับ:

การหาว่าเส้นตรงสองเส้นตัดกันตรงไหนเป็นวิธีแก้ปัญหาสมการเชิงเส้นในสองตัวแปรครับ ถ้ามีตัวแปรมากกว่าสองตัว รูปแบบคำตอบจะดูยุ่งยาก ผมให้เด็กๆรู้จักเข้าไปใช้ Wolfram Alpha หาคำตอบพวกนั้น (ยกตัวอย่างเช่นสามตัวแปรเป็นอย่างนี้)

ปัญหาที่น่าสนใจจะมีตัวแปรเยอะกว่าที่ทำด้วยมือในโรงเรียนมากครับ ตัวแปรจะเป็นร้อยเป็นพันถึงเป็นล้านตัว ต้องให้คอมพิวเตอร์ช่วยทำ ผมให้เด็กๆเห็นวิธีตรงไปตรงมาเหมาะกับให้คอมพิวเตอร์ทำชื่อ Gaussian Elimination (หรืออีกชื่อว่า Gauss -Jordan Elimination) หาคำตอบแทนสูตรสำเร็จรูป ดูตัวอย่างได้ที่คลิปนี้ หรือ คลิปนี้

ถ้าเด็กๆสนใจ ก็สามารถใช้ไพธอนช่วยแก้ปัญหาพวกนี้ได้ด้วย numpy.linalg.solve() ครับ หน้าตาอาจเป็นแบบนี้ครับ:

ผมบันทึกตัวอย่างเหล่านี้ไว้ให้เด็กๆและผู้สนใจเข้ามาดูทบทวนโดยสามารถโหลด Jupyter Notebook ได้ที่นี่ หรือดูออนไลน์ได้ที่นี่นะครับ

วิทย์ม.ต้น: ใครจะอยากหาห.ร.ม.ด้วยมือ (เขียนโปรแกรมหา ห.ร.ม. และ ค.ร.น.)

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

คราวนี้ให้เด็กๆไปหัดสั่งให้คอมพิวเตอร์หาห.ร.ม. และค.ร.น.กัน

ในระดับมัธยม เด็กๆมักจะได้เรียนวิธีหาห.ร.ม. และค.ร.น.ด้วยตัวประกอบเฉพาะ แต่เราคุยกันเรื่องวิธีที่เหมาะกว่าเร็วกว่าที่ถูกบันทึกมากกว่าสองพันปีมาแล้วโดยยูคลิดด้วยครับ

ผมบันทึกโปรแกรมทั้งแบบแยกตัวประกอบและแบบยูคลิดให้เด็กๆและผู้สนใจเข้ามาดูทบทวนโดยสามารถโหลด Jupyter Notebook ได้ที่นี่ หรือดูออนไลน์ได้ที่นี่นะครับ