ใช่มีทรัพยากรไม่มากนักด้วยเหตุผลบางประการ เป็นเวลานานมาก goto มาตรฐานคือ "ใช้วิธี BDF" มนต์นี้ตั้งอยู่ในหินด้วยเหตุผลทางประวัติศาสตร์ไม่กี่: สำหรับรหัสของ Gear หนึ่งเป็นตัวแก้ปัญหาที่มีอยู่อย่างกว้างขวางครั้งแรกและอีกชุด MATLAB ไม่ได้ / ไม่รวมวิธี RK โดยปริยาย อย่างไรก็ตามฮิวริสติกนี้ไม่ถูกต้องเสมอไปและฉันอยากบอกว่าจากการทดสอบมันผิดปกติ ให้ฉันอธิบายอย่างละเอียด
วิธีการ BDF มีค่าใช้จ่ายคงที่สูง
การปรับเวลาและคำสั่งการปรับตัวในวิธีการ BDF แบบปรับได้นั้นมีค่าใช้จ่ายสูงมาก ต้องคำนวณค่าสัมประสิทธิ์ใหม่หรือค่าต่างๆต้องถูกนำมาสอดแทรกในเวลาที่ต่างกัน มีงานจำนวนมากที่ทำให้รหัส BDF ปัจจุบันทำได้ดีขึ้นที่นี่ (มี "แบบฟอร์ม" ที่รู้จักกันดีสองรูปแบบสำหรับการติดตั้งที่พยายามจัดการกับปัญหานี้แตกต่างกัน) แต่จริงๆแล้วมันเป็นปัญหาวิศวกรรมซอฟต์แวร์ที่ยากมาก ด้วยเหตุนี้จริง ๆ แล้วรหัส BDF ส่วนใหญ่ล้วนสืบเชื้อสายมาจากรหัสดั้งเดิมของ Gear: Gear, vode, lsoda, CVODE ของ Sundial หรือแม้แต่นักแก้ปัญหา DAE DASKR และ DASSL ก็เป็นผู้สืบทอดจากรหัสเดียวกัน
สิ่งนี้หมายความว่าถ้าคุณมีปัญหา "เล็กเกินไป" ค่าใช้จ่ายคงที่ที่สูงนั้นสำคัญมากและวิธีการ RK โดยนัยจะทำได้ดีกว่า
ระเบียบวิธี BDF ระดับสูงนั้นไม่เสถียรสำหรับค่าลักษณะเฉพาะที่ซับซ้อน
วิธีการ BDF ช่วยให้คุณสามารถควบคุมการสั่งซื้อสูงสุดและทำให้มันอนุรักษ์มากขึ้นด้วยเหตุผล: วิธีการ BDF ลำดับที่สูงขึ้นไม่สามารถจัดการค่าลักษณะที่ซับซ้อน "ขนาดกลาง" ได้เป็นอย่างดี ดังนั้นในกรณีเหล่านี้เพื่อให้มีเสถียรภาพพวกเขาจะต้องวางคำสั่งของพวกเขา นี่คือเหตุผลที่วิธีการลำดับที่ 6 ของ BDF ในขณะที่ความเสถียรทางเทคนิคมักจะถูกละเว้นเพราะแม้แต่ลำดับที่ 5 ก็มีปัญหาอยู่ที่นี่ (และลำดับที่ 6 นั้นมีความเสถียรน้อยกว่า) เฉพาะลำดับที่ 2 สูงสุดเท่านั้นคือ A-เสถียรดังนั้นจึงสามารถย้อนกลับไปที่นั่นได้เสมอ แต่จากนั้นการก้าวจะเกิดข้อผิดพลาด
ดังนั้นเมื่อใช้รหัส BDF ในปัญหาที่ไม่สำคัญคุณจะไม่ได้รับคำสั่งซื้อครั้งที่ 5 ตลอดเวลา ความผันผวนทำให้คำสั่งที่จะลดลง
วิธีการ BDF มีค่าใช้จ่ายเริ่มต้นสูง
ฉันττ
วิธีการ BDF ซึ่งเป็นวิธีการแบบหลายขั้นตอน
ฉradau
มีเกณฑ์มาตรฐานใดบ้าง
หนังสือของ Hairer และ DiffEqBenchmarks (อธิบายด้านล่าง) น่าจะดีที่สุดในแง่ของไดอะแกรมความแม่นยำในการใช้งานที่ใช้งานได้ง่าย Hairer's Solving สามัญดิฟเฟอเรนเชียลสมการ IIมีไดอะแกรมความแม่นยำในการทำงานจำนวนมากในหน้า 154 และ 155 ผลลัพธ์ของปัญหาที่เขาเลือกตรงกับสิ่งที่ฉันระบุไว้ข้างต้นด้วยเหตุผลที่ฉันระบุไว้ข้างต้น: RK โดยนัยจะมีประสิทธิภาพมากขึ้น "ใหญ่พอ" อีกสิ่งที่น่าสนใจที่จะทราบก็คือการสั่งซื้อสูงวิธี Rosenbrock ออกมาเป็นที่มีประสิทธิภาพที่สุดในหลายของการทดสอบของเขา (ชอบRodas
) ในระบอบการปกครองที่เป็นข้อผิดพลาดที่สูงขึ้นและ RK นัยradau5
มีประสิทธิภาพมากที่สุดในข้อผิดพลาดที่ต่ำกว่า แต่ปัญหาการทดสอบของเขาส่วนใหญ่ไม่ได้แยกจาก PDE ขนาดใหญ่ดังนั้นให้พิจารณาประเด็นข้างต้น
คุณทดสอบ / เกณฑ์มาตรฐานอย่างไร
ฉันต้องการทดสอบสิ่งนี้กับDifferentialEquations.jlใน Julia (ข้อจำกัดความรับผิดชอบ: ฉันเป็นหนึ่งในนักพัฒนาซอฟต์แวร์) นี่คือจูเลีย ภาษาการเขียนโปรแกรมควรได้รับการบันทึกที่นี่จริงๆ โปรดจำไว้ว่าในขณะที่ค่าใช้จ่ายของการเรียกใช้ฟังก์ชันเพิ่มขึ้นวิธีการ BDF จะดีขึ้น ใน R / MATLAB / Python ฟังก์ชั่นของผู้ใช้เป็นรหัส R / MATLAB / Python เพียงตัวเดียวที่นักแก้ปัญหาที่ดีที่สุดต้องใช้จริง: ถ้าคุณใช้ SciPy หรือ Sundials wrappers มันเป็นรหัส C / Fortran ทั้งหมดยกเว้นฟังก์ชันที่คุณผ่าน . ซึ่งหมายความว่าในภาษาแบบไดนามิก (ซึ่งไม่ใช่ Julia) วิธี BDF ทำได้ดีกว่าปกติเนื่องจากการเรียกฟังก์ชันนั้นไม่ได้เพิ่มประสิทธิภาพมาก (นี่อาจเป็นเหตุผลว่าทำไม Shampine รวมอยู่ode15s
ในชุด MATLAB แต่ไม่มีวิธี RK โดยปริยาย) .
ฉODEProblem
@time sol = solve(prob,CVODE_BDF())
@time sol = solve(prob,radau())
ที่แรกใช้ Sundials ' CVODE
(วิธี BDF) และครั้งที่สองใช้ Hairer's radau
(implicit RK)
สำหรับการใด ๆODEProblem
คุณสามารถใช้เครื่องมือการเปรียบเทียบเพื่อดูว่าขั้นตอนวิธีการที่แตกต่างกันขนาดความคลาดเคลื่อนการปรับตัวที่แตกต่างกัน ผลบางอย่างที่โพสต์ที่ DiffEqBenchmarks.jl ตัวอย่างเช่นในปัญหา ROBER (ระบบ 3 ODE แข็ง) คุณจะเห็นว่า Sundials จริงไม่เสถียรและ diverges ด้วยความอดทนสูงพอ (ในขณะที่วิธีอื่นมาบรรจบกันดี) แสดงหมายเหตุข้างต้นเกี่ยวกับปัญหาความมั่นคง สำหรับปัญหาของ Van Der Polคุณสามารถเห็นได้ว่ามันเป็นการล้างมากกว่า ฉันมีมากกว่าที่ฉันไม่ได้โพสต์ไว้ แต่อาจจะไม่ได้จนกว่าจะเสร็จสิ้นขั้นตอนการสั่งซื้อ Rosenbrock ที่สูงขึ้น (Rodas เป็นรุ่น Fortran ของเหล่านั้น)
(หมายเหตุ: มาตรฐานแข็งเหล่านั้นจำเป็นต้องอัปเดตสำหรับหนึ่งข้อความต้องมีการปรับปรุงเนื่องจากด้วยเหตุผลบางอย่างของวิธีการ ODE.jl แตกต่าง ...
วิธีการแก้ไขและ RKC
นอกจากนี้ยังมีวิธีการอนุมานเช่นseulex
ที่ทำสำหรับปัญหาแข็ง สิ่งเหล่านี้คือ "ลำดับการปรับที่ไม่มีที่สิ้นสุด" แต่นั่นหมายความว่าพวกมันจะไม่ดีเมื่อคุณกำลังมองหาข้อผิดพลาดที่ต่ำมาก (เช่นการหาวิธีการแก้ปัญหาแข็งที่ต่ำกว่า1e-10
หรือมากกว่านั้นในกรณีนี้คุณอาจใช้วิธีการที่ชัดเจน) . อย่างไรก็ตามในกรณีส่วนใหญ่พวกเขาไม่ได้มีประสิทธิภาพและควรหลีกเลี่ยง
Runge-Kutta Chebyschev เป็นวิธีการที่ชัดเจนซึ่งยังทำงานกับปัญหาแข็งทื่อที่คุณควรพิจารณา ฉันยังไม่ได้ห่อมันไว้ใน DifferentialEquations.jl ดังนั้นฉันจึงไม่มีหลักฐานที่ชัดเจนว่ามันเป็นอย่างไร
วิธีอื่นที่ควรพิจารณา: วิธีพิเศษสำหรับ PDE แบบแข็ง
ควรสังเกตว่าวิธีการสั่งซื้อ Rosenbrock ที่มีคุณภาพสูงนั้นทำได้ดีกว่ามาก ๆ หลายครั้งสำหรับปัญหาที่เกิดขึ้นเมื่อคุณสามารถคำนวณยาโคเบียนได้ง่าย อย่างไรก็ตามสำหรับ PDE บางตัวฉันเชื่อว่าปัญหาการแพร่กระจายของการแพร่กระจายอยู่ในหมวดหมู่นี้ Rosenbrock อาจสูญเสียคำสั่งที่แม่นยำ นอกจากนี้พวกเขาต้องการยาโคบที่แม่นยำเพื่อรักษาความถูกต้อง ในจูเลียสิ่งนี้เป็นเรื่องง่ายเพราะนักแก้ปัญหามาพร้อมกับสัญลักษณ์และระบบตอบโต้อัตโนมัติซึ่งสามารถแก้ไขได้กับ epsilon ของเครื่อง อย่างไรก็ตามสิ่งต่าง ๆ เช่น MATLABode23s
สามารถมีปัญหาได้เนื่องจากการใช้งานเหล่านี้ใช้ความแตกต่างแน่นอน สำหรับ BDF และวิธี RK โดยปริยายข้อผิดพลาดใน Jacobian นำไปสู่การบรรจบกันช้าลงในขณะที่ Rosenbrock เนื่องจากสิ่งเหล่านี้ไม่ใช่สมการโดยปริยาย
วิธีอื่นในการดูคือวิธี RK แบบเอ็กซ์โปเนนเชียล, ความแตกต่างของเวลาแบบเอ็กซ์โพเนนเชียล (ETD), ปัจจัยการรวมโดยนัย (IIF) และวิธีการแบบ Rosenbrock แบบเอ็กซ์โปเนนเชียล สามข้อแรกใช้ประโยชน์จากความจริงที่ว่าในการแยกส่วน PDE จำนวนมาก
ยูเสื้อ= A u + f( u )
AยูอีAA
AJคุณ+ g( u )Jฉ= Jคุณ+ g
วิธีการอื่น ๆ : การสร้างสรรค์ล่าสุด
วิธีการที่มีนัยโดยนัยอย่างชัดเจนจะทำได้ดีสำหรับสมการที่แข็ง หาก PDE ไม่ใหญ่พอคุณจะไม่สามารถ "ขนานในอวกาศ" ได้อย่างมีประสิทธิภาพเพียงพอที่จะใช้ประโยชน์จาก HPC แต่คุณสามารถสร้าง discretizations แบบขนานในเวลาซึ่งมีนัยโดยสมบูรณ์และดีสำหรับสมการที่แข็งทื่อ แต่ขนานไปกับการใช้ฮาร์ดแวร์อย่างเต็มรูปแบบ XBraidเป็นนักแก้ปัญหาที่ใช้เทคนิคเช่นนี้และวิธีการหลักคือ PFFAST และวิธีการเปรียบเทียบ DifferentialEquations.jl กำลังพัฒนาวิธีโครงข่ายประสาทเทียมซึ่งทำงานคล้ายกัน
นี่เป็นวิธีที่ดีที่สุดเมื่อคุณไม่มีการแยกเชิงพื้นที่ขนาดใหญ่พอที่จะทำให้ขนานได้อย่างมีประสิทธิภาพ แต่มีทรัพยากรสำหรับการคำนวณแบบขนานที่มีอยู่
บทสรุป: ใช้การพิจารณาแบบไม่ระบุชื่อด้วยเม็ดเกลือ
เป็นเวลานานมากในประวัติศาสตร์ diffeq ตัวเลขมีความคิดว่าวิธีการอนุมานเป็นวิธีที่ดีที่สุดเพราะพวกเขาสามารถทำได้ตามลำดับทางเทคนิค ซึ่งหมายความว่าสำหรับตัวเล็กพอสมควรΔ t
วิธีการ BDF นั้นเป็นวิธีที่ดีที่สุด แต่ส่วนใหญ่คุณอาจไม่ได้ทำงานในระบอบการปกครองนั้น แต่ถ้าการแยกเชิงพื้นที่มีคะแนนมากพอวิธี BDF สามารถทำให้ขนานในอวกาศได้อย่างมีประสิทธิภาพ (โดยการแก้ปัญหาแบบเส้นตรงขนาน) และจะมีการเรียกใช้ฟังก์ชันน้อยที่สุดและจะทำให้ดีที่สุด แต่ถ้า discretization PDE ของคุณไม่ใหญ่พอลองดูวิธี RK, Rosenbrock, exponential RK โดยปริยายเป็นต้น การใช้ชุดซอฟต์แวร์เช่น DifferentialEquations.jl ซึ่งทำให้ง่ายต่อการสลับระหว่างวิธีการต่าง ๆ จะมีประโยชน์มากสำหรับคุณที่จะเข้าใจว่าวิธีใดดีที่สุดสำหรับโดเมนปัญหาของคุณเนื่องจากในหลายกรณีไม่สามารถทราบล่วงหน้าได้
[หากคุณมีปัญหาตัวอย่างใด ๆ ที่คุณต้องการเพิ่มไปยังชุดทดสอบโปรดอย่าลังเลที่จะรับบางสิ่งในนั้น ฉันต้องการเก็บทรัพยากรที่ครอบคลุมมากในเรื่องนี้ ฉันหวังว่าจะมีมาตรฐานทั้งหมดของ Hairer ในรูปแบบสมุดบันทึกที่รันได้ "เร็ว ๆ นี้" และต้องการปัญหาอื่น ๆ ซึ่งเป็นตัวแทนของสาขาวิทยาศาสตร์ ความช่วยเหลือใด ๆ ที่ชื่นชม!]