ทำไม RK4 ถึงดีกว่าการรวมออยเลอร์? [ปิด]


20

ในตอนท้ายของสไลด์ที่ยิ่งใหญ่เหล่านี้ผู้เขียนเปรียบเทียบผู้รวมระบบที่แตกต่างกันทั้งหมดที่นำเสนอ ไม่ทางใดก็ทางหนึ่งพวกเขาทั้งหมดสั้นยกเว้นการปรับปรุงการรวมออยเลอร์และการรวมRunge Kutta 4ซึ่งทั้งสองผ่านการทดสอบทั้งหมด

ฉันคิดว่าฉันควรจะพูดถึงว่าฉันกำลังทำงานในเกม 2D ที่มีวิชาฟิสิกส์ไม่มาก ฉันแค่อยากรู้ว่าการรวมออยเลอร์ที่ปรับปรุงแล้วจะสั้นและ RK4 จะต้องใช้แทน

เกมของฉันประกอบด้วยแรงโน้มถ่วงง่ายๆ (กระโดดและล้ม) เคลื่อนไหวตามแนวแกน X และ Y และการชนกันของกล่องสี่เหลี่ยม มันคุ้มค่าหรือไม่ที่จะนำ RK4 ไปใช้หรือจะปรับปรุงออยเลอร์ให้เพียงพอหรือไม่? ฉันเห็นการสนทนาจำนวนมากที่ผู้ใช้ของ Euler Integration ถูกตีสอน แต่จากสิ่งที่ฉันเห็นการปรับปรุง Euler ที่ปรับปรุงนั้นมีความสำคัญในเรื่อง 2D ง่าย ๆ ฉันคิดว่ามันจะเร็วขึ้นด้วย


offtopic แต่พื้นที่เหล่านั้นสไลด์ที่ยอดเยี่ยมชัดเจนมากกับตัวอย่างและทั้งหมด ขอบคุณสำหรับลิงค์!
Roy T.

ถ้าเรื่องนี้เป็นจริงปิดหัวข้อนี่ก็อาจจะเป็นแบบที่ดีในการคำนวณวิทยาศาสตร์
David Z

นอกจากนี้: การรวม Verlet ที่ถูกต้องตามเวลา - ดูคล้ายกับ Euler ที่ได้รับการปรับปรุง: ขี้เกียจเกินกว่าที่จะเข้าใจว่ามันเหมือนกันทุกประการ TCV นั้นยอดเยี่ยมเพราะคุณสามารถผ่อนปรนกับขั้นตอนเวลาที่แน่นอนของคุณ (ผู้รวมระบบรายอื่นต้องการขั้นตอนเวลาแบบคงที่ที่รับประกันได้)
Jonathan Dickinson

1
ไม่สามารถแก้ไขได้: ฉันเห็นว่าเขาพูดถึง ฉันไม่แน่ใจว่าการใช้งานของเขาถูกบั๊กในแง่ของข้อกำหนดเงื่อนไขเริ่มต้นตามที่ระบุไว้ในบทความ: แต่ฉันไม่เคยเห็นปัญหาแรงโน้มถ่วงนั้นมาใช้กับการใช้ TCV ของฉันหากฉันคำนวณเงื่อนไขเริ่มต้นอย่างถูกต้อง
Jonathan Dickinson

คำตอบ:


15

โดยส่วนตัวฉันชอบVelocity Verletสำหรับการจำลองส่วนใหญ่ จากประสบการณ์ของฉันด้วยวิธีนี้มันค่อนข้างเหมาะสำหรับสมการที่ค่อนข้างแข็ง ดูเหมือนว่าวันนี้ "ออยเลอร์ที่ดีขึ้น" วิธีการคือสวยคล้ายกับความเร็ว Verlet หนึ่งและอาศัยอยู่กับระดับของวิธีบูรณาการที่เรียกว่าการทำนาย-แก้ คุณสามารถอ่านหลายสิ่งหลายอย่างเกี่ยวกับวิธีการเหล่านี้ในปัจจุบันโดยเริ่มจาก "ขั้นตอนขนาดใหญ่ในการจำลองผ้า" ของ David Baraffซึ่งพลังของวิธีการโดยนัยส่องแสงจริงๆ ความพินาศของพวกเขาคือคุณ:

  1. ต้องประมาณ Jacobians หรือ Hessians แล้วต้อง
  2. คำนวณจำนวนเมทริกซ์ผกผันต่อเฟรม

ดังนั้นถ้าคุณไม่ใช่กูรูด้านคณิตศาสตร์คุณอาจทำให้นิ้วติดค้างได้ เพียงแค่ทดสอบด้วยวิธีใดก็ตามที่คุณต้องการจากนั้นชำระให้กับวิธีที่ดีที่สุดสำหรับคุณ ความเรียบง่ายนั้นไม่ได้ดีกว่าเสมอไป แต่สำหรับผู้ใช้เฟรมเฟรมโต้ตอบฉันรู้เพียงคำเดียวเท่านั้น

แหล่งข้อมูลเพิ่มเติมบางอย่างที่คุณอาจต้องการดู:

Jakobsen เป็นอัจฉริยะในการคิดหาวิธีแก้ปัญหาแบบง่าย ๆ (ความสามารถพิเศษของเขาคือการเข้ารหัสหากไม่ผิดพลาด แต่เขาประสบความสำเร็จในการพิสูจน์ความเท่าเทียมทางคณิตศาสตร์ของวิธีการของเขาในคลาสของ Gauss-Seidel algorithm อัลกอริธึม ) สำหรับความเรียบง่ายไปก่อนนี้ก่อนที่จะเจาะลึกลงไปในวิธีการโดยนัย

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


1
+1 นี่เป็นคำตอบที่มีคุณภาพที่ดีจริง ๆ ในแง่ของเนื้อหา: แต่มันยากที่จะแยกย่อย (วอลล์ของข้อความ) ยากเกินไป ฉันพบว่าการจัดรูปแบบที่ดีจะช่วยให้ได้คะแนนมากขึ้นเสมอ ฉันปรับปรุงมันและหวังว่าคุณจะได้รับคะแนนโหวตที่คุณสมควรได้รับ
Jonathan Dickinson

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

10

ถาม: ทำไมจึงใช้ Runge Kutta ขั้นสูง
ตอบ: เพราะแน่นอนมาก

ถาม: ทำไมไม่
ตอบ: เนื่องจากคุณกำลังสร้างเกมและเอนจินทางฟิสิกส์ที่แม่นยำไม่สำคัญมันแค่ต้องดีพอที่จะหลอกผู้เล่น

อย่างไรก็ตามถ้าคุณมีแรงกระแทกหนักจากการชนเช่นเดียวกับ platformers ส่วนใหญ่ออยเลอร์ที่เรียบง่ายก็ไม่เป็นไร

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

velocity += 0.5 * acceleration;
position += velocity;
velocity += 0.5 * acceleration;

สิ่งที่นำเสนอไม่แสดงคือวิธีจัดการกับการชนเพื่อให้วัตถุไม่ปรากฏเกินขอบเขต ทางออกที่ง่ายสำหรับปัญหานั้นคือการใช้ความถี่ในการอัพเดทสูง วิธีแก้ปัญหาที่ซับซ้อนกว่า แต่มีประสิทธิภาพที่ดีกว่าคือการย้ายวัตถุกลับมาในเวลาที่เกิดการชนการใช้งานที่แน่นอนขึ้นอยู่กับพฤติกรรมทางฟิสิกส์ที่ต้องการ


1
+1 สำหรับ "หลอกผู้เล่น" - แต่ฉันเองมีระบบ 'ง่ายมาก' ระเบิดเนื่องจากการรวมออยเลอร์
Jonathan Dickinson

@JanathanDickinson ฉันบอกว่ามันไม่ใช่เพราะการรวมออยเลอร์ แต่เป็นเพราะการผสมผสานของสถานการณ์การรวมออยเลอร์เป็นเพียงหนึ่งในพวกเขา หากคุณมีตัวอย่างฉันแน่ใจว่าฉันสามารถหาวิธีหลีกเลี่ยงระบบระเบิดได้
aaaaaaaaaaaa

โอ้มันเป็นของ VB6 ที่เก่าแก่จริงๆ (เมื่อฉันอายุประมาณ 14 ปี) ของฉันก่อนที่ฉันจะเรียนรู้เกี่ยวกับ RK / Verlet - ฉันไม่มีรหัสอีกต่อไป: ซึ่งให้ความเชื่อมั่นอย่างมากกับความจริงที่ว่ามันอาจเป็นอย่างอื่น ในการผสม :)
Jonathan Dickinson

1
ฉันคิดว่าฉันควรจะเพิ่มสิ่งนั้นทันทีที่คุณเริ่มล้อเล่นกับสิ่งดึงดูดระหว่างวัตถุมากกว่าแรงโน้มถ่วงอย่างง่ายมันดูสมเหตุสมผลสำหรับฉันที่จะเพิ่มวิธีการรวมมันอาจไม่จำเป็นอย่างเคร่งครัด แต่ถ้าคุณมีพลังการประมวลผล ข้อเสียเพียงอย่างเดียวคือรหัสที่ซับซ้อนกว่าเล็กน้อย
aaaaaaaaaaaa

1

การนำเสนอมีข้อผิดพลาด วิธีการที่ผู้ประกาศเรียกว่า "Improved Euler" เป็นวิธีการ Velocity Verlet!

ดูที่นี่สำหรับแหล่งข้อมูลที่เชื่อถือได้เพิ่มเติม: http://www.physics.udel.edu/~bnikolic/teaching/phys660/numerical_ode/node5.html

สมการเดียวกันก็อยู่ในวิกิพีเดียเช่นกัน

การปรับปรุงวิธีทั่วไปของออยเลอร์คือวิธีการจุดกึ่งกลางซึ่งสิ่งที่ผู้นำเสนออาจมีอยู่ในใจ ข้อแตกต่างระหว่างวิธี Midpoint และ Velocity Verlet คือความเร็วนั้นเป็นค่าเฉลี่ยของการเร่งครั้งสุดท้ายและครั้งต่อไปแทนที่จะขึ้นอยู่กับการเร่งความเร็วครั้งสุดท้าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.