กำลังมองหาลำดับที่ 8 ของ Runge-Kutta ใน C / C ++


10

ฉันต้องการใช้วิธีการสั่งซื้อลำดับที่ 8 ของ Runge-Kutta (89) ในแอปพลิเคชันกลศาสตร์ท้องฟ้า / แอสโตรไดนามิคส์ที่เขียนด้วยภาษา C ++ โดยใช้เครื่อง Windows ดังนั้นฉันจึงสงสัยว่าใครจะรู้ว่ามีไลบรารี / การนำไปใช้ที่ดีซึ่งจัดทำเอกสารและใช้งานได้ฟรี? มันก็โอเคถ้ามันเขียนใน C ตราบใดที่ไม่มีปัญหาในการคอมไพล์

จนถึงตอนนี้ฉันได้พบห้องสมุดนี้ (mymathlib)แล้ว รหัสดูเหมือนว่าใช้ได้ แต่ฉันไม่พบข้อมูลเกี่ยวกับสิทธิ์ใช้งาน

คุณสามารถช่วยฉันด้วยการเปิดเผยตัวเลือกที่คุณอาจรู้จักและเหมาะสมกับปัญหาของฉัน

แก้ไข:
ฉันเห็นว่าไม่มีรหัสแหล่ง C / C ++ มากมายตามที่คาดไว้ ดังนั้นเวอร์ชัน Matlab / Octave ก็ใช้ได้เช่นกัน (ยังต้องใช้งานได้ฟรี)

คำตอบ:


8

ทั้งGNU Scientific Library (GSL) (C) และBoost Odeint (C ++) มีลำดับที่ 8 วิธี Runge-Kutta

ทั้งคู่เป็น opensource และภายใต้ linux และ mac พวกเขาควรจะพร้อมใช้งานโดยตรงจากตัวจัดการแพคเกจ ในหน้าต่างคุณอาจใช้ Boost ได้ง่ายกว่า GSL

GSL เผยแพร่ภายใต้ลิขสิทธิ์ GPL และ Boost Odeint ภายใต้สิทธิ์ใช้งาน Boost

แก้ไข: Ok, Boost Odeint ไม่มีวิธี Runge-Kutta 89 เพียง 78 แต่มีสูตรสำหรับการทำ Stege Runge-Kutta โดยพลการ

อย่างไรก็ตามวิธีการสั่งซื้อลำดับที่ 8 นั้นค่อนข้างสูงและน่าจะเป็นปัญหามากเกินไปสำหรับปัญหาของคุณ

Prince-Dormandหมายถึง Runge-Kutta ชนิดหนึ่งและไม่เกี่ยวข้องโดยตรงกับคำสั่ง แต่ส่วนใหญ่คือ 45 Matlabs ode45 ซึ่งเป็นอัลกอริทึม ODE ที่แนะนำคือการใช้งาน Prince-Dormand 45 นี่คือขั้นตอนวิธีการเช่นเดียวกับการดำเนินการใน Boost Odeint Runge_Kutta_Dopri5


1
ขอบคุณสำหรับคำตอบ. ตกลงที่น่าอายตอนนี้ฉันได้ดู Boost Odeint ก่อนถามที่นี่และพบเฉพาะ "runge_kutta_fehlberg78" นี่เป็นสิ่งที่ถูกต้องหรือไม่ จริงๆแล้วฉันไม่ทราบถึงความแตกต่างระหว่าง methonds เมื่อใช้ในทางปฏิบัติ แต่ฉันกำลังมองหา RK89 (เรียกว่า Dormand-Prince ในขณะที่ฉันค้นหาอินเทอร์เน็ต) คุณสามารถแสดงความคิดเห็นหรือขยายคำตอบของคุณเกี่ยวกับเรื่องนี้ได้ไหม ขอบคุณ.
James C

อัปเดตโพสต์เพื่อตอบคำถามของคุณ Prince-Dormand 45 จะแก้ปัญหาของคุณได้ดีที่สุด
LKlevin

15

หากคุณกำลังใช้กลไกท้องฟ้าในระยะเวลานานการใช้ Integrator แบบคลาสสิกของ Runge-Kutta จะไม่ประหยัดพลังงาน ในกรณีนี้การใช้ตัวรวมระบบแบบ symplectic น่าจะดีกว่า Boost.odeint ยังใช้รูปแบบลำดับที่ 4 แบบ symplectic Runge-Kutta ซึ่งจะทำงานได้ดีขึ้นเป็นระยะเวลานาน GSL ไม่ได้ใช้วิธี symplectic ใด ๆ เท่าที่ฉันสามารถบอกได้


ขอบคุณสำหรับคำตอบ. Runge-Kutta ลำดับที่ 4 น่าจะให้ผลลัพธ์ที่ดีกว่า RKF78 ถ้าใช้กับดาวเทียม Earth (วงโคจรต่ำและวงโคจรอวกาศที่ลึกกว่า) บางทีในช่วง 1-3 วงโคจร?
James C

@JamesC ใช่ ในระยะยาววิธี symplectic ดีกว่ามาก
eccstartup

@eccstartup - คุณจะพิจารณาอะไรเป็นระยะเวลานานที่นี่? เพราะมันอาจจะยาวเท่ากับหนึ่งวงโคจรของดาวเคราะห์รอบดวงอาทิตย์หรือวงโคจรของดาวเทียมสภาพอากาศรอบโลก ฯลฯ
James C

@ JamesC ฉันไม่ได้สังเกตว่ามีปัญหาใหญ่ แต่สำหรับปัญหาของแบบจำลองของฉันด้วยการคำนวณวงโคจรจำนวนมากวิธี symplectic ให้วงโคจรที่สมบูรณ์แบบมาก
eccstartup

ดังนั้นจึงเป็นคำแนะนำในการตั้งโปรแกรมให้คุณเป็นเจ้าของเวอร์ชั่นของวิธี Runge-Kutta โดยปริยายซึ่งรวมถึงวิธี symplectic จำนวนมากที่มีลำดับสูงกว่าที่คุณต้องการ
eccstartup

4

สรุปบางประเด็น:

  1. หากเป็นการรวมตัวกันในระยะยาวของตัวแบบที่ไม่ dissapative ตัวรวบรวมแบบ symplectic คือสิ่งที่คุณกำลังมองหา
  2. มิฉะนั้นเนื่องจากมันเป็นสมการการเคลื่อนที่วิธี Runge-Kutta Nystrom จะมีประสิทธิภาพมากกว่าการแปลงเป็นระบบลำดับแรก มีวิธีการสั่งซื้อ RKN สูงเนื่องจาก DP มีการใช้งานบางอย่างเช่นมีที่นี่ในจูเลียพวกเขาได้รับการบันทึกและนี่เป็นหนึ่งใน MATLAB
  3. วิธี Runge-Kutta ลำดับสูงนั้นจำเป็นเฉพาะเมื่อคุณต้องการโซลูชันที่มีความแม่นยำสูง หากความคลาดเคลื่อนต่ำกว่าลำดับที่ 5 RK น่าจะเร็วกว่า (สำหรับข้อผิดพลาดเดียวกัน) สิ่งที่ดีที่สุดที่จะทำถ้าคุณจำเป็นต้องแก้ปัญหานี้บ่อยครั้งคือการทดสอบวิธีการต่าง ๆ มากมาย ในชุดข้อมูลอ้างอิงเกี่ยวกับปัญหา 3 ตัวนี้เราเห็นว่า (สำหรับข้อผิดพลาดเดียวกัน) วิธีการลำดับ RK ที่สูงนั้นเป็นเพียงการปรับปรุงความเร็วเล็กน้อย แต่เป็นข้อผิดพลาด -> 0 คุณจะเห็นว่าการปรับปรุงนั้นไปถึง> 5x กับ Dormand -Prince 45 ( DP5) เมื่อคุณดูที่ความแม่นยำ 4 หลัก (ความคลาดเคลื่อนต่ำกว่านี้ แต่ความอดทนเป็นเพียงสนามเบสบอลในทุกปัญหา) ในขณะที่คุณดึงค่าความคลาดเคลื่อนลดลงการปรับปรุงจากวิธี RK ที่มีลำดับสูงขึ้นจะเพิ่มขึ้น แต่คุณอาจต้องเริ่มใช้ตัวเลขที่มีความแม่นยำสูงกว่า
  4. อัลกอริธึมการสั่งซื้อดอร์มานด์ - พรินซ์ 7/8 มีค่าลำดับที่ 8 แตกต่างจากวิธี DP853 ของ Hairer's dop853และ DifferentialEquations.jl's DP8(ซึ่งเหมือนกัน) วิธี 853 หลังไม่สามารถนำมาใช้ในเวอร์ชัน tableau มาตรฐานของวิธี Runge-Kutta เนื่องจากตัวประมาณค่าความผิดพลาดนั้นไม่ได้มาตรฐาน แต่วิธีนี้มีประสิทธิภาพมากกว่าและฉันก็ไม่แนะนำให้ใช้แม้กระทั่งวิธีเก่า Fehlberg 7/8 หรือ DP 7/8
  5. สำหรับวิธี RK ลำดับสูงวิธีการ"มีประสิทธิภาพ" ของเวอร์เนอร์เป็นมาตรฐานทองคำ นั่นแสดงให้เห็นในมาตรฐานที่ฉันเชื่อมโยง คุณสามารถเขียนโค้ดเหล่านั้นลงใน Boost เองหรือใช้หนึ่งใน 2 แพ็คเกจที่ใช้งานได้ถ้าคุณต้องการได้ง่ายขึ้น (Mathematica หรือ DifferentialEquations.jl)

2

ฉันต้องการเพิ่มว่าในขณะที่สิ่งที่ Geoff Oxberry แนะนำสำหรับการรวมระยะยาว (โดยใช้ผู้รวมระบบ symplectic) เป็นจริงในบางกรณีมันไม่ทำงาน โดยเฉพาะอย่างยิ่งถ้าคุณมีกองกำลัง dissipative ระบบของคุณจะไม่อนุรักษ์พลังงานอีกต่อไปและดังนั้นคุณจึงไม่สามารถหันไปใช้ผู้รวมกลุ่ม symplectic ในกรณีนั้น ผู้ที่ถามคำถามกำลังพูดถึงวงโคจรของโลกที่ต่ำและวงโคจรดังกล่าวแสดงให้เห็นการลากชั้นบรรยากาศจำนวนมากนั่นคือแรงดึงดูดที่ลดทอนการใช้ตัวรวม symplectic

ในกรณีเฉพาะนั้น (และสำหรับกรณีที่คุณไม่สามารถใช้ / ไม่สามารถเข้าถึง / ไม่ต้องการใช้ตัวรวม symplectic) ฉันขอแนะนำให้ใช้ตัวรวบรวม Bulirsch-Stoer หากคุณต้องการความแม่นยำและประสิทธิภาพในช่วงเวลาที่ยาวนาน มันทำงานได้ดีโดยประสบการณ์และยังแนะนำโดยสูตรตัวเลข (กด et al., 2007)


ไม่ไม่แนะนำสูตรอาหารที่เป็นตัวเลข โดยเฉพาะอย่างยิ่งในกรณีส่วนใหญ่ไม่ควรแนะนำ Burlirsch-Stoer นี่เป็นปัญหาที่รู้จักกันดีของหนังสือเล่มนี้ ดูพวงของ rebuttles จากนักวิจัยชั้นนำในด้านที่นี่: uwyo.edu/buerkle/misc/wnotnr.html หากคุณต้องการเกณฑ์มาตรฐานเกี่ยวกับเรื่องนี้ให้ดูที่หนังสือเล่มแรกของ Hairer ที่คุณจะเห็น BS แทบจะไม่ได้ผลเลย คำสั่งซื้อที่สูงขึ้นนั้นมีประสิทธิภาพมากขึ้นเมื่อข้อผิดพลาดต่ำพอและเรา (และคนอื่น ๆ ) ได้ทำการเปรียบเทียบเพื่อแสดงให้เห็นอย่างสม่ำเสมอว่ามันมีประสิทธิภาพสำหรับความแม่นยำของจุดลอยตัวย่อยเท่านั้น
Chris Rackauckas

ฉันไม่สามารถพูดคุยกับ NR ได้มากเกินไปเนื่องจากฉันใช้มันเป็นส่วนใหญ่สำหรับ ODE แต่ดูเหมือนว่าฉันมีข้อร้องเรียนในหน้าเว็บที่คุณเชื่อมโยงถึงเก่าและได้รับการยอมรับจากผู้เขียนของ NR ในการตอบกลับ (ท้ายหน้า) แต่นี่เป็นหัวข้อนอก เกี่ยวกับการรวมวงโคจรระยะยาวกับความแม่นยำสูง (พูด 13-14 หลัก) ซึ่งเป็นสิ่งที่ฉันพูดถึงในคำตอบของฉันมันได้รับการพิสูจน์มานานแล้วว่าวิธีการอนุมานทำงานได้ดี (ดูบทของ Montenbruck & Gill เกี่ยวกับการรวมเชิงตัวเลข) เอกสารฉบับล่าสุดก็ใช้เช่นกันและได้พิสูจน์ให้ฉันและคนอื่น ๆ เห็นว่าเป็นวิธีที่เชื่อถือได้และมีประสิทธิภาพ
viiv

M&G ทดสอบเฉพาะกับ dop853 และวิธี RK ลำดับสูงที่ทันสมัยเช่นเดียวกับ Verner นั้นมีประสิทธิภาพมากกว่า M&G ดูเหมือนจะวัดโดยใช้การประเมินฟังก์ชั่นซึ่งเป็นตัวบ่งชี้ที่อ่อนแอของเวลา นอกจากนี้ยังไม่มีเวลาเทียบกับวิธี Runge-Kutta Nystrom ซึ่งใช้สำหรับ ODE ลำดับที่สองโดยเฉพาะและมีประสิทธิภาพมากกว่าวิธี RK ลำดับแรกที่ใช้กับลำดับที่สองค่อนข้างน้อย ที่ 13-14 หลัก BS นั้นอาจแข่งขันกับปัญหาส่วนใหญ่ได้ แต่มันก็ยังห่างไกลจากตัวเลือกที่ชัดเจนและฉันไม่ได้เห็นไดอะแกรมความแม่นยำในการทำงานด้วยวิธีการที่ไม่เห็นด้วย
Chris Rackauckas

M&G ทำการทดสอบ RKN เทียบกับ RK และ BS และอื่น ๆ เทียบกับ RKN (หน้า 123-132 และ 151-154) และกล่าวว่าพวกเขามีประสิทธิภาพมากที่สุดของวิธีการ RK (ไม่รวมถึง Verner แม้ว่าพวกเขาจะอ้างถึงเขา) BS แสดงให้เห็นว่ามีประสิทธิภาพที่ 13-14 หลักซึ่งเป็นสิทธิ์ของฉันฉันได้เห็นว่าทดสอบกับ dop853, ABM (12), Taylor และ RK8 มาตรฐานและทำงานได้ดี ฉันต้องยอมรับว่าฉันไม่ได้เห็นมันทดสอบอาร์เคทีอาร์เคเอ็น แต่จากสิ่งที่ฉันเห็นจาก M&G มันอยู่ไม่ไกลจาก FILG11 ฉันสนใจอย่างแท้จริงใน Verner RK และจะดูลิงก์ของคุณด้านบน คุณมีกระดาษที่ทดสอบทั้งหมดให้ดูหรือไม่
viiv

ฉันกลับไปอีกครั้งและวิ่งเบนช์มาร์กอีกครั้งที่DiffEqBenchmarks.jlและodexไม่ค่อยมีความยุติธรรมเท่าไหร่ อย่างน้อยสำหรับลำดับที่ 1 และ ODE สำหรับความคลาดเคลื่อนการ>=1e-13คาดการณ์ไม่ดีและมักจะไม่ใกล้เคียง นี่เป็นไปตามข้อเรียกร้องข้างต้น
Chris Rackauckas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.