Category Archives: programming

วิทย์ม.ต้น: ใช้ SymPy แก้สมการสัญญลักษณ์และตัวเลข, สั่งให้คอมพิวเตอร์ทำงานซ้ำๆแทนเรา

วิทย์โปรแกรมมิ่งวันศุกร์ครั้งนี้ เด็กม.3 ดูโจทย์นี้เพื่อแปลงเป็นสมการให้ SymPy แก้ปัญหาให้ครับ

เราแปลงเป็นสมการในตัวแปร x, y, z ให้ SymPy แก้ได้แบบนี้ครับ:

เราเอาค่า x, y, z ไปแทนค่าได้แบบนี้ คำตอบคือ 41:

ทดลองหาจุดตัดของวงกลมและเส้นตรงครับ:

ใช้คำสั่ง div หาผลหารและเศษการหารโพลีโนเมียลได้ด้วยครับ:

สำหรับเด็กม.1 เราพยายามหาค่า x ที่ทำให้ xx = 2 (จากตอนท้ายของวิดีโอข้างบน) เราทำโดยเดาก่อนว่า 11 = 1 และ 22 = 4 ดังนั้น x น่าจะอยู่ระหว่าง 1 กับ 2 แล้วเด็กๆก็ลองดูตรงกลางระหว่าง 1 กับ 2 ว่า 1.51.5 = 1.84… แสดงว่าคำตอบควรอยู่ระหว่าง 1.5 กับ 2 จึงลองดูตรงกลาง = 1.75 พบว่า 1.751.75 = 2.66 แสดงว่าคำตอบควรอยู่ระหว่าง 1.5 กับ 1.75 ถ้าเราทำต่อไปเราก็จะหาทางแบ่งครึ่งช่วงคำตอบไปเรื่อยๆ แต่เราหัดเขียนโปรแกรมให้คอมพิวเตอร์ไล่ให้เราได้ดังนี้ครับ:

พบว่า x = 1.5596104694623696…. จะทำให้ xx = 2 ครับ

ผมถามเด็กว่าถ้าจะหาค่า x ที่ทำให้ xx = 3 จะทำอย่างไร เด็กๆก็แก้โปรแกรมนิดนึงได้คำตอบ x = 1.8254550229248308… ทำให้ xx = 3 ครับ:

ผมถามเด็กม.1 ด้วยว่าถ้าคำนวณ (1+1/1)1, (1+1/2)2, (1+1/3)3, (1+1/4)4, …, (1+1/n)n โดยที่ n ใหญ่ขึ้นไปเรื่อยๆ ค่าที่คำนวณจะใหญ่ไปเรื่อยๆไหม เด็กๆก็ให้ไพธอนคำนวณให้ พบว่าผลการคำนวณจะประมาณ 2.71828… (ซึ่งเท่ากับค่าคงที่ออยเลอร์หรือค่า e นั่นเองครับ)

วิทย์ม.ต้น: หัดใช้ SymPy สำหรับโจทย์เลขสัญญลักษณ์, ใช้ Microsoft Math ช่วยแก้และสร้างโจทย์

วิทย์โปรแกรมมิ่งวันศุกร์นี้ สำหรับม.3 ผมให้ดูคลิปโจทย์นี้ก่อน:

โจทย์คือโทรศัพท์ต้องมีรหัสตัวเลขสี่หลัก มีรหัสกี่อันที่ไม่มีเลข 13 อยู่ในนั้น (ดูเฉลยในคลิปได้ครับ) แต่ผมให้เด็กๆเขียนโปรแกรมไล่นับดูด้วย หน้าตาโปรแกรมก็เป็นแบบนี้:

หลังจากทำอย่างนี้ได้ผมก็ถามว่าถ้านับจำนวนรหัสที่ห้ามมีเลข 1 แล้วมีเลข 3 อยู่ด้านหลังโดยอาจมีเลขอื่นๆคั่นอยู่จะนับอย่างไร เด็กๆก็เข้าใจว่าต้องไปเปลี่ยนเงื่อนไขว่าพบเลข 1 และ เลข 3 และเลข 3 ต้องอยู่ด้านหลังเลข 1 แต่เด็กๆไม่รู้ว่าคำสั่งที่ใช้หาตำแหน่งคืออะไร ผมจึงค้นหาในเว็บให้เด็กๆดู พบว่าใช้คำสั่ง find ได้เช่นที่เว็บนี้ พอเรารู้ว่าใช้ find อย่างไร โปรแกรมไล่นับของเราก็จะมีหน้าตาประมาณนี้ครับ:

จากนั้นเด็กๆม.3 ดูตัวอย่างวิธีใช้ SymPy ในโปรแกรมไพธอน ตามตัวอย่างที่หน้านี้ครับ สามารถใช้แก้ปัญหาคณิตศาสตร์แบบติดสัญญลักษณ์ได้ (แก้แบบ symbolic ) หน้าตาก็เป็นประมาณนี้:

ผมได้เล่าเรื่องจำนวนเชิงซ้อน (complex numbers) ให้เด็กๆฟังว่าจริงๆแล้วตัวเลขไม่ได้อยู่บนเส้นจำนวนเท่านั้น ระนาบรอบๆเส้นจำนวนก็มีตัวเลขเต็มไปหมด เลขเหล่านั้นถูกเรียกว่าจำนวนเชิงซ้อน แต่จริงๆมันก็มีตัวตนเหมือนเลขบนเส้นจำนวนนั่นแหละ มีกฎเกณฑ์การบวกลบคูณหารที่แน่นอน กฎเกณฑ์ทางธรรมชาติและคณิตศาสตร์หลายๆอย่างก็ใช้เลขเหล่านี้ และวิธีคิดถึงตัวเลขเหล่านี้ที่จินตนาการง่ายๆก็คือลากเส้นลูกศรจาก 0 ไปที่เลขต่างๆ การบวกก็เหมือนการเอาลูกศรมาต่อกัน การคูณเหมือนกับเอาทิศทางของลูกศรมาบวกกันแล้วยืดลูกศรลัพธ์ให้ยาวเท่ากับผลคูณของความยาวลูกศรที่เอามาคูณกัน

สำหรับเด็กม.1 ผมให้โหลดโปรแกรม Microsoft Math มาใช้ในโทรศัพท์ สามารถถ่ายรูปโจทย์ต่างๆ หรือเขียนโจทย์ต่างๆเข้าไปให้โปรแกรมแก้ และแสดงขั้นตอนการทำให้ดูได้ด้วย หน้าตาเว็บเขาจะเป็นแบบนี้ครับ:

https://math.microsoft.com

เด็กๆหัดเอา Microsoft Math ไปลองแก้ปัญหาต่างๆ และตอนหลังเขาตั้งโจทย์กันแล้วดูว่า Microsoft Math แก้ได้ไหมด้วยครับ ยกตัวอย่างเช่นโจทย์ว่ามีสัตว์ห้าชนิดคือ ไก่ วัว เต่าทอง แมงป่องพิษ งูพิษ มีสัตว์รวมกัน 80 ตัว มีปีกรวมกัน 120 ปีก มีสัตว์มีพิษ 25 ตัว และมีขารวมกัน 370 ขา ให้หาว่ามีสัตว์แต่ละชนิดกี่ตัว

เราก็เขียนสมการของโจทย์ไปบนกระดาษ แล้วใช้ Microsoft Math ถ่ายรูป จะพบว่าถ้าให้จำนวน ไก่ วัว เต่าทอง แมงป่อง และงู เท่ากับ x y z w v ตามลำดับแล้ว x = (110-8v)/3, y = (4v+20)/3, z = (4v+35)/3 , w = 25-v คือจำนวนไก่ วัว เต่าทอง แมงป่องขึ้นกับจำนวนงู v ที่เราใส่เข้าไป ผมจึงให้เด็กๆเขียนโปรแกรมไล่ว่ามีคำตอบทั้งหมดกี่คำตอบอีกทีครับ คำตอบที่เป็นไปได้คือ x, y , z, w, v ต้องเป็นจำนวนเต็มไม่น้อยกว่าศูนย์ และผมแนะนำให้เด็กๆรู้จักกับฟังก์ชั่น divmod ที่หาผลหารและเศษการหารออกมา เพื่อเราจะได้เช็คว่าผลการหารของเราได้เป็นเลขจำนวนเต็มหรือไม่ หน้าตาโปรแกรมก็เป็นประมาณนี้ พบว่ามี 5 คำตอบ (ตอนเด็กตั้งโจทย์ เขาสร้างตัวเลขขึ้นมาชุดเดียวคือ 10, 20, 25, 15, 10):

จริงๆถ้าเราจะใช้ SymPy แก้ก็ได้เหมือนกันครับ:

วิทย์ม.ต้น: รู้จักฟังก์ชั่นในโมดูล random ของไพธอน

วิทย์โปรแกรมมิ่งม.3 สัปดาห์ที่ผ่านมาผมเฉลยการบ้านที่ให้เด็กๆไปดัดแปลงฟังก์ชั่นเลือกคู่แบบ n/e ให้หาว่าโอกาสที่จะเลือกคู่ที่แย่ที่สุดเป็นเท่าไร พบว่าลดโอกาสไป 2-3 เท่าเมื่อเทียบกับการสุ่มเลือกครับ วิธีดัดแปลงก็เพียงพิมพ์เพิ่มไปสี่บรรทัดเพื่อนับจำนวนครั้งที่เลือกคนที่แย่ที่สุด ส่วนที่เปลี่ยนแปลงคือส่วนที่ไฮไลท์ไว้ในรูปครับ (โหลดไฟล์จากสัปดาห์ที่แล้วแล้วพิมพ์เพิ่มเข้าไปเองได้ครับ):

ผลที่ได้ ตัวเลขคือ (จำนวนคนที่คบได้, คนที่ลองคบแต่ยังไม่เลือก, ความน่าจะเป็นที่จะเลือกคนดีที่สุด, ความน่าจะเป็นที่จะเลือกคนแย่ที่สุด):

จากนั้นผมก็แนะนำให้เด็กๆรู้จักฟังก์ชั่นต่างๆในโมดูล random ของไพธอน เห็น randrange(), randint(), choice(), shuffle(), sample(), random(), uniform()

ผมแสดงให้เด็กๆเห็นว่าเราสามารถประมาณค่า π ด้วยการเลือกจุดสุ่มๆหลายๆจุดในสี่เหลี่ยมจตุรัสขนาด 2×2 แล้วนับว่าจุดไหนห่างจากศูนย์กลางไม่เกิน 1 ซึ่งแปลว่าจุดนั้นตกอยู่ในวงกลมรัศมี 1 อัตราส่วนจำนวนจุดที่ตกในวงกลมรัศมี 1 ต่อจำนวนจุดที่สุ่มในสี่เหลี่ยมจตุรัส 2×2 จะเท่ากับพื้นที่วงกลมรัศมี 1 ต่อพื้นที่สี่เหลี่ยม 2×2 = π/4 เราจึงประมาณค่า π อย่างนี้ได้ครับ

หาค่าประมาณของ π จากการสุ่ม

ผมสอนเด็กๆเรื่องการสุ่มตัวอย่าง (sampling) จากประชากรทั้งหมด และพยายามหาประมาณค่าเฉลี่ยของประชากรจากค่าเฉลี่ยจากกลุ่มตัวอย่าง และการบ้านให้ไปลองสุ่มตัวอย่างจากประชากรที่ผมให้ไปครับ