Tag Archives: python

วิทย์ม.ต้น: ใช้ 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 แก้ก็ได้เหมือนกันครับ:

วิทย์ม.ต้น: “ปัญหาเลือกคู่” (Optimal Stopping Problem)

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

เราคุยต่อเนื่องมากจากสัปดาห์ที่แล้วที่เด็กๆได้รู้จัก “ปัญหาเลือกคู่” แล้วให้พยายามเขียนโปรแกรมเช็คว่าเป็นจริงตามที่ทฤษฎีบอกหรือไม่ เรามาเฉลยกันในห้องครับ

 “ปัญหาเลือกคู่” (marriage problem หรือ secretary problem) หรือรู้จักในชื่อทั่วไปคือ optimal stopping problem คือสมมุติว่าเรามีโอกาสคบคนทั้งหมด n คน โดยที่ต้องคบทีละคน และต้องเลิกคบกับคนปัจจุบันก่อนที่จะไปคบคนต่อไป เมื่อเลิกคบกับใครแล้วห้ามกลับไปคบกับเขาอีก แล้วต้องตัดสินใจว่าจะเลือกใครเป็นคู่ โดยหวังว่าจะเลือกคนที่ดีที่สุดใน n คนนี้ 

ปรากฎว่ามีวิธีที่ทำให้เรามีโอกาสประมาณ 37% ที่จะเลือกคนที่ดีที่สุดได้ ไม่ว่าจำนวน n จะเป็น 3, 10, 100, หรือ 1 ล้าน คือให้คบคนไป n/e คนก่อน (e เป็นค่าคงที่ 2.71828… เรียกว่าค่าอีหรือค่าคงที่ของออยเลอร์) อย่าพึ่งเลือกคนเหล่านี้ จากนั้นให้เลือกคนแรกที่ดีกว่าคนที่เคยคบมา (หรือเลือกคนสุดท้ายเมื่อไม่เหลือใครแล้ว) ยกตัวอย่างเช่นถ้าเราคิดว่าคงมีเวลาคบคน 10 คน ค่า n ของเราก็คือ 10 ดังนั้นให้เราคบไป 10/e = 10/2.71828… = 3.6787.. เท่ากับประมาณ 4 โดยที่เรายังไม่ตัดสินใจเลือกใครใน 4 คนนี้ ต่อไปเราคบกับคนที่เหลือทีละคน แล้วเลือกคนแรกที่ดีกว่าคนที่เราเคยคบมา ถ้าหาไม่ได้ก็เลือกคนสุดท้าย

หน้าตาโปรแกรมที่ทดสอบวิธีหาคู่แบบนี้ก็จะมีหน้าตาประมาณนี้ครับ:

ให้คอมพิวเตอร์ทดลองแทนคน 10,000 คนได้ผลสำเร็จประมาณ 37% หรือมากกว่าครับ:

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