C / C ++에서 Runge-Kutta 8 차 순서 찾기


10

Windows 기계를 사용하여 C ++로 작성된 천체 역학 / 우주 역학 응용 프로그램에서 Runge-Kutta 8 차 방법 (89)을 사용하고 싶습니다. 따라서 누구나 문서화되고 무료로 사용할 수있는 좋은 라이브러리 / 구현을 알고 있는지 궁금합니다. 컴파일 문제가 예상되지 않는 한 C로 작성해도 괜찮습니다.

지금 까지이 라이브러리 (mymathlib)를 찾았습니다 . 코드는 괜찮아 보이지만 라이센스에 대한 정보를 찾지 못했습니다.

알고 있거나 내 문제에 적합한 대안 중 일부를 공개하여 나를 도울 수 있습니까?

편집 :
예상대로 사용할 수있는 C / C ++ 소스 코드가 많지 않다는 것을 알았습니다. 따라서 Matlab / Octave 버전도 괜찮습니다 (여전히 무료로 사용해야 함).

답변:


8

GNU 과학 라이브러리 (GSL) (C)와 Odeint 부스트 (C ++) 기능 8 순서 룽게 - 쿠타 방법을.

둘 다 오픈 소스이며 Linux 및 Mac에서는 패키지 관리자에서 직접 사용할 수 있어야합니다. Windows에서는 GSL 대신 Boost를 사용하는 것이 더 쉬울 것입니다.

GSL은 GPL 라이센스에 따라, Boost Odeint는 Boost 라이센스에 따라 게시됩니다.

편집 : Ok, Boost Odeint에는 Runge-Kutta 89 방법이 없으며 78 만 있지만 임의의 Runge-Kutta 스테퍼를 만드는 방법 을 제공합니다 .

그러나 8 차 방법은 상당히 높으며 문제에 너무 과도합니다.

Prince-Dormand 는 특정 종류의 Runge-Kutta를 나타내며 순서와 직접 관련이 없지만 가장 일반적인 것은 45입니다. 권장되는 ODE 알고리즘 인 Matlabs ode45는 Prince-Dormand 45 구현입니다. 이것은 Boost Odeint Runge_Kutta_Dopri5 에서 구현 된 것과 동일한 알고리즘 입니다.


1
답변 주셔서 감사합니다. 지금 당황 스럽습니다. 여기에 묻기 전에 Boost Odeint를 살펴본 결과 "runge_kutta_fehlberg78"만 발견되었습니다. 이것이 옳은 일입니까? 실제로 나는 실제로 사용될 때 방법의 차이점을 알지 못하지만 RK89 (인터넷을 검색 할 때 Dormand-Prince라고도 함)를 찾고있었습니다. 이 문제에 대한 답변을 논평하거나 확장 할 수 있습니까? 감사합니다.
James C

질문에 답변하도록 게시물을 업데이트했습니다. Prince-Dormand 45가 문제를 잘 해결할 것입니다.
LKlevin

15

오랜 시간 동안 천체 역학을 수행하는 경우 클래식 Runge-Kutta 통합기를 사용하면 에너지가 보존되지 않습니다. 이 경우, 대칭 적분기를 사용하는 것이 좋습니다. Boost.odeint는 또한 오랜 간격 동안 더 잘 작동하는 4 차 증상 Runge-Kutta 체계를 구현합니다. GSL은 내가 알 수있는 한 상징적 인 방법을 구현하지 않습니다.


답변 주셔서 감사합니다. 4 차 대칭 Runge-Kutta가 RKF78보다 더 나은 결과를 낼 수 있을까요? 지구 위성 (낮은 궤도와 더 깊은 우주 궤도)과 함께 사용한다면 아마도 1 ~ 3 번의 궤도에 있을까요?
James C

@JamesC 예. 장기간에 걸쳐 증상 적 인 방법이 훨씬 좋습니다.
eccstartup

@eccstartup-여기서 장기적으로 무엇을 고려 하시겠습니까? 태양 주위의 한 행성의 궤도, 또는 지구 주위의 날씨 위성의 궤도의 길이만큼 길 수 있기 때문입니다.
James C

@JamesC 나는 그 큰 문제를 관찰하지 못했습니다. 그러나 많은 궤도를 계산 한 내 모형 문제의 경우, 상징적 인 방법은 매우 완벽한 궤도를 제공합니다.
eccstartup

따라서 암시 적 Runge-Kutta 방법의 버전을 소유하도록 프로그래밍하는 것이 좋습니다. 여기에는 원하는만큼 높은 수준의 많은 상징적 방법이 포함됩니다.
eccstartup

4

몇 가지 요점을 요약하면 다음과 같습니다.

  1. 비 분산 모델의 장기 통합 인 경우 원하는 통합 적자가 있습니다.
  2. 그렇지 않으면 운동 방정식이기 때문에 Runge-Kutta Nystrom 방법이 1 차 시스템으로 변환하는 것보다 더 효율적입니다. DP로 인해 고차 RKN 방법이 있습니다. 여기 Julia 와 같은 일부 구현 이 문서화되어 있으며 여기에는 MATLAB이 있습니다.
  3. 고정밀 Runge-Kutta 방법은 고 정확도 솔루션을 원하는 경우에만 필요합니다. 공차가 낮 으면 5 차 RK가 더 빠를 수 있습니다 (같은 오류에 대해). 이 문제를 자주 해결해야 할 경우 가장 좋은 방법은 여러 가지 방법을 테스트하는 것입니다. 3- 바디 문제에 대한이 벤치 마크 세트에서 (같은 오류에 대해) 높은 순서의 RK 방법은 속도가 약간 개선 된 것으로 나타났습니다. -Prince 45 ( DP5)는 4 자리의 정확도를 볼 때 (허용 오차는 다소 낮습니다. 허용 오차는 모든 문제에 대한 야구장 일뿐입니다). 공차를 낮추면 RK 방법이 커질수록 개선이 향상되지만 더 높은 정밀도를 사용해야합니다.
  4. Dormand-Prince order 7/8 알고리즘은 Hair853 dop853과 DifferentialEquations.jl의 DP853 방법과 동일한 8 차 tableau를 가지고 있습니다 DP8(동일 함). 후자의 853 방법은 에러 추정기가 비표준이기 때문에 Runge-Kutta 방법의 표준 tableau 버전에서는 구현 될 수 없습니다. 그러나이 방법은 훨씬 효율적이며 구형 Fehlberg 7/8 또는 DP 7/8 방법을 사용하지 않는 것이 좋습니다.
  5. 고차 RK 방법의 경우 Verner "Efficient"방법 이 금본위 제입니다. 그것은 내가 연결 한 벤치 마크에 나타납니다. Boost로 직접 코딩하거나 더 쉽게 원하는 경우 구현하는 2 개의 패키지 중 하나를 사용할 수 있습니다 (Mathematica 또는 DifferentialEquations.jl).

2

Geoff Oxberry가 장기 통합 (증상 적분기 사용)에 대해 제안한 것은 사실이지만 일부 경우에는 작동하지 않습니다. 보다 구체적으로, 소산 력이있는 경우 시스템은 더 이상 에너지를 보존하지 않으므로이 경우 증상 적분기에 의지 할 수 없습니다. 이 질문을하는 사람은 낮은 지구 궤도에 대해 이야기하고 있었으며, 그러한 궤도는 많은 양의 대기 항력을 나타냅니다.

이 특정한 경우 (및 상징적 통합자를 사용하지 못하거나 사용하지 않으려는 경우)에는 오랜 시간 동안 정밀도와 효율성이 필요한 경우 Bulirsch-Stoer 통합자를 사용하는 것이 좋습니다. 경험에 따라 잘 작동하며 Numerical Recipes (Press et al., 2007)에서도 권장됩니다.


아니요, 수치 레시피를 권장하지 않습니다. 특히 대부분의 경우 Burlirsch-Stoer는 권장하지 않습니다. 이것은이 책에서 잘 알려진 문제입니다. 여기 분야에서 최고 연구자 rebuttles의 무리를 참조하십시오 uwyo.edu/buerkle/misc/wnotnr.html를 . 이것에 대한 벤치 마크를 원한다면 BS가 거의 잘하지 못하는 Hairer의 첫 번째 책을 참조하십시오. 높은 순서는 오류가 충분히 낮을 때만 더 효율적이며, 우리 (및 기타)는 부동 소수점 정밀도에만 효율적이라는 것을 일관되게 보여주기 위해 벤치마킹을 수행했습니다.
Chris Rackauckas

ODE에 주로 사용했기 때문에 NR에 대해 너무 많이 말할 수는 없지만 링크하는 페이지의 불만이 오래되어 NR의 저자가 응답 (페이지 끝)에서 해결 한 것으로 보입니다. 그러나 이것은 주제가 아닙니다. 내 대답에서 언급 한 고정밀 궤도 (예 : 13-14 자릿수)의 장기 통합과 관련하여 외삽 법이 잘 작동한다는 것이 오랫동안 입증되었습니다 (Monternbruck & Gill의 Numerical Integration 장 참조). 보다 최근의 논문에서도이 문서를 사용하며, 저와 다른 사람들에게 신뢰할 수 있고 효율적인 방법으로 입증되었습니다.
viiv

M & G는 dop853에 대해서만 테스트하고 Verner로 인한 것과 같은보다 현대적인 고차 RK 방법이 훨씬 더 효율적입니다. M & G는 또한 타이밍의 약한 지표 인 기능 평가 만 사용하여 측정하는 것 같습니다. 또한 특별히 2 차 ODE 용이며 2 차에 적용되는 1 차 RK 방법보다 훨씬 효율적인 Runge-Kutta Nystrom 방법에 대해서는 시간이 없습니다. 13-14 자리에서 BS는 대부분의 문제에 대해 경쟁적이지만 아마도 명백한 선택과는 거리가 멀며 최근의 방법으로 동의하지 않는 작업 정밀도 다이어그램을 보지 못했습니다.
Chris Rackauckas

M & G는 RKN에 대해 RKN을 테스트하고 BS 및 기타는 RKN에 대해 테스트하고 (123-132 및 151-154 페이지) RK 방법 중 가장 효율적이라고 말합니다 (버너를 인용하더라도 Verner는 포함하지 않음). BS는 13-14 자릿수에서 효율적 인 것으로 나타났습니다. 제 주장은 dop853, ABM (12), Taylor 및 표준 RK8에 대해 테스트되었으며 성능이 뛰어납니다. 나는 그것이 RKN에서 다시 테스트 한 것을 보지 못했지만 M & G에서 볼 수있는 것에서 예를 들어 FILG11과 멀지 않습니다. 나는 Verner의 RK에 진심으로 관심이 있으며 위의 링크를 볼 것입니다. 그들 모두를 볼 수있는 시험지가 있습니까?
viiv December

난 다시 가서에서 벤치 마크의 무리를 다시 실행 DiffEqBenchmarks.jlodex잘 박람회 경향이되지 않습니다. 따라서 적어도 1 차 ODE 및 공차 >=1e-13에 대해서는 외삽이 잘 수행되지 않는 것으로 보이며 일반적으로 가깝지 않습니다. 이것은 위의 주장과 일치합니다.
Chris Rackauckas 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.