Tìm kiếm thứ tự Runge-Kutta thứ 8 trong C / C ++


10

Tôi muốn sử dụng phương pháp bậc 8 Runge-Kutta (89) trong ứng dụng cơ học thiên thể / astrodynamics, được viết bằng C ++, sử dụng máy Windows. Vì vậy, tôi tự hỏi nếu có ai biết một thư viện / triển khai tốt được ghi lại và sử dụng miễn phí? Sẽ ổn nếu nó được viết bằng C, miễn là không có bất kỳ vấn đề biên dịch nào được mong đợi.

Cho đến nay tôi đã tìm thấy thư viện này (mymathlib) . Mã này có vẻ ổn, nhưng tôi không tìm thấy bất kỳ thông tin nào về việc cấp phép.

Bạn có thể giúp tôi bằng cách tiết lộ một số lựa chọn thay thế bạn có thể biết và sẽ phù hợp với vấn đề của tôi?

EDIT:
Tôi thấy rằng thực sự không có nhiều mã nguồn C / C ++ có sẵn như tôi mong đợi. Do đó, phiên bản Matlab / Octave cũng sẽ ổn (vẫn phải miễn phí sử dụng).

Câu trả lời:


8

Cả Thư viện Khoa học GNU (GSL) (C) và Boost Odeint (C ++) đều có các phương pháp Runge-Kutta bậc 8.

Cả hai đều là nguồn mở, và dưới linux và mac, chúng nên có sẵn trực tiếp từ trình quản lý gói. Trong các cửa sổ, có thể bạn sẽ dễ dàng sử dụng Boost hơn là GSL.

GSL được xuất bản theo giấy phép GPL và Boost Odeint theo giấy phép Boost.

Chỉnh sửa: Ok, Boost Odeint KHÔNG có phương pháp Runge-Kutta 89, chỉ có 78, nhưng nó cung cấp một công thức để tạo các bước Runge-Kutta tùy ý.

Phương pháp thứ 8 là khá cao, và rất có thể là quá mức cần thiết cho vấn đề của bạn.

Prince-Dormand đề cập đến một loại Runge-Kutta cụ thể, và không liên quan trực tiếp đến thứ tự nhưng phổ biến nhất là 45. Matlabs ode45, thuật toán ODE được đề xuất của họ là triển khai Prince-Dormand 45. Đây là thuật toán tương tự như được triển khai trong Boost Odeint Runge_Kutta_Dopri5 .


1
Cảm ơn bạn đã trả lời. Bây giờ thật xấu hổ, tôi đã xem Boost Odeint ngay cả trước khi hỏi ở đây và chỉ tìm thấy "runge_kutta_fehlberg78". Đây có phải là điều đúng? Trên thực tế tôi không biết sự khác biệt giữa methonds khi được sử dụng trong thực tế, nhưng tôi đang tìm kiếm một RK89 (còn được gọi là Dormand-Prince khi tôi tìm kiếm trên internet). Bạn có thể bình luận hoặc mở rộng câu trả lời của bạn về vấn đề này xin vui lòng? Cảm ơn bạn.
James C

Cập nhật bài viết để trả lời câu hỏi của bạn. Prince-Dormand 45 rất có thể sẽ giải quyết vấn đề của bạn một cách độc đáo.
LKlevin

15

Nếu bạn đang thực hiện cơ học thiên thể qua quy mô thời gian dài, sử dụng bộ tích hợp Runge-Kutta cổ điển sẽ không bảo toàn năng lượng. Trong trường hợp đó, sử dụng một tích hợp symplectic có lẽ sẽ tốt hơn. Boost.odeint cũng thực hiện sơ đồ Runge-Kutta đối xứng bậc 4 sẽ hoạt động tốt hơn trong khoảng thời gian dài. GSL không thực hiện bất kỳ phương pháp đối xứng nào, theo như tôi có thể nói.


Cảm ơn bạn đã trả lời. Liệu Runge-Kutta đối xứng bậc 4 sẽ cho kết quả tốt hơn RKF78, nếu được sử dụng với các vệ tinh Trái đất (quỹ đạo thấp cũng như quỹ đạo không gian sâu hơn), có lẽ trong khoảng thời gian 1-3 quỹ đạo?
James C

@JamesC Vâng. Trong một thời gian dài, phương pháp symplectic tốt hơn nhiều.
eccstartup

@eccstartup - Bạn sẽ xem xét một khoảng thời gian dài ở đây là gì? Bởi vì nó có thể dài bằng một quỹ đạo của một hành tinh quanh Mặt trời, hoặc một vài quỹ đạo của vệ tinh thời tiết quanh Trái đất, v.v.
James C

@JamesC Tôi chưa quan sát thấy vấn đề lớn đó. Nhưng đối với các vấn đề mô hình của tôi, với nhiều quỹ đạo được tính toán, các phương pháp đối xứng cho các quỹ đạo rất hoàn hảo.
eccstartup

Vì vậy, lời khuyên là hãy lập trình cho bạn một phiên bản của phương pháp Runge-Kutta ẩn, bao gồm rất nhiều phương pháp đối xứng với thứ tự cao hơn như bạn muốn.
eccstartup

4

tóm tắt một số điểm:

  1. Nếu đó là sự tích hợp lâu dài của một mô hình không tiêu tan, thì một nhà tích hợp đối xứng là thứ bạn đang tìm kiếm.
  2. Mặt khác, vì nó là một phương trình chuyển động, các phương pháp Runge-Kutta Nystrom sẽ hiệu quả hơn so với chuyển đổi sang hệ thống bậc nhất. Có các phương pháp RKN bậc cao do DP. Có một số triển khai, như ở đây trong Julia, chúng được ghi lạiđây là một MATLAB .
  3. Phương pháp Runge-Kutta bậc cao chỉ cần thiết nếu bạn muốn một giải pháp có độ chính xác cao. Nếu dung sai thấp hơn thì RK ở bậc 5 có thể sẽ nhanh hơn (với cùng một lỗi). Điều tốt nhất để làm nếu bạn cần giải quyết điều này thường xuyên là thử nghiệm một loạt các phương pháp khác nhau. Trong tập hợp điểm chuẩn về các vấn đề 3 thân này, chúng tôi thấy rằng (đối với cùng một lỗi), các phương pháp RK bậc cao chỉ là một sự cải thiện biên về tốc độ, mặc dù là lỗi -> 0 bạn có thể thấy rằng sự cải thiện đã tăng lên> 5x so với Dormand -Prince 45 ( DP5) khi bạn nhìn vào 4 chữ số chính xác (dung sai thấp hơn rất nhiều cho điều này mặc dù. Dung sai chỉ là một sân bóng trong bất kỳ vấn đề nào). Khi bạn kéo các dung sai thậm chí làm giảm sự cải thiện từ phương pháp RK bậc cao, nhưng bạn có thể cần phải bắt đầu sử dụng các số chính xác cao hơn.
  4. Thuật toán Dormand-Prince order 7/8 có tableau thứ 8 khác so với phương thức DP853 của Hairer dop853và DifentialEquations.jl DP8(giống nhau). Phương pháp 853 sau không thể được triển khai trong phiên bản tableau tiêu chuẩn của phương pháp Runge-Kutta vì công cụ ước tính lỗi của nó là không chuẩn. Nhưng phương pháp này hiệu quả hơn nhiều và tôi thậm chí không khuyến nghị sử dụng các phương pháp Fehlberg 7/8 hoặc DP 7/8 cũ hơn.
  5. Đối với các phương pháp RK bậc cao, các phương pháp "Hiệu quả" của Verner là tiêu chuẩn vàng. Điều đó cho thấy trong các điểm chuẩn tôi liên kết. Bạn có thể tự mã hóa chúng thành Boost hoặc sử dụng một trong 2 gói triển khai chúng nếu bạn muốn chúng dễ dàng hơn (Mathicala hoặc DifentialEquations.jl).

2

Tôi muốn nói thêm rằng trong khi những gì Geoff Oxberry gợi ý cho sự tích hợp lâu dài (sử dụng các bộ tích hợp đối xứng) là đúng, trong một số trường hợp, nó sẽ không hoạt động. Cụ thể hơn, nếu bạn có lực phân tán, hệ thống của bạn không bảo toàn năng lượng nữa, và do đó bạn không thể dùng đến các bộ tích hợp đối xứng trong trường hợp đó. Người đặt câu hỏi đang nói về quỹ đạo Trái đất thấp và những quỹ đạo như vậy thể hiện một lực cản lớn trong khí quyển, đó là một lực tiêu tan loại trừ việc sử dụng các tích hợp đối xứng như vậy.

Trong trường hợp cụ thể đó (và đối với các trường hợp bạn không thể sử dụng / không có quyền truy cập / không muốn sử dụng tích hợp đối xứng), tôi khuyên bạn nên sử dụng tích hợp Bulirsch-Stoer nếu bạn cần độ chính xác và hiệu quả trong thời gian dài. Nó hoạt động tốt theo kinh nghiệm và cũng được khuyến nghị bởi Công thức toán số (Press et al., 2007).


Không, không đề xuất Công thức số. Đặc biệt, trong hầu hết các trường hợp không nên dùng Burlirsch-Stoer. Đây là một vấn đề nổi tiếng với cuốn sách. Xem một loạt các phản bác từ các nhà nghiên cứu hàng đầu trong lĩnh vực này tại đây: uwyo.edu/buerkle/misc/wnotnr.html . Nếu bạn muốn điểm chuẩn về điều này, hãy xem cuốn sách đầu tiên của Hairer, nơi bạn sẽ thấy BS hầu như không bao giờ làm tốt. Thứ tự cao hơn chỉ hiệu quả hơn khi sai số đủ thấp và chúng tôi (và những người khác) đã thực hiện đo điểm chuẩn để thể hiện khá nhất quán rằng nó chỉ hiệu quả đối với độ chính xác của điểm nổi phụ.
Chris Rackauckas

Tôi không thể nói về NR quá nhiều vì tôi đã sử dụng nó chủ yếu cho ODE, nhưng dường như các khiếu nại trên trang bạn liên kết đã cũ và đã được các tác giả của NR nhấn mạnh trong phản hồi của họ (cuối trang), nhưng đây là lạc đề. Liên quan đến sự tích hợp lâu dài của các quỹ đạo với độ chính xác cao (giả sử, 13-14 chữ số), đó là những gì tôi đã đề cập trong câu trả lời của mình, đã được chứng minh từ lâu rằng các phương pháp ngoại suy hoạt động tốt (xem chương của Montenbrüc & Gill về Tích hợp số). Nhiều bài báo gần đây cũng sử dụng nó, và nó đã chứng minh cho tôi và những người khác một phương pháp đáng tin cậy và hiệu quả.
viiv

M & G chỉ thử nghiệm nó với dop853 và các phương pháp RK bậc cao hiện đại hơn, giống như các phương pháp do Verner, hiệu quả hơn nhiều. M & G dường như cũng chỉ đo lường bằng cách sử dụng các đánh giá chức năng, là một chỉ số yếu về thời gian. Nó cũng không có thời gian chống lại các phương pháp Runge-Kutta Nystrom dành riêng cho ODE bậc 2 và hiệu quả hơn các phương pháp RK bậc một được áp dụng cho lệnh thứ hai khá nhiều. Ở mức 13-14 chữ số, BS có thể cạnh tranh trên hầu hết các vấn đề, nhưng đó là sự lựa chọn rõ ràng và tôi chưa thấy một sơ đồ chính xác trong công việc với các phương pháp gần đây không đồng ý với điều đó.
Chris Rackauckas

M & G kiểm tra RKN với RK, và BS và những người khác chống lại RKN (trang 123-132 và 151-154) và nói rằng chúng là phương pháp RK hiệu quả nhất (không bao gồm Verner mặc dù họ trích dẫn anh ta). BS được chứng minh là hiệu quả ở mức 13-14 chữ số, đó là tuyên bố của tôi, tôi đã thấy nó được thử nghiệm chống lại dop853, ABM (12), Taylor và RK8 tiêu chuẩn và nó hoạt động tốt. Tôi phải thừa nhận rằng tôi đã không thấy nó được thử nghiệm RKN đơn giản nhưng từ những gì tôi có thể thấy từ M & G, nó không xa so với FILG11 chẳng hạn. Tôi thực sự quan tâm đến RK của Verner và sẽ xem xét các liên kết của bạn ở trên. Bạn có một bài kiểm tra tất cả chúng để xem?
viiv

Tôi đã quay lại và chạy lại một loạt các điểm chuẩn tại DiffEqBenchmark.jlodexkhông có xu hướng công bằng. Vì vậy, ít nhất là đối với ODE bậc 1 và đối với dung sai >=1e-13, phép ngoại suy dường như không hoạt động tốt và nó thường không đóng. Điều này phù hợp với yêu cầu ở trên.
Chris Rackauckas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.