ผมอยากบันทึกไว้ให้เด็กๆและผู้สนใจดูว่าเราประยุกต์ใช้วิชาการคำนวณด้วยคอมพิวเตอร์กับปัญหาต่างๆอย่างไรบ้าง และทำไมการใช้คอมพิวเตอร์แบบนี้ทำให้เราเห็นและเข้าใจสิ่งต่างๆดีขึ้น หวังว่าโพสต์นี้จะเป็นโพสต์แรกในหลายๆโพสต์ที่จะตามมาในอนาคตครับ
มีคำถามใน 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 นะครับ)