C / C ++でルンゲクッタ8次を探しています


10

Windowsマシンを使用して、C ++で記述された天体力学/宇宙力学アプリケーションでルンゲクッタ8次法(89)を使用したいと思います。したがって、誰もが文書化されて自由に使用できる優れたライブラリ/実装を知っているのでしょうか?予想されるコンパイルの問題がない限り、Cで記述されていても問題ありません。

これまでのところ、このライブラリ(mymathlib)を見つけました。コードは問題ないようですが、ライセンスに関する情報は見つかりませんでした。

あなたが知っている可能性があり、私の問題に適した選択肢のいくつかを明らかにすることで私を助けてくれますか?

編集:
私が思ったほど多くのC / C ++ソースコードが利用できないことがわかります。したがって、Matlab / Octaveバージョンも問題ありません(まだ自由に使用できる必要があります)。

回答:


8

GNU Scientific Library(GSL)(C)とBoost 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 14

質問に答えるために投稿を更新しました。Prince-Dormand 45はあなたの問題をうまく解決するでしょう。
LKlevin 2014

15

長い時間スケールで天体力学を行っている場合、古典的なルンゲクッタ積分器を使用してもエネルギーは保持されません。その場合、シンプレクティックインテグレーターを使用する方が良いでしょう。Boost.odeintは、長い時間間隔でより効果的に動作する4次シンプレクティックルンゲクッタスキームも実装します。私の知る限り、GSLはシンプレクティックメソッドを実装していません。


答えてくれてありがとう。地球衛星(低軌道と深宇宙軌道)で使用した場合、おそらく1〜3軌道の期間にわたって、4次シンプレクティックルンゲクッタはRKF78よりも良い結果をもたらすでしょうか。
James C

@JamesCはい。長期的には、シンプレクティック法の方がはるかに優れています。
eccstartup 14

@eccstartup-ここで長い期間をどう思いますか?それは1日の周りの惑星の軌道、または地球など。周りの気象衛星の数軌道限り、可能性があるため
ジェームズ・C

@JamesC私はその大きな問題を観察していません。しかし、多くの軌道が計算された私のモデルの問題では、シンプレクティック法は非常に完璧な軌道を与えます。
eccstartup 2014

したがって、暗黙のルンゲクッタ法のバージョンを所有するようにプログラムすることをお勧めします。これには、必要なだけ高次のシンプレクティック法が多数含まれています。
eccstartup 14

4

いくつかのポイントを要約します:

  1. 非散逸モデルの長期的な統合である場合、シンプレクティックインテグレーターが求めているものです。
  2. それ以外の場合は、運動方程式であるため、ルンゲクッタニストロム法は、1次システムへの変換よりも効率的です。DPによる高次のRKNメソッドがあります。以下のようないくつかの実装がありますが、ここではジュリアでそれらが文書化されていると、ここではMATLABの1です
  3. 高次のルンゲクッタ法は、高精度のソリューションが必要な場合にのみ必要です。許容誤差が低い場合は、5次のRKが高速になります(同じエラーの場合)。これを頻繁に解決する必要がある場合の最善の方法は、さまざまな方法をテストすることです。この3体問題のベンチマークのセットでは、(同じエラーの)高次RKメソッドは速度のわずかな改善にすぎないことがわかりますが、エラー-> 0として、改善はすでにDormandに対して> 5xになっていることがわかります。 -プリンス45(DP5)は、4桁の精度を表示している場合(ただし、この場合、許容誤差はかなり低くなります。許容誤差は、問題の大部分に過ぎません)。公差を引くと、高次RKメソッドからの改善がさらに低下しますが、より高い精度の数値の使用を開始する必要がある場合があります。
  4. Dormand-Princeの次数7/8アルゴリズムは、ヘアラーdop853およびDifferentialEquations.jlのDP853メソッドDP8(同じ)とは異なる8次のタブローを持っています。後者の853メソッドは、エラー推定器が非標準であるため、Runge-Kuttaメソッドの標準のタブローバージョンでは実装できません。ただし、この方法の方がはるかに効率的であり、古いFehlberg 7/8またはDP 7/8の方法を使用することもお勧めしません。
  5. 高次RKメソッドの場合、Vernerの「効率的な」メソッドがゴールドスタンダードです。それは私がリンクしたベンチマークに現れます。それらを自分でBoostにコーディングするか、それらをより簡単にしたい場合はそれらを実装する2つのパッケージのいずれかを使用できます(MathematicaまたはDifferentialEquations.jl)。

2

補足として、Geoff Oxberryが(シンプレクティックインテグレーターを使用して)長期的な統合を提案しているのは事実ですが、場合によっては機能しません。より具体的には、散逸的な力がある場合、システムはエネルギーを保存できなくなるため、その場合はシンプレクティックインテグレーターに頼ることはできません。質問をしている人は低地球軌道について話していました、そしてそのような軌道は大量の大気抵抗を示します、それはそのようなシンプレクティック積分器の使用を排除する散逸力です。

その特定のケース(およびシンプレクティックインテグレーターを使用できない/使用できない/使用したくないケース)では、長いタイムスケールで精度と効率が必要な場合は、Bulirsch-Stoerインテグレーターの使用をお勧めします。経験上うまく機能し、数値レシピでも推奨されています(Press et al。、2007)。


いいえ、数値レシピはお勧めしません。特に、ほとんどの場合、Burlirsch-Stoerは推奨されません。これは本のよく知られた問題です。分野のトップリサーチャーからの反論の数々をここでご覧ください:uwyo.edu/buerkle/misc/wnotnr.html。これのベンチマークが必要な場合は、BSがほとんどうまくいかないことがわかるヘアラーの最初の本を参照してください。高次は、エラーが十分に低い場合にのみより効率的であり、私たち(および他の人)はベンチマークを行って、サブ浮動小数点の精度に対してのみ効率的であることを一貫して示しています。
Chris Rackauckas

主にODEで使用したため、NRについてはあまり話せませんが、リンク先のページの苦情は古く、NRの作成者の回答(ページの終わり)で対処されているようです。しかし、これはトピック外です。私の回答で触れていた高精度の軌道の長期的な統合(たとえば、13桁から14桁)に関しては、外挿法がうまく機能することが長い間証明されています(数値積分に関するMontenbruck&Gillの章を参照)。最近の論文もそれを使用しており、私や他の人々に信頼できる効率的な方法であることが証明されています。
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)、テイラー、および標準のRK8に対してテストされており、良好に機能します。私はそれがRKNで再度テストされたのを見たことがないことを認めなければなりませんが、M&Gから見ることができるものから、それは例えばFILG11からそれほど遠くないです。私はバーナーのRKに本当に興味があり、上のリンクを調べます。それらすべてを確認するためにテストする論文がありますか?
viiv

私は戻って、DiffEqBenchmarks.jl一連のベンチマークを再実行しましたodexが、うまくフェアする傾向がありません。したがって、少なくとも1次ODEと許容誤差の>=1e-13場合、外挿はうまく機能していないように見え、通常は近似さえしていません。これは上記の主張と一致しています。
Chris Rackauckas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.