Tag Archives: python

วิทย์ม.ต้น: เขียนโปรแกรมไพธอนหาว่าพาราโบลาตัดแกน x ที่ไหน, วิธีหาคำตอบโดย Bisection Method

สัปดาห์ที่ผ่านมาผมให้เด็กๆไปค้นคว้ามาว่ากราฟพาราโบลาหน้าตาเป็นอย่างไรครับ

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

ส่วนต่างๆของพาราโบลา:

พาลาโบลาทุกอันเป็นตัวเดียวกัน ต่างกันแค่เลื่อนไปมา หมุนไปมา และซูมเข้าซูมออก (เหมือนกับที่วงกลมทุกวงเป็นตัวเดียวกัน ต่างกันแค่เลื่อนไปมาและซูมเข้าซูมออก):

ต่อไปเด็กๆก็รู้จักสูตรควอดราติก (quadratic formula) ที่บอกว่าพาราโบลาตัดแกน x ที่ไหนครับ

เราเขียนโปรแกรมไพธอนเพื่อหาค่าตามสูตรข้างบน:

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

สำหรับสมการที่ไม่มีสูตรแก้ เราต้องใช้วิธีทางตัวเลข (numerical method) ประมาณค่าดู วันนี้เราคุยกันเรื่องวิธี Bisection ครับ (bisection method) โดยไอเดียหลักก็คือวาดกราฟดูก่อนว่าฟังก์ชั่นเรามีค่าเท่ากับศูนย์แถวๆช่วงไหน แล้วเราก็แบ่งครึ่งช่วงนั้นเป็นสองช่วงที่เล็กลงครึ่งหนึ่ง แล้วดูว่าฟังก์ชั่นเราเท่ากับศูนย์ในช่วงที่เล็กลงช่วงไหน แล้วทำอย่างนี้วนไปเรื่อยๆ ช่วงที่ล้อมรอบคำตอบเราก็จะเล็กลงเรื่อยๆทีละครึ่งจนช่วงเล็กพอให้เราประมาณค่าในช่วงนั้นเป็นคำตอบ

ตัวอย่างวิธี bisection แบบเรียกตัวเอง (recursion)
ตัวอย่างวิธี bisection ที่ไม่เรียกตัวเอง และทำการเทียบบัญญัติไตรยางค์ในช่วงที่ถูกบีบให้เล็กๆ เพื่อให้ได้คำตอบที่ถูกต้องมากยิ่งขึ้น

สามารถโหลดโค้ดต่างๆใน Jupyter Notebook นี้หรือดูออนไลน์ที่ https://nbviewer.jupyter.org/urls/witpoko.com/wp-content/uploads/2019/06/2019-06-28_G8-9.ipynb นะครับ

วิทย์ม.ต้น: เขียนไพธอนคำนวณเลข Fibonacci, เว็บ Snakify.org

การบ้านสัปดาห์ที่แล้วของเด็กๆม.2-3 คือไปหาวิธีคำนวณเลขฟิโบแนคชี (Fibonacci numbers) ครับ วันนี้ผมเลยให้เด็กๆดูคลิปเกี่ยวกับเลขเหล่านี้ในธรรมชาติ และแสดงวิธีคำนวณให้ดูหลายแบบคือแบบ recursion, แบบ dynamic programming (จำสิ่งที่เคยคำนวณไว้แล้วจะได้ไม่ต้องคำนวณใหม่), แบบ loop ตรงๆ, และแบบ divide-and-conquer (แบ่งปัญหาการคำนวณ F(n) ให้อยู่ในรูปของ F(n/2) และ F(n/2 – 1))

คลิปทีควรดูมีดังนี้ครับ:

และเว็บเพจสองหน้านี้ครับ: http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibnat.html และ http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibnat2.html

ส่วนวิธีคำนวณที่ดูในห้องหน้าตาประมาณนี้ครับ:

วิธีที่ฟังก์ชั่นเรียกตัวเองแบบ recursion
วิธีคำนวณแบบ dynamic programming หรือ caching โดยเก็บคำที่เคยคำนวณไว้แล้วไว้ใช้ใหม่ในการคำนวณอื่นๆ
วิธีคำนวณแบบใช้ loop วนคำนวณตรงๆ
วิธีคำนวณแบบ divide-and-conquer ทำปัญหาใหญ่ให้เป็นปัญหาที่เล็กลงและแก้ง่ายขึ้น

ดาวน์โหลดโค้ดต่างๆใน Jupyter Notebook ได้ที่นี่ หรือดูออนไลน์ได้ที่นี่ครับ

สำหรับเด็กม. 1 ผมโชว์วิธีสร้างลิสต์ด้วย list comprehension และให้เด็กๆเริ่มศึกษาและทำแบบฝึกหัดที่เว็บ Snakify สัปดาห์ละบทครับ

การสร้างลิสต์ด้วย list comprehension ครับ

ดาวน์โหลดโค้ดต่างๆใน Jupyter Notebook ได้ที่นี่ หรือดูออนไลน์ได้ที่นี่ครับ

วิทย์ม.ต้น: เขียนไพธอนหาตัวประกอบเลข, หัดใช้ set, คอมพิวเตอร์โบราณ, หัดเขียนฟังก์ชั่น

วันนี้เด็กม.2-3 หัดเขียนโปรแกรมหาตัวประกอบของเลขจำนวนเต็มกันครับ เด็กๆเอาไปทำที่บ้านสัปดาห์ที่แล้ว และส่วนใหญ่ก็คิดได้ว่าควรลองเอาตัวเลขไปหารดูว่าหารลงตัวไหม ถ้าหารลงตัวก็เป็นตัวประกอบ

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

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

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

โหลด Jupyter Notebook ได้ที่นี่ หรือดูออนไลน์ได้ที่นี่ครับ

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

การเขียนโปรแกรมสมัยก่อนใช้การต่อสายไฟต่างๆในคอมพิวเตอร์เข้าด้วยกัน:

การโปรแกรมคอมพิวเตอร์สมัย 1947 ชื่อ ENIAC ทำโดยการต่อสายไฟให้เหมาะสม ภาพนี้มาจาก http://www.history.com/news/coding-used-to-be-a-womans-job-so-it-was-paid-less-and-undervalued

และตัวอย่างการเขียนโปรแกรม Hello, World ในภาษาคอมพิวเตอร์ต่างๆ

และเด็กๆได้รู้จักคอมพิวเตอร์ที่ทำจากเฟืองอายุกว่า 2,000 ปี:

และคอมพิวเตอร์แบบเดียวกันแต่ต่อด้วย Lego:

จากนั้นเด็กๆก็หัดใช้ตัวแปรพวกจำนวนเต็ม เลขทศนิยม ข้อความ ลิสต์ และหัดเขียนฟังก์ชั่นบวกเลข 1 + 2 + 3 + … + n และอื่นๆกันครับ

โหลด Jupyter Notebook ได้ที่นี่ หรือดูออนไลน์ได้ที่นี่ครับ