ให้ฉันเริ่มต้นด้วยการแก้ไข ไม่ไม่มีผู้odeint
รวบรวมที่เห็นอกเห็นใจ ไม่การรวม symplectic ไม่ได้หมายถึงการอนุรักษ์พลังงาน
symplectic หมายความว่าอย่างไรและเมื่อใดที่คุณควรใช้
ก่อนอื่นความเห็นใจหมายถึงอะไร Symplectic หมายถึงการแก้ปัญหานั้นมีอยู่ในหลากหลาย symplectic symplectic manifold เป็นชุดโซลูชันซึ่งกำหนดโดยแบบฟอร์ม 2 รายละเอียดของ symplectic manifold อาจฟังดูไร้สาระทางคณิตศาสตร์ดังนั้นส่วนสำคัญของมันคือมีความสัมพันธ์โดยตรงระหว่างตัวแปรสองชุดในนานา เหตุผลที่สิ่งนี้มีความสำคัญสำหรับฟิสิกส์ก็คือสมการของแฮมิลโตเนียนนั้นมีอยู่โดยธรรมชาติว่าการแก้ปัญหานั้นมีอยู่ใน symplectic manifold ในสเปซเฟส สำหรับทางออกของแฮมิลตันแท้ๆเส้นทางของเฟสเฟสนั้นคือพลังงานคงที่
ตัวรวม symplectic เป็นตัวรวมที่มีวิธีการแก้ปัญหาอยู่ในนานา symplectic เนื่องจากข้อผิดพลาด discretization เมื่อมีการแก้ไขระบบ Hamiltonian มันไม่ได้รับวิถีที่ถูกต้องในท่อร่วมไอดี แต่วิถีนั้นเองนั้นจะถูกรบกวนสำหรับคำสั่งจากวิถีที่แท้จริง จากนั้นมีการเลื่อนเชิงเส้นเนื่องจากข้อผิดพลาดเชิงตัวเลขของวิถีนี้เมื่อเวลาผ่านไป ผู้ประกอบระบบปกติมีแนวโน้มที่จะมีกำลังสอง (หรือมากกว่า) และไม่ได้มีการรับรองทั่วโลกที่ดีเกี่ยวกับเส้นทางอวกาศเฟสนี้nO(Δtn)n
สิ่งนี้มีแนวโน้มที่จะหมายถึงว่าผู้รวมกลุ่ม symplectic มักจะจับรูปแบบเป็นเวลานานได้ดีกว่าผู้ประกอบการปกติเพราะขาดการดริฟท์และรับประกันระยะเวลาเกือบ โน๊ตบุ๊คนี้แสดงคุณสมบัติเหล่านั้นได้ดีในปัญหาที่เคปเลอร์ ภาพแรกแสดงสิ่งที่ฉันกำลังพูดถึงด้วยธรรมชาติของการแก้ปัญหาเป็นระยะ
นี้ได้รับการแก้ไขโดยใช้คำสั่งที่ 6 Integrator symplectic จาก Kahan และหลี่จาก DifferentialEquations.jl คุณจะเห็นได้ว่าพลังงานไม่ได้อนุรักษ์ไว้อย่างแน่นอน แต่ความหลากหลายนั้นขึ้นอยู่กับความหลากหลายของการรบกวนที่เกิดขึ้นจากท่อร่วมที่แท้จริง แต่เนื่องจากวิธีแก้ปัญหาเชิงตัวเลขนั้นอยู่บน symplectic manifold จึงมีแนวโน้มว่าจะเป็นระยะเกือบทุกครั้ง (ด้วยการเลื่อนเชิงเส้นที่คุณสามารถเห็นได้) ทำให้มันทำได้ดีมากสำหรับการรวมระยะยาว หากคุณทำเช่นเดียวกันกับ RK4 คุณจะได้รับความเสียหาย:
คุณจะเห็นว่าปัญหาคือว่าไม่มีช่วงเวลาที่แท้จริงในการแก้ปัญหาเชิงตัวเลขและดังนั้นจึงมีการทำงานล่วงเวลาที่จะลอย
ไฮไลท์นี้เหตุผลที่แท้จริงที่จะเลือกติด symplectic: ติด symplectic เป็นสิ่งที่ดีในการผนวกรวมเป็นเวลานานในการแก้ไขปัญหาที่มีคุณสมบัติ symplectic (ระบบมิล) งั้นมาดูบางสิ่งกัน โปรดทราบว่าคุณไม่จำเป็นต้องมีผู้รวมระบบแบบ symplectic แม้ในปัญหา symplectic สำหรับกรณีนี้วิธี Runge-Kutta ที่ปรับเปลี่ยนได้ลำดับที่ 5 สามารถทำได้ดี ที่นี่Tsit5
:
สังเกตเห็นสองสิ่ง หนึ่งมันได้รับความแม่นยำที่ดีพอที่คุณไม่สามารถเห็นการดริฟท์ที่แท้จริงในพล็อตเฟส อย่างไรก็ตามทางด้านขวาคุณจะเห็นได้ว่ามีการไหลของพลังงานนี้และหากคุณทำการรวมกันนานพอวิธีนี้จะไม่ทำเช่นเดียวกับวิธีการแก้ปัญหาที่มีคุณสมบัติเป็นระยะ แต่นั่นทำให้เกิดคำถามขึ้นว่ามันคุ้มค่าหรือไม่เมื่อเทียบกับการรวมอย่างถูกต้องแม่นยำ? นี่มันค่อนข้างแน่ใจน้อยลง ในDiffEqBenchmarks.jlคุณสามารถค้นหาการวัดประสิทธิภาพเพื่อตรวจสอบคำถามนี้ ตัวอย่างเช่นสมุดบันทึกนี้ดูข้อผิดพลาดด้านพลังงานเทียบกับรันไทม์บนระบบสมการแฮมิลโตเนียนจากโมเดล Boson แบบสี่เท่าและแสดงให้เห็นว่าถ้าคุณต้องการความแม่นยำสูงจริง ๆ แล้วถึงแม้จะใช้เวลานานในการบูรณาการนาน ๆ วิธี RKN) สิ่งนี้สมเหตุสมผลเนื่องจากการตอบสนองต่อคุณสมบัติสัมพัทธภาพผู้ติดตั้งจะให้ประสิทธิภาพและค่อนข้างคงที่ขั้นตอนเวลาที่กำหนด (มีงานวิจัยบางชิ้นที่ทำให้ความคืบหน้าในระยะหลัง
นอกจากนี้สังเกตจากทั้งสองโน๊ตบุ๊คที่คุณสามารถใช้วิธีการมาตรฐานและฉายมันกลับไปที่วิธีการแก้ปัญหาที่หลากหลายในแต่ละขั้นตอน (หรือทุก ๆ สองสามขั้นตอน) นี่คือสิ่งที่ตัวอย่างโดยใช้ DifferentialEquations.jl โทรกลับ ManifoldProjectionกำลังทำ คุณเห็นว่าการรับประกันกฎหมายการอนุรักษ์ได้รับการสนับสนุน แต่มีค่าใช้จ่ายเพิ่มเติมในการแก้ปัญหาระบบโดยปริยายในแต่ละขั้นตอน คุณยังสามารถใช้ตัวแก้ ODE โดยปริยายอย่างเต็มที่หรือเมทริกซ์มวลเอกพจน์เพื่อเพิ่มในสมการการอนุรักษ์ แต่ผลลัพธ์สุดท้ายก็คือวิธีการเหล่านี้มีค่าใช้จ่ายในการคำนวณสูงกว่า
ดังนั้นเพื่อสรุประดับของปัญหาที่คุณต้องการในการเข้าถึงสำหรับผู้ออกแบบและติด symplectic เป็นคนที่มีวิธีการแก้ไขปัญหานานา symplectic (ระบบมิล) ที่คุณไม่ต้องการที่จะลงทุนทรัพยากรคอมพิวเตอร์ที่จะมีความแน่นอนมาก (ความอดทน<1e-12
) ทางออกและไม่ต้องการพลังงานที่แน่นอน / ฯลฯ การอนุรักษ์ สิ่งนี้ชี้ให้เห็นว่ามันเป็นเรื่องของคุณสมบัติการรวมในระยะยาวดังนั้นคุณไม่ควรแห่กันไปที่พวกเขาทั้งหมดโดยเจตนาเหมือนที่บางคนในวรรณกรรมแนะนำ แต่มันก็ยังเป็นเครื่องมือสำคัญในหลายสาขาเช่น Astrophysics ที่คุณมีการบูรณาการเป็นเวลานานซึ่งคุณต้องแก้ปัญหาให้เร็วพอโดยไม่ต้องมีความแม่นยำที่ไร้สาระ
ฉันจะหาผู้รวมระบบ symplectic ได้ที่ไหน มีผู้ติดตั้ง symplectic ประเภทใดบ้าง
โดยทั่วไปแล้วจะมีผู้รวมกลุ่ม symplectic สองคลาส มีการรวมกันของ Runge-Kutta symplectic (ซึ่งเป็นสิ่งที่แสดงในตัวอย่างข้างต้น) และมีวิธีการ Runge-Kutta โดยนัยซึ่งมีคุณสมบัติ symplectic ตามที่ @origimbo กล่าวไว้ผู้ประกอบการ Runge-Kutta ที่เป็น symplectic ต้องการให้คุณจัดเตรียมโครงสร้างพาร์ติชันเพื่อให้สามารถจัดการตำแหน่งและชิ้นส่วนโมเมนตัมแยกกันได้ อย่างไรก็ตามการตอบโต้ความคิดเห็นวิธีการ Runge-Kutta โดยปริยายนั้นเป็น symplectic โดยไม่จำเป็นต้องทำสิ่งนี้ แต่ต้องการการแก้ไขระบบที่ไม่ใช่เชิงเส้นแทน สิ่งนี้ไม่ได้เลวร้ายเกินไปเพราะหากระบบไม่แข็งระบบที่ไม่เชิงเส้นนี้สามารถแก้ไขได้ด้วยการทำซ้ำการทำงานหรือการเร่งความเร็วแบบแอนเดอร์สัน แต่วิธีการ RK แบบ symplectic ควรจะยังคงต้องการประสิทธิภาพอยู่ดี
ที่กล่าวว่าodeint ไม่มีวิธีการจากทั้งสองตระกูลเหล่านี้ดังนั้นจึงไม่ใช่ทางเลือกที่ดีถ้าคุณกำลังมองหาผู้รวมกลุ่ม symplectic ใน Fortran เว็บไซต์ของ Hairer มีชุดเล็ก ๆ ที่คุณสามารถใช้ได้ Mathematica มีสร้างขึ้นในไม่กี่ นักแก้ปัญหา GSL ODE มีปริพันธ์จุด R Ga Gaussianซึ่งโดยนัยคือ IIRC นั้นเป็น symplectic แต่นั่นเป็นเพียงเหตุผลเดียวที่ใช้วิธี GSL
แต่ชุดติดตั้ง symplectic ที่ครอบคลุมที่สุดสามารถพบได้ในDifferentialEquations.jl ใน Julia (จำได้ว่านี่ใช้สำหรับโน้ตบุ๊กด้านบน) รายการของวิธีการ symplectic Runge-Kutta ที่มีอยู่พบได้ในหน้านี้และคุณจะสังเกตเห็นว่าวิธีจุดกึ่งกลางโดยนัยนั้นก็เป็นแบบ symplectic ด้วย (วิธี Tragezoid แบบ Runge-Kutta โดยนัยนั้นถือเป็น "เกือบ symplectic" เพราะสามารถย้อนกลับได้) ไม่เพียง แต่จะมีชุดที่ใหญ่ที่สุดของวิธีการ แต่มันก็ยังเป็นโอเพนซอร์ส (คุณสามารถดูรหัสและการทดสอบในภาษาระดับสูง) และมีจำนวนมากของมาตรฐาน สมุดบันทึกเบื้องต้นที่ดีสำหรับใช้ในการแก้ปัญหาทางกายภาพคือสมุดบันทึกการสอนนี้. แต่แน่นอนก็ขอแนะนำให้คุณเริ่มต้นกับแพคเกจผ่านODE แรกกวดวิชา
โดยทั่วไปคุณสามารถค้นหาการวิเคราะห์โดยละเอียดของชุดสมการเชิงอนุพันธ์เชิงตัวเลขที่โพสต์บล็อกนี้ มันค่อนข้างละเอียด แต่เนื่องจากต้องครอบคลุมหัวข้อต่าง ๆ มากมายแต่ละหัวข้อมีรายละเอียดน้อยกว่านี้ดังนั้นอย่าลังเลที่จะขอให้ขยายออกไปในทางใดทางหนึ่ง