ผมอยากบันทึกไว้ให้เด็กๆและผู้สนใจดูว่าเราประยุกต์ใช้วิชาการคำนวณด้วยคอมพิวเตอร์กับปัญหาต่างๆอย่างไรบ้าง และทำไมการใช้คอมพิวเตอร์แบบนี้ทำให้เราเห็นและเข้าใจสิ่งต่างๆดีขึ้น หวังว่าโพสต์นี้จะเป็นโพสต์แรกในหลายๆโพสต์ที่จะตามมาในอนาคตครับ
มีคำถามใน YouTube ว่าถ้ามีเส้นตรงหนึ่งเส้น แล้วแบ่งเป็นสามส่วนแบบสุ่มๆ จะมีโอกาสเท่าไรที่ทั้งสามส่วนจะประกอบกันเป็นสามเหลี่ยมได้พอดี:
วิธีในวิดีโอใช้ทฤษฎีบทของวิเวียนนี (Viviani’s Theorem) ที่บอกว่าสำหรับสามเหลี่ยมด้านเท่าใดๆและจุดใดๆภายในสามเหลี่ยมนั้น ผลรวมของระยะห่างจากจุดไปยังด้านทั้งสามของสามเหลี่ยม จะเท่ากับความสูงของสามเหลี่ยม ทฤษฎีบทนี้แสดงว่าเมื่อแบ่งเส้นตรงเป็นสามส่วน ความน่าจะเป็นที่ทั้งสามส่วนจะประกอบเป็นสามเหลี่ยมพอดีคือ 1/4
แต่ถ้าเราไม่เคยรู้จักทฤษฎีบทของวิเวียนนี(หรือวิธีอื่นๆ) เราจะแก้ปัญหานี้ได้อย่างไรได้บ้าง? วิธีแบบหนึ่งก็คือทำการทดลองตรงๆครับ โดยเราทดลองแบ่งเส้นตรงเป็นสามส่วนแบบสุ่มๆหลายๆครั้งแล้วดูว่าสามารถสร้างเป็นสามเหลี่ยมได้กี่ครั้ง อัตราส่วนครั้งที่เป็นสามเหลี่ยมต่อจำนวนครั้งที่ทดลองทั้งหมดจะเป็นคำตอบโดยประมาณให้เราได้
ถ้าเราทดลองด้วยมือ เราก็จะทดลองได้ไม่กี่ครั้งก่อนที่จะเหนื่อยหรือหมดเวลา แต่ถ้าเราสั่งคอมพิวเตอร์ให้ทำงานแทนเราได้ คอมพิวเตอร์จะทดลองให้เราได้อย่างรวดเร็วและไม่เหน็ดเหนื่อย วิธีตระกูลนี้(ที่ให้คอมพิวเตอร์ทำการทดลองต่างๆแทนเราแล้วเราไปดูคำตอบ)เรียกว่า computer simulation
ยกตัวอย่างฟังก์ชั่นภาษาไพธอนที่ทำการทดลองให้เราอาจมีหน้าตาประมาณนี้ จริงๆตัวโปรแกรมมีไม่กี่บรรทัดแต่มีคอมเม้นท์อธิบายเยอะหน่อยเผื่อเป็นประโยชน์สำหรับผู้เรียนรู้ครับ:
import random def prob_triangle(ntrials): """ ประมาณความน่าจะเป็นที่เส้นตรงที่ถูกแบ่งเป็นสามส่วนแบบสุ่มๆ จะสามารถประกอบเป็นสามเหลี่ยมได้ ทำการทดลอง ntrials ครั้ง """ # ntriangles เก็บจำนวนครั้งที่ประกอบเป็นสามเหลี่ยมได้ ntriangles = 0 # ทำการทดลองแบ่งเส้นตรงความยาว 1 หน่วยเป็นสามส่วน # ทั้งหมดntrials ครั้ง for n in range(ntrials): # x, y คือตำแหน่งที่เราสุ่มตัดเส้นตรงสองตำแหน่ง # ทำให้แบ่งเส้นตรงเป็นสามส่วน # เราจะเรียงตำแหน่งให้ x <= y # ถ้าไม่เป็นอย่างนั้นเราจะสลับ x และy x = random.random() y = random.random() if x > y: x, y = y, x # เมื่อเราสุ่ม x, y มาตัดเส้นตรงได้แล้ว # เราจะมีเส้นตรงสามชิ้นยาว x, y-x, และ 1-y # เราจะเรียกชิ้นที่ยาวที่สุดว่า longest longest = max(x, y-x, 1-y) # ถ้าชิ้นที่ยาวที่สุดมีความยาวไม่เกิน 1/2 ของ # ความยาวเส้นตรงดั้งเดิม เราจะสามารถเอา # ทั้งสามชิ้นมาประกอบเป็นสามเหลี่ยมได้ # และเราก็จะเพิ่มจำนวนครั้งที่ประกอบเป็นสามเหลี่ยมสำเร็จ if longest < 0.5: ntriangles += 1 # ประมาณความน่าจะเป็นที่เป็นสามเหลี่ยมสำเร็จ # เท่ากับ (จำนวนสามเหลี่ยม)/(จำนวนครั้งที่ทดลอง) return ntriangles/ntrials
เมื่อเราบอกให้คอมพิวเตอร์ทดลองให้เราหลายๆครั้ง (เช่นในที่นี้คือ 1 แสนครั้ง) เราก็จะได้คำตอบมาประมาณ 1/4 ดังนี้:
ntrials = 100_000 print(f"ทดลองแบ่งเส้นตรงแบบสุ่มๆเป็นสามชิ้นทั้งหมด {ntrials:,} ครั้ง") print("แล้วดูว่าทั้งสามชิ้นสามารถประกอบเป็นสามเหลี่ยมได้ไหม\n") print(f"ความน่าจะเป็นที่ได้สามเหลี่ยม = {prob_triangle(ntrials):.2f}")
ผลที่ได้คือ:
ทดลองแบ่งเส้นตรงแบบสุ่มๆเป็นสามชิ้นทั้งหมด 100,000 ครั้ง แล้วดูว่าทั้งสามชิ้นสามารถประกอบเป็นสามเหลี่ยมได้ไหม ความน่าจะเป็นที่ได้สามเหลี่ยม = 0.25
วิธีตระกูล computer simulation นี้เป็นวิธีสำคัญที่มนุษยชาติใช้หาคำตอบต่างๆครับ ในหลายๆกรณีมนุษยชาติยังไม่มีความรู้ที่จะหาคำตอบโดยตรงด้วยทฤษฎีต่างๆ ก็หาคำตอบโดยให้คอมพิวเตอร์คำนวณหรือทำการทดลองให้
หวังว่าผู้อ่านจะได้ไอเดียหรือประโยชน์บ้างนะครับ ถ้ามีคำแนะนำหรือข้อสงสัยส่งข้อความอินบ๊อกซ์ไปที่เพจวิทย์พ่อโก้บนเฟซบุ๊คได้ครับ: https://www.facebook.com/witpokosci/
(ตอนต่อไปอยู่ที่ https://witpoko.com/?p=7499 นะครับ)
2 thoughts on “คอมขยายสมอง (1): ความน่าจะเป็นของสามเหลี่ยม”