เชิญเล่นเกมวงโคจรดาวครับ เปิดหน้านี้: https://witpoko.com/p/orbital-lab.html หรือสแกนคิวอาร์โค้ดนี้:
1. คลิกแล้วลากบนพื้นที่ว่างเพื่อยิงดาวเคราะห์ดวงใหม่
2. ยิ่งลากยาว ยิ่งยิงแรง
3. พยายามสร้างวงโคจร!
เกมนี้จำลองแรงโน้มถ่วงระหว่างดาวฤกษ์และดาวเคราะห์ด้วยกฎแรงโน้มถ่วงและกฎการเคลื่อนที่ของนิวตัน มีลูกศรสีแดงแสดงแรงดึงดูดต่อดาวเคราะห์และลูกศรสีฟ้าแสดงความเร็วของดาวเคราะห์)
มีโปรแกรมในกลุ่มเดียวกันอีกสี่ตัวด้วยครับ:
1. วงโคจรของมวลสองมวลที่ดึงดูดกันด้วยแรงโน้มถ่วง: https://witpoko.com/p/2-body-gravity.html
2. วงโคจรของมวลสามมวลที่ดึงดูดกันด้วยแรงโน้มถ่วง (Three-Body Problem): https://witpoko.com/p/3-body-gravity.html
3. วงโคจรของดาวหาง (สมมุติว่าดาวหางไม่ดึงดูดกันเอง): https://witpoko.com/p/comets-gravity.html
4. วงโคจรของดาวเคราะห์ (ทุกดาวดึงดูดกัน): https://witpoko.com/p/planets-gravity.html
ยุคก่อนเซอร์ไอแซก นิวตัน มนุษยชาติยังไม่มีวิทยาศาสตร์แบบแม่นยำครับ ความรู้ต่างๆยังเป็นสิ่งที่สังเกตว่าเป็นจริงแต่ไม่รู้สาเหตุว่าทำไมถึงเป็นอย่างนั้น แต่เมื่อนิวตันตีพิมพ์หนังสือ Philosophiæ Naturalis Principia Mathematica เมื่อปี 1687 มนุษยชาติก็พัฒนาไปอีกก้าวหนึ่ง เราเริ่มเข้าใจการทำงานของธรรมชาติได้ลึกซึ้งขึ้น สามารถคำนวณเรื่องแรงและการเคลื่อนที่ต่างๆรวมไปถึงการโคจรของดวงดาวด้วยครับ ความรู้ของมนุษยชาติเริ่มเข้าสู่ยุคที่สามารถทำนายว่าจะเกิดอะไรขึ้นบ้าง อย่างไร อย่างถูกต้อง และมีรายละเอียด
กฎการเคลื่อนที่ของนิวตันมีหน้าตาประมาณนี้ครับ:
1. สิ่งของต่างๆจะอยู่เฉยๆ หรือเคลื่อนที่ไปเรื่อยๆเป็นเป็นเส้นตรงด้วยความเร็วเท่าเดิมถ้าไม่มีอะไรไปทำอะไรมัน
2. ปริมาณการเคลื่อนที่ (โมเมนตัม = ผลคูณของมวลกับความเร็ว) จะเปลี่ยนได้ก็เมื่อมี “แรง” มาทำให้มันเปลี่ยน อัตราการเปลี่ยนแปลงของโมเมนตัมคือแรง
3. เมื่อวัตถุ A ไปออกแรงกับอีกวัตถุ B วัตถุ B ก็จะออกแรงกับวัตถุ A ด้วย ด้วยแรงขนาดเท่ากันแต่มีทิศทางตรงกันข้าม
นอกจากนี้นิวตันยังค้นพบด้วยว่าแรงโน้มถ่วงระหว่างวัตถุสองชิ้นที่มีมวล M และ m และอยู่ห่างกัน r จะมีขนาดแปรผันกับ M m / r2 ครับ โดยที่ทิศทางแรงจะอยู่ในแนวที่เชื่อมมวลทั้งสอง
จากหลักการเหล่านี้เราสามารถคำนวณว่าวัตถุที่มีมวล m จะเคลื่อนที่อย่างไรโดยการดูว่ามีแรงอะไรกระทำกับวัตถุบ้าง ( = F ) แล้วเราก็คำนวณความเร่ง ( =a คืออัตราความเปลี่ยนแปลงของความเร็ว = F/m ) แล้วเราก็คำนวณว่าความเร็ว v เปลี่ยนไปอย่างไรในเวลาสั้นๆ dt (คือ v กลายเป็น v + a dt เมื่อเวลาเปลี่ยนไป dt) แล้วเราก็คำนวณตำแหน่ง x จากความเร็ว (x กลายเป็น x + v dt) แล้วก็วนกลับไปคำนวณแรงใหม่เป็นรอบการคำนวณต่อไปเรื่อยๆ วิธีอย่างนี้ใช้เทคนิค Calculus ที่นิวตันตีพิมพ์ในหนังสือข้างบน หรือให้คอมพิวเตอร์คอยคำนวณให้เราก็ได้ครับ
ในโปรแกรมจำลองนี้ เราใช้วิธีการคำนวณเชิงตัวเลขที่เรียกว่า “Semi-Implicit Euler Method” (หรือเรียกอีกชื่อว่า Symplectic Euler หรือ Euler-Cromer)
วิธีนี้เป็นวิธีที่นิยมใช้ในการจำลองฟิสิกส์พื้นฐาน โดยเฉพาะเรื่องแรงโน้มถ่วงและการโคจร เนื่องจากมีความเสถียรมากกว่าวิธี Euler แบบปกติ และเขียนโค้ดได้ง่าย
ขั้นตอนการทำงานของโปรแกรม (อ้างอิงจากฟังก์ชัน update ในโค้ด):
1. คำนวณความเร่ง (Acceleration)
ใช้กฎแรงดึงดูดระหว่างมวลของนิวตัน: F = G * (m1 * m2) / r^2
หาความเร่งจาก a = F / m
ในโค้ด:
แรง (Force) = (ค่าคงที่ G * มวลดวงอาทิตย์) / ระยะทางยกกำลังสอง
ความเร่งแกน X = แรง * (ระยะทางแกน X / ระยะทางรวม)
ความเร่งแกน Y = แรง * (ระยะทางแกน Y / ระยะทางรวม)
2. อัปเดตความเร็ว (Velocity) จุดสำคัญ
เราจะเอาความเร่งที่เพิ่งคำนวณได้ มาบวกเพิ่มเข้าไปในความเร็วปัจจุบันทันที
สูตร:
ความเร็วใหม่ = ความเร็วเดิม + (ความเร่ง * เวลา)
ในโค้ด:
planet.vx += ax * timeScale;
planet.vy += ay * timeScale;
3. อัปเดตตำแหน่ง (Position)
เราจะใช้ “ความเร็วใหม่” (ที่เพิ่งคำนวณในข้อ 2) มาคำนวณหาตำแหน่งใหม่
สูตร:
ตำแหน่งใหม่ = ตำแหน่งเดิม + (ความเร็วใหม่ * เวลา)
ในโค้ด:
planet.x += planet.vx * timeScale;
planet.y += planet.vy * timeScale;
ทำไมถึงใช้วิธีนี้?
ถ้าใช้วิธี Euler ปกติ (Forward Euler) เราจะใช้ความเร็ว “เดิม” มาคำนวณตำแหน่ง ซึ่งจะทำให้เกิดความผิดพลาดสะสม พลังงานในระบบจะเพิ่มขึ้นเรื่อยๆ ทำให้วงโคจรค่อยๆ บานออกเป็นก้นหอย (Spiraling out) จนดาวหลุดวงโคจรไปเอง
วิธี Semi-Implicit Euler เป็นวิธีแบบ “Symplectic” (อนุรักษ์พื้นที่เฟส) ซึ่งช่วยรักษาสมดุลพลังงานของวงโคจรได้ดีกว่ามาก ทำให้ดาวเคราะห์สามารถโคจรเป็นวงกลมหรือวงรีได้อย่างเสถียรโดยไม่หลุดออกไปง่ายๆ แม้จะคำนวณไปเป็นเวลานานครับ
