โจทย์แมลงวันบินระหว่างรถ (Two Trains Puzzle) และโปรแกรมที่เกี่ยวข้อง

(เขียนเพื่อรวบรวมโพสท์ต่างๆที่กระจายอยู่บน Facebook และจะได้เป็นที่โหลดโปรแกรมไปลองเล่นครับ โปรแกรมเป็นภาษา Mathematica นะครับ โปรแกรมอยู่ที่นี่ ถ้าไม่มี Mathematica สามารถลองใช้ได้ที่นี่ ถ้าไม่คุ้นเคยกับภาษานี้ลองเข้าไปดูที่ผมเขียนแนะนำที่นี่ครับ ถ้าอยากเขียนใหม่เป็น Python อาจต้องใช้โมดูล SymPy ช่วยนะครับ ถ้าจะดูโค้ดแต่ไม่มี Mathematica กดตรงนี้เพื่อดูไฟล์ PDF ครับ )

สัปดาห์ที่ผ่านมีมีดราม่าเรื่องข้อสอบ กพ. ที่ว่ามีรถสองคันอยู่ห่างกัน 40 กิโลเมตรวิ่งเข้าหากัน คันหนึ่งวิ่ง 60 กม/ชม อีกคันวิ่ง 40 กม/ชม มีแมลงวันที่บินกลับไปกลับมาระหว่างรถด้วยความเร็ว 80 กม/ชม คำถามคือแมลงวันบินได้ระยะทางเท่าไรก่อนที่รถจะชนกัน ถ้าเราไม่ซีเรียสเรื่องแมลงวันที่ไหนที่บินได้เร็วอย่างนั้น แถมยังเปลี่ยนความเร็วได้ทันทีเมื่อแตะรถอีก วิธีคิดง่ายๆก็คือระยะทางระหว่างรถทั้งสองลดลงด้วยอัตรา 60+40 = 100 กม/ชม ถ้าตอนเริ่มต้นรถห่างกัน 40 กิโล รถจะอยู่ติดกันที่เวลา 40/100 = 0.4 ชั่วโมง ดังนั้นแมลงวันก็จะบินอยู่ 0.4 ชั่วโมงคิดเป็นระยะทาง = 0.4 ชั่วโมง x 80 กิโลเมตร/ชม = 32 กิโลเมตร  (โจทย์นี้เป็นที่รู้จักกันในนาม Two Trains Puzzle เป็นเวลานานมากแล้ว มีตำนานว่ามีคนเอาปัญหานี้ไปถาม John von Neumann ผู้เป็นอัจฉริยะด้านคณิตศาสตร์และคอมพิวเตอร์ คุณ von Neumann ตอบทันที คนถามบอกว่าอ๋อคงรู้วิธีคิดลัดละสิ คุณ von Neumann บอกว่าวิธีลับอะไร ก็บวกอนุกรมอนันต์ธรรมดาไง)

แต่วิธีแก้แบบนั้นมันง่ายเกินไป เราเลยวาดกราฟ spacetime ของรถและแมลงวัน และคำนวณค่า (t, x) ที่แมลงวันแตะรถแต่ละคัน แล้วเอาตำแหน่ง x มาหาว่าแมลงวันบินรวมกี่กิโลเมตร ทำอย่างนี้ไม่มีประโยชน์อะไรเลยกับการตอบเฉพาะปัญหานี้ แต่ถ้าเด็กๆคิดทำอย่างนี้จะได้รู้เรื่องกราฟเส้นตรง รูปแบบสมการเชิงเส้นเมื่อเรารู้ความชันและจุดที่วิ่งผ่านหนึ่งจุด ตำแหน่งคู่ลำดับที่เส้นตรงสองเส้นตัดกัน และวิธีแปลงความคิดของเราเป็นโปรแกรมครับ 

คุณ Atis Yosprakob ทำ animation เรื่องนี้ไว้ที่ http://ayosp.info ด้วยนะครับ

ต่อมาอาจารย์ทีปานิส ชาชิโยถามว่าถ้าความเร็วของแมลงวันวิ่งไปทางซ้ายและขวาไม่เท่ากัน ระยะทางจะเป็นอย่างไร:

ผมดัดแปลงโปรแกรมแล้วลองบวกระยะทางส่งไปให้อาจารย์ดู แล้วอาจารย์ก็แสดงสูตรและวิธีทำดังนี้ครับ:

วิธีนี้เป็นวิธีบวกอนุกรมอนันต์ครับ วิธีแบบนี้เป็นวิธีที่ผมพยายามทำแต่ทำผิดเลยได้คำตอบผิดๆไม่ตรงกับโปรแกรมครับ

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

วิธีนี้ดีที่ไม่แคร์กับอนุกรมอะไรทั้งสิ้น แค่คิดหาเวลาที่แมลงวันบินไปทางซ้าย และบินไปทางขวา ผมเห็นก็ตื่นเต้นมากเอาไปคุยกับเพื่อนผมคุณเก๊า ปวีญวิชช เกาศล คุณเก๊าบอกว่าเราไม่เห็นความเร็วของรถ B (VB) เลย แสดงว่ารถ B จะวิ่งยังไงก็ได้  ผมพยายามวาดกราฟการเคลื่อนที่ของรถ B หลายๆแบบก็พบว่าระยะทางที่แมลงวันบินไม่ขึ้นกับการเคลื่อนที่ของ B ตราบใดที่เวลาที่ใช้และจุดที่ชนคงที่ แต่สูตรข้างบนยังมีความเร็วของรถ A อยู่

หลังจากผมวาดกราฟไปสักพักผมก็สงสัยว่าจริงๆเราไม่ต้องใช้ความเร็วรถ A เลยนี่นา สิ่งที่สำคัญสำหรับการหาระยะทางมีแค่เวลาที่ใช้ทั้งหมด T และตำแหน่งที่รถชนกัน d กล่าวคือรถ A และ B จะวิ่งยังไงก็ได้ ตราบใดที่มันใช้เวลา T เพื่อมาชนกันที่ตำแหน่ง d, ระยะทางที่แมลงวันบินจะเท่ากับ:

S = ระยะทางที่แมลงวันบิน d = ตำแหน่งที่รถชนกัน T = เวลาที่รถชนกัน V1, V2 คืออัตราเร็วที่แมลงวันบินจากรถ A ไป B และจาก B ไป A
S = ระยะทางที่แมลงวันบิน d = ตำแหน่งที่รถชนกัน T = เวลาที่รถชนกัน V1, V2 คืออัตราเร็วที่แมลงวันบินจากรถ  A ไป  B และจากรถ  B ไป  A

ทั้งนี้รถทั้งสองคันต้องไม่เคยวิ่งแซงแมลงวันด้วยนะครับ (แปลว่าขนาด slope ของกราฟการเคลื่อนที่ของรถตอนแมลงวันไปถึงต้องไม่มากกว่าอัตราเร็วตอนแมลงวันบินหนีกลับมา)

วิธีแก้สมการก็ง่ายๆตรงไปตรงมาถ้าทำตามแบบอาจารย์สุจินต์ครับ ไม่ต้องบวกอนุกรมอนันต์ เป็นสมการเชิงเส้นสองตัวแปรสองสมการ:

T = เวลาที่รถชนกัน d = ตำแหน่งที่รถขนกัน t1 = เวลาทั้งหมดที่บินไปทางขวา t2 = เวลาทั้งหมดที่บินไปทางซ้าย
T = เวลาที่รถชนกัน
d = ตำแหน่งที่รถชนกัน
t1 = เวลาทั้งหมดที่บินไปทางขวา
t2 = เวลาทั้งหมดที่บินไปทางซ้าย

 

อันนี้เป็นสรุปในกระดาษทดหลังจากวาดกราฟดูไปเยอะๆครับ:

ตัวอย่างหน้าตากราฟการเคลื่อนที่แบบต่างๆที่แมลงวันบินระยะเท่ากันเพราะ T และ d เท่ากัน และรถไม่แซงแมลงวันครับ (T=0.4, d= 16):

หน้าตาโปรแกรมจะเป็นประมาณนี้ครับ โหลดได้ที่นี่นะครับ:

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

Leave a Reply

Your email address will not be published.

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