ฟิสิกส์ของเกมที่สมบูรณ์แบบ แม่นยำไม่สิ้นสุดใน Python (ตอนที่ 2)

Nov 27 2022
เปลี่ยนปรัชญาเป็นการเขียนโปรแกรมด้วยบิลเลียด
นี่คือบทความที่สองจากทั้งหมดสี่บทความที่แสดงให้คุณเห็นถึงวิธีการตั้งโปรแกรมเครื่องมือทางฟิสิกส์ที่สมบูรณ์แบบใน Python เป็นก้าวเล็กๆ ในความทะเยอทะยานอันยิ่งใหญ่ของฉันที่จะเปลี่ยนฟิสิกส์ คณิตศาสตร์ และแม้แต่ปรัชญาทั้งหมดให้เป็นการเขียนโปรแกรม
งูหลามกำลังเล่นบิลเลียด — ที่มา: https://openai.com/dall-e-2/

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

ในตอนที่ 1เราได้พัฒนากลไกทางฟิสิกส์ที่สมบูรณ์แบบในระดับสูงสุด จากนั้นเราก็นำไปใช้กับ Newton's Cradle วงกลมที่มีรูปสามเหลี่ยม และลูกเทนนิสกับลูกบาสเก็ตบอล

ในส่วนที่ 2 เราจะใช้เครื่องยนต์กับบางสิ่งที่ซับซ้อนมากขึ้น: การพังบิลเลียด (เมื่อฉันเห็นผลลัพธ์ พวกเขาเปลี่ยนความเข้าใจทางปรัชญาของฉันเกี่ยวกับโลก)

ลองนึกภาพลูกคิวบอลกระจายเป็นรูปสามเหลี่ยมของลูกบิลเลียด ถ้า — หลังจากพักนิดหน่อย — คุณสามารถกลับทิศทางของบอลทุกลูกได้ พวกเขาจะสร้างสามเหลี่ยมที่อยู่นิ่งขึ้นมาใหม่และคายลูกคิวบอลออกมาหรือไม่? กล่าวอีกนัยหนึ่ง จักรวาลของเรามีปุ่ม UNDO หรือไม่

เครื่องยนต์ฟิสิกส์โดยประมาณกับผีเสื้อ

เมื่อหกปีก่อน ฉันได้ทำการทดลอง ฉันใช้เครื่องมือทางฟิสิกส์โดยประมาณที่ไม่สมบูรณ์ ดังที่วิดีโอแสดง การทดสอบล้มเหลว สามเหลี่ยมกลับคืนรูปแต่ไม่ได้อยู่นิ่ง (หากต้องการเล่นซ้ำ/หยุดวิดีโอชั่วคราว ให้กดปุ่มที่มุมซ้ายล่าง)

ในตอนนั้น ฉันระบุว่าความล้มเหลวเกิดจากบัตเตอร์ฟลายเอฟเฟ็กต์ เอฟเฟกต์ผีเสื้อบอกว่าความแตกต่างเล็กน้อย (หรือการประมาณ) ในเงื่อนไขเริ่มต้นสามารถนำไปสู่ความแตกต่างขนาดใหญ่ในภายหลัง ความล้มเหลวของการทดลองเป็นแรงบันดาลใจให้บทกวีนี้:

ทุกอย่างผันกลับได้พูดว่า Newton
Stop เปลี่ยนทิศทาง ดำเนินการต่อ scootin'
Poincaré กล่าวว่า ไม่ เป้าหมายของเรามีขีดจำกัด
เราพยายามแล้ว แต่ไม่มีอะไรเหมือนเดิมได้

เครื่องยนต์ฟิสิกส์ที่สมบูรณ์แบบโดยไม่มีผีเสื้อ

เอ็นจิ้นฟิสิกส์ใหม่ของเราหลีกเลี่ยงเอฟเฟกต์ผีเสื้อ มันรู้ทุกเวลา ตำแหน่ง และความเร็วอย่างแน่นอน 175–9*sqrt(3)/2มันใช้นิพจน์เช่น ดังนั้น เราควรจะตีบิลเลียดกลับด้านได้ใช่ไหม? มาดูกัน. (หากต้องการเล่นซ้ำ/หยุดวิดีโอชั่วคราว ให้กดปุ่มที่มุมซ้ายล่าง เสียงจะมีประโยชน์)

มันยังใช้งานไม่ได้ สามเหลี่ยมกลับคืนรูปอีกครั้ง แต่ก็ไม่ได้อยู่ด้วยกัน สิ่งนี้ทำให้ฉันเศร้า อย่างไรก็ตาม ในฐานะโปรแกรมเมอร์ เราไม่ได้เศร้าใจ เราได้รับการดีบั๊ก ในกรณีนี้ เราต้องแก้ปัญหาโลก

เราจะเริ่มต้นด้วยการรันเหตุการณ์จำลองตามเหตุการณ์:

การขาดความสมมาตรทำให้คุณประหลาดใจหรือไม่? ในฐานะโปรแกรมเมอร์ เรารู้ขั้นตอนการดีบักถัดไป: สร้างตัวอย่างที่สามารถทำซ้ำได้น้อยที่สุด กล่าวอีกนัยหนึ่งคือหาตัวอย่างเล็ก ๆ ที่แสดงถึงปัญหาเดียวกัน

พิจารณาโลกสามวงกลมใบนี้ เราเรียกใช้สองครั้ง

ในเฟรมที่ 3 ให้ดูที่ลูกศรความเร็วของลูกคิวบอล ลูกศรชี้ไปในทิศทางต่างๆ โลกได้แยกจากกัน

เราสามารถติดตามสาเหตุไปยังเฟรมที่สอง ที่นาฬิกา = 14 ลูกคิวบอลกระทบอีกสองลูก แต่ลูกไหนโดนก่อนทันที? ไม่ว่าจะโดนอะไรก่อน จะได้รับพลังงานมากขึ้น ทำลายสมมาตร

ฉันได้ยินว่าคุณคัดค้านการจำลองโดยเลือกการชนกันเป็นอันดับแรก ทำไมไม่รักษาความสมมาตรด้วยการแบ่งปันพลังงานอย่างเท่าเทียมกัน? ก็เพราะ…

  • เราได้พูดถึงสามตัวเลือก — พลังงานสูงสุดสำหรับลูกบอล 1, พลังงานสูงสุดสำหรับลูกบอล 2 หรือพลังงานเท่ากัน อย่างไรก็ตาม โดยทั่วไปแล้ว ตัวจำลองต้องเผชิญกับตัวเลือกที่ต่อเนื่องไม่สิ้นสุด มันสามารถแบ่งพลังงานใน สัดส่วน ใดก็ได้ระหว่างลูกบอลทั้งสองในขณะที่ยังคงรักษาพลังงานและโมเมนตัม อะไรทำให้ "เท่าเทียมกัน" เป็นพิเศษ?
  • โอเค ฉันยอมรับว่าใน กรณี นี้ความ "เท่ากัน" อาจได้รับการพิสูจน์โดยความสมมาตร อย่างไรก็ตาม โดยทั่วไปจะไม่มีความสมมาตร พิจารณาการชนกันแบบไม่สมมาตรระหว่างวงกลมเคลื่อนที่สามวง ความสมมาตรจึงไม่มีคำตอบ
  • วงกลมสามวงชนกันแบบไม่สมมาตร

เมื่อสงสัย ให้ทำอะไรง่ายๆ ฉันมีโปรแกรมจำลองจัดการการชนกันหลายครั้งเป็นรายการการชนแบบคู่ จากนั้นจะประมวลผลแต่ละคู่ตามลำดับแบบสุ่ม ตัวอย่างเช่น เมื่อวงกลมสามวง — A, B, C — ชนกัน เรามีคู่ชนกันมากถึงสามคู่ — AB, BC, AC — ซึ่งสามารถเรียงลำดับได้ 3! นั่นคือ 6 วิธี

แม้แต่วิธีการง่ายๆ นี้ก็นำไปสู่ผลลัพธ์ที่เป็นไปได้จำนวนมาก ในโลกบิลเลียดที่มีลูกบอลสามเหลี่ยม 15 ลูก เครื่องยนต์มักจะเห็นการชนกัน 5 ถึง 7 คู่ (ดังนั้น 120 ถึง 5,040 ผลลัพธ์) นอกจากนี้ยังเห็นการชนกันของ 18 คู่ (ดังนั้น 18! หรือผลลัพธ์ 6,402,373,705,728,000)

ความรู้สึกโชคดี?

สิ่งนี้ทำให้เกิดคำถามใหม่ คุณสามารถพลิกบิลเลียดแตกได้ไหมถ้าคุณโชคดีมาก? ฉันเชื่อว่าคำตอบคือ “ใช่” เสมอ แต่ฉันไม่รู้ว่าจะพิสูจน์ได้อย่างไร อย่างไรก็ตาม สำหรับโลกที่มีลูกบอล 3 เหลี่ยม ฉันลองเมล็ดแบบสุ่มหลายๆ แบบ เมล็ดที่ 17 ที่ฉันลองได้ผล สร้างวิดีโอเหตุการณ์นี้:

และวิดีโอปกตินี้:

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

ตอนนี้เราสามารถตอบคำถามย้อนกลับได้: โลกที่สมบูรณ์แบบและแม่นยำไร้ขอบเขตสามารถย้อนกลับได้หรือไม่? เราได้เห็นแล้วว่าในทางปฏิบัติ คำตอบคือ “ไม่”

น่าแปลกใจที่นักฟิสิกส์ตอบว่า "ใช่" ยังไง? โดยแอบใช้คำจำกัดความที่แตกต่างกันของ "การย้อนกลับ" พวกเขากล่าวว่าระบบสามารถ "ย้อนกลับได้" หากมีโอกาสที่ระบบจะกลับสู่สถานะก่อนหน้า แม้ว่าโอกาสนั้นจะเป็นหนึ่งใน 6,402,373,705,728,000 หรือการเลือกหนึ่งจุดบนความต่อเนื่องที่ไม่มีที่สิ้นสุดก็ตาม

สรุปส่วนที่ 2

โลกไม่ได้กลับด้านในทางปฏิบัติ! ด้วยเครื่องมือทางฟิสิกส์ที่สมบูรณ์แบบของเรา เราได้ตอบคำถามทางปรัชญาแล้ว

ในตอนที่ 1เราได้พัฒนากลไกทางฟิสิกส์ที่สมบูรณ์แบบในระดับสูงสุดและนำไปใช้กับโลกต่างๆ เช่น ลูกเทนนิสและการหล่นของบาสเก็ตบอล

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

ต่อไป ในตอนที่ 3 เราจะดูวิธีทำให้คอมพิวเตอร์สร้างฟังก์ชัน Python สองตัวที่อยู่ภายใต้กลไก ในตอนที่ 4 เราจะเร่งเครื่องยนต์เล็กน้อย (แต่ยังไม่เพียงพอ) และหารือเกี่ยวกับข้อจำกัดต่างๆ

หากคุณมีไอเดียสำหรับการจำลองที่คุณต้องการให้ฉันดำเนินการ โปรดส่งมาให้ฉัน พวกเขาอาจกลายเป็นพื้นฐานของส่วนที่ 5

คุณสามารถดาวน์โหลดโค้ดนี้ได้จากCarlKCarlK/perfect-physics (github.com ) แจ้งให้เราทราบหากมีความสนใจและฉันจะสร้างตัวติดตั้งที่ดีกว่า

ติดตามCarl M. Kadie — สื่อสำหรับการแจ้งเตือนในส่วนต่อไป ทุกส่วนจะอ่านได้ฟรี สุดท้าย บน YouTube ฉันมีแบบจำลองทางฟิสิกส์ ที่เก่ากว่า (โดยประมาณ) และ วิดีโอเกี่ยวกับ ธรรมชาติที่พยายามจะตลกขบขัน