คอมขยายสมอง (1): ความน่าจะเป็นของสามเหลี่ยม

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

มีคำถามใน 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): ความน่าจะเป็นของสามเหลี่ยม”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.