
物理学および天文学において、N体シミュレーションは、通常、重力などの物理的な力の影響下にある粒子の動的システムのシミュレーションです(他のアプリケーションについてはn体問題を参照)。N体シミュレーションは、地球-月-太陽系のような少数の物体のシステムのダイナミクスを調査することから、宇宙の大規模構造の進化を理解することまで、天体物理学で広く使用されているツールです。[ 1 ]物理宇宙論では、N体シミュレーションは、暗黒物質の影響による銀河フィラメントや銀河ハローなどの非線形構造形成のプロセスを研究するために使用されます。直接N体シミュレーションは、星団の動的進化を研究するために使用されます。
シミュレーションで扱われる「粒子」は、粒子状の性質を持つ物理的な物体に対応する場合もあれば、対応しない場合もある。たとえば、星団のN体シミュレーションでは、星ごとに粒子が存在する可能性があり、各粒子は何らかの物理的な意味を持つ。一方、ガス雲のシミュレーションでは、ガスの原子や分子ごとに粒子を用意することはできない。なぜなら、そのためにはオーダーの計算量が必要になるからである。物質1モルあたり10²³個の粒子が存在する(アボガドロ定数を参照)ため、 1つの「粒子」は、はるかに大きな量のガスを表すことになる(多くの場合、平滑化粒子流体動力学を用いて実装される)。この量は物理的な意味を持つ必要はなく、精度と扱いやすいコンピュータ要件との妥協点として選択する必要がある。
暗黒物質は銀河の形成において重要な役割を果たしている。暗黒物質粒子の密度f(位相空間における)の時間発展は、無衝突ボルツマン方程式によって記述できる。
方程式では、は速度、Φ はポアソン方程式で与えられる重力ポテンシャルです。これらの 2 つの連立方程式は、暗黒物質粒子の初期条件を決定した後、フリードマン方程式によって支配される膨張する背景宇宙で解かれます。暗黒物質粒子の位置と速度を初期化するために用いられる従来の方法は、均一なデカルト格子またはガラス状の粒子配置内で粒子を移動させることです。[ 2 ]これは、線形理論近似または低次摂動理論を使用して行われます。[ 3 ]
直接重力N体シミュレーションでは、 N個の粒子が相互に及ぼす重力の影響下にある系の運動方程式を、 簡略化のための近似を一切用いずに数値的に積分します。これらの計算は、恒星や惑星などの個々の物体間の相互作用が系の進化に重要な役割を果たす場合に用いられます。
最初の直接的な重力N体シミュレーションは、1941年にルンド天文台のエリック・ホルムバーグによって行われ、光の伝播と重力相互作用の数学的等価性を介して、銀河に遭遇する際の星間の力を決定しました。星の位置に電球を設置し、光電セルで星の位置における方向性のある光束を測定することで、運動方程式を積分することができます。努力。 [ 4 ]その後、ドイツのハイデルベルクにある天文学計算研究所のセバスチャン・フォン・ヘルナーが、最初の純粋な計算シミュレーションを行った。ケンブリッジ大学(英国)のスヴェレ・アーセトは、適応型(階層型)時間ステップ、アフマド・コーエン近傍スキーム、近接遭遇の正則化を使用する、天体物理学アプリケーション向けの一連の非常に効率的なN体コードの開発に科学者としての生涯を捧げた。正則化は、互いに任意に接近する2つの粒子に対するニュートンの万有引力の法則の特異点を取り除くための数学的なトリックである。スヴェレ・アーセトのコードは、星団、惑星系、銀河核の力学を研究するために使用されている。
多くのシミュレーションは十分に大きいため、フリードマン・ルメートル・ロバートソン・ウォーカー宇宙論を確立する上で一般相対性理論の影響は顕著です。これは、共動座標系における時間的変化(またはスケールファクター)としてシミュレーションに組み込まれ、粒子が共動座標系で減速する原因となります(粒子の物理エネルギーの赤方偏移による影響も含む)。しかし、一般的な動的時間スケールはシミュレーションにおける光の横断時間に比べて長く、粒子によって誘起される時空の曲率と粒子の速度は小さいため、一般相対性理論と重力の有限速度の影響はそれ以外では無視できます。これらの宇宙論的シミュレーションの境界条件は通常周期的(またはトーラス状)であるため、シミュレーション領域の一方の端が反対側の端と一致します。
N体シミュレーションは原理的には単純で、ニュートン重力における粒子の運動を定義する6N個の常微分方程式を積分するだけで済みます。実際には、関与する粒子の数Nは通常非常に大きく(典型的なシミュレーションでは数百万個、ミレニアムシミュレーションでは100億個)、計算する必要のある粒子間相互作用の数はN²のオーダーで増加するため、微分方程式を直接積分すると計算コストが非常に高くなる可能性があります。そのため、一般的にいくつかの改良が用いられます。
数値積分は通常、リープフロッグ積分などの手法を用いて小さな時間ステップで実行されます。しかし、すべての数値積分には誤差が生じます。ステップを小さくすると誤差は小さくなりますが、計算速度は遅くなります。リープフロッグ積分は時間ステップに対しておおよそ2次精度ですが、ルンゲ・クッタ法などの他の積分法では4次精度、あるいはそれ以上の精度が得られます。
最も単純な改良点の1つは、各粒子が独自のタイムステップ変数を持つようにすることで、動的時間が大きく異なる粒子をすべて、最も短い時間を持つ粒子と同じ速度で時間発展させる必要がないようにすることです。
このようなシミュレーションの計算時間を短縮するための基本的な近似手法は2つあります。これらは精度を犠牲にする代わりに、計算複雑度をO(N log N)以下にまで削減できます。
バーンズ・ハット・シミュレーションなどのツリー法では、通常、オクツリーを使用してボリュームを立方体のセルに分割し、近くのセルの粒子間の相互作用のみを個別に処理する必要があります。遠く離れたセルの粒子は、遠く離れたセルの重心を中心とする単一の大きな粒子(または低次の多重極展開)としてまとめて処理できます。これにより、計算する必要のある粒子ペアの相互作用の数を大幅に削減できます。粒子間の相互作用の計算によってシミュレーションが過負荷にならないようにするには、セルあたり多数の粒子を含むシミュレーションの密集部分で、セルをより小さなセルに細分化する必要があります。粒子が均等に分布していないシミュレーションでは、 CallahanとKosarajuの十分に分離されたペア分解法により、固定次元で反復ごとに最適なO( n log n )時間が得られます。
もう一つの可能性は、粒子メッシュ法である。この方法では、空間をメッシュ上に離散化し、重力ポテンシャルを計算する目的で、粒子はメッシュの周囲の2×2の頂点に分割されていると仮定する。ポテンシャルエネルギーΦは、ポアソン方程式を用いて求めることができる。
ここでGはニュートン定数であり、は密度(メッシュ点における粒子の数)です。高速フーリエ変換は、ポアソン方程式が単純な形式となる周波数領域に移行することで、これを効率的に解くことができます。
どこは共動波数であり、ハットはフーリエ変換を表す。重力場は、を掛けることで求めることができる。そして逆フーリエ変換を計算する(または逆変換を計算してから他の方法を用いる)。この方法はメッシュサイズによって制限されるため、実際にはより小さなメッシュ、あるいは他の手法(ツリーや単純な粒子間アルゴリズムとの組み合わせなど)を用いて小規模な力を計算する。場合によっては適応メッシュが用いられることもあり、その場合、シミュレーションの密度の高い領域ではメッシュセルがはるかに小さくなる。
太陽系内の天体の軌道をかなり正確に推定するために、いくつかの異なる重力摂動アルゴリズムが使用されている。
人工衛星を凍結軌道に乗せることはよくあります。地球を周回する人工衛星の軌道は、地球の中心を周回する2体楕円軌道を基本として、地球の扁平率、太陽と月の引力、大気抵抗などによる微調整を加えることで正確にモデル化できます。そのため、人工衛星の実際の軌道を計算することなく、凍結軌道を見つけることが可能です。
小型惑星、彗星、あるいは長距離宇宙船の軌道は、太陽の周りを回る2体楕円軌道を起点とし、既知の軌道にあるより大きな惑星の重力による微調整を加えることで、多くの場合正確にモデル化できる。
粒子系の長期的な経路の特性の一部は直接計算できる。個々の粒子の実際の経路を中間段階として計算する必要はない。こうした特性には、リアプノフ安定性、リアプノフ時間、エルゴード理論に基づく様々な測定値などが含まれる。
典型的なシミュレーションでは数百万または数十億個の粒子が存在しますが、それらは通常、非常に大きな質量(典型的には太陽質量の10⁹ 倍 )を持つ実際の粒子に対応します。このため、粒子間の短距離相互作用、例えば二粒子連星系の形成などに問題が生じる可能性があります。粒子は多数のダークマター粒子や星の集団を表すことを意図しているため、このような連星系は非物理的です。これを防ぐために、短距離で半径の二乗に反比例して発散しない、軟化したニュートン力法則が使用されます。ほとんどのシミュレーションでは、有限サイズのセルでシミュレーションを実行することで、これをごく自然に実現しています。粒子が常に自身に及ぼす力がゼロになるように離散化手順を実装することが重要です。
ソフトニングは、N体シミュレーションにおいて、粒子が別の粒子に近づきすぎた場合(力が無限大になる場合)に数値発散を防ぐために用いられる数値的なトリックです。これは、各粒子の正則化された重力ポテンシャルを次のように修正することによって得られます。
(1/rではなく)は軟化パラメータです。シミュレーションが現実的なものとなるよう、軟化パラメータの値は十分に小さく設定する必要があります。
N体シミュレーションは、大規模なダークマター分布とダークマターハローの構造に関する知見を与えている。冷たいダークマターのシミュレーションによると、大規模なダークマターの全体的な分布は完全に均一ではない。むしろ、空隙、壁、フィラメント、ハローからなるネットワークに似た構造を示している。また、シミュレーションは、ハローの集中度と質量、初期ゆらぎスペクトル、宇宙論的パラメータなどの要因との関係が、ハローの実際の形成時間と関連していることを示している。[ 5 ]特に、質量の小さいハローはより早く形成される傾向があり、その結果、形成時の宇宙の密度が高いため、集中度が高くなる。ハローの形状は完全な球形から逸脱していることがわかっている。一般的に、ハローは細長く、中心に向かってますます長楕円形になることがわかっている。しかし、ダークマターとバリオンの相互作用は、ダークマターハローの内部構造に影響を与えるだろう。微細構造を研究するには、暗黒物質とバリオンの両方をモデル化したシミュレーションが必要である。
多くのシミュレーションは冷たい暗黒物質のみをシミュレートするため、重力のみを考慮しています。バリオン、レプトン、光子をシミュレーションに組み込むと、その複雑さは劇的に増大し、多くの場合、基礎となる物理法則を大幅に単純化する必要が生じます。しかし、これは非常に重要な分野であり、多くの最新のシミュレーションは、銀河バイアスを説明できる可能性のある銀河形成中に起こるプロセスを理解しようとしています。
ReifとTate [ 6 ]は、 n体到達可能性問題が次のように定義される場合、固定静電ポテンシャル法則を満たすn個の物体が与えられたとき、物体が指定された時間制限内に目的地のボールに到達するかどうかを判定する問題がPSPACEに含まれることを証明している。ここで、我々はpoly( n )ビットの精度を要求し、目標時間はpoly( n )である。
一方、物体が最終的に目的地のボールに到達するかどうかが問題である場合、この問題はPSPACE困難である。これらの上限は、レイトレーシングで得られた同様の複雑性の上限に基づいている。
N体シミュレーションの最も単純な実装では、これは、軌道上の物体の単純な伝播です。単純とは、軌道上の物体に作用する力は、物体同士が互いに及ぼし合う重力のみであることを意味します。C ++などのオブジェクト指向プログラミング言語では、伝播に必要な基本的な数学的構造とデータコンテナを確立するために、いくつかの定型コードが役立ちます。具体的には、状態ベクトル、したがってベクトル、そしてこのデータと軌道上の物体の質量を含む基本的なオブジェクトです。この方法は、他のタイプの N 体シミュレーションにも適用できます。電荷を持つ点質量のシミュレーションでは、同様の方法を使用しますが、力は電場の相互作用による引力または斥力によるものです。いずれにせよ、粒子の加速は、力ベクトルの合計を粒子の質量で割った結果です。
粒子の運動学的データを格納するための、プログラム的に安定かつスケーラブルな方法の一例として、固定長配列の使用が挙げられます。最適化されたコードでは、メモリの割り当てが容易になり、消費されるリソースを予測できます。以下のC++コードをご覧ください。
struct Vector3{double e [ 3 ] = { 0 };Vector3 () {}~ Vector3 () {}inline Vector3 ( double e0 , double e1 , double e2 ){this -> e [ 0 ] = e0 ;this -> e [ 1 ] = e1 ;this -> e [ 2 ] = e2 ;}};struct OrbitalEntity{double e [ 7 ] = { 0 };OrbitalEntity () {}~ OrbitalEntity () {}inline OrbitalEntity ( double e0 , double e1 , double e2 , double e3 , double e4 , double e5 , double e6 ){this -> e [ 0 ] = e0 ;this -> e [ 1 ] = e1 ;this -> e [ 2 ] = e2 ;this -> e [ 3 ] = e3 ;this -> e [ 4 ] = e4 ;this -> e [ 5 ] = e5 ;this -> e [ 6 ] = e6 ;}};OrbitalEntity状態ベクトルを格納するのに十分なスペースがあることに注意してください。ここで、
さらに、OrbitalEntity質量値のための十分なスペースがあります。
一般的に、N体シミュレーションは、何らかの運動方程式に基づくシステムになります。これらのシステムのほとんどは、シミュレーションを「シード」するための初期構成に依存します。重力や電位に依存するシステムなどでは、シミュレーションエンティティにかかる力はその速度に依存しません。したがって、シミュレーションの力のシードには、初期位置のみが必要ですが、これだけでは伝播はできません。初期速度が必要です。恒星の周りを公転する惑星を考えてみましょう。惑星は運動していませんが、主星の重力の影響を受けています。時間が経過し、時間ステップが追加されると、惑星は加速度に応じて速度を増します。ある瞬間には、ただし、隣接する質量による物体の合力加速度は、その速度に依存しないが、時間ステップではその結果生じる位置の変化は、伝播が速度に本質的に依存するため、大きく異なります。以下で使用するシンプレクティックオイラー法などの基本的な伝播メカニズムでは、速度のみに依存する位置のずれは次のように計算されます
加速なしで、静止しているが、位置だけを見ている観測者の視点からすると、速度の変化を見るには2つの時間ステップかかる。
太陽系のようなシミュレーションは、中心星から惑星に相当する点質量までの平均距離を求めることで実現できます。コードを簡潔にするため、長半径と平均速度に基づく非厳密なアプローチを採用します。これらの天体を構成する前に、メモリ領域を確保する必要があります。拡張性を確保するため、mallocコマンドを使用できます。
OrbitalEntity * orbital_entities = malloc ( sizeof ( OrbitalEntity ) * ( 9 + N_ASTEROIDS ));orbital_entities [ 0 ] = { 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 1.989e30 }; // 太陽に似た恒星orbital_entities [ 1 ] = { 57.909e9 , 0.0 , 0.0 , 0.0 , 47.36e3 , 0.0 , 0.33011e24 }; // 水星に似た惑星orbital_entities [ 2 ] = { 108.209e9 , 0.0 , 0.0 , 0.0 , 35.02e3 , 0.0 , 4.8675e24 }; // 金星に似た惑星orbital_entities [ 3 ] = { 149.596e9 , 0.0 , 0.0 , 0.0 , 29.78e3 , 0.0 , 5.9724e24 }; // 地球に似た惑星orbital_entities [ 4 ] = { 227.923e9 , 0.0 , 0.0 , 0.0 , 24.07e3 , 0.0 , 0.64171e24 }; // 火星に似た惑星orbital_entities [ 5 ] = { 778.570e9 , 0.0 , 0.0 , 0.0 , 13e3 , 0.0 , 1898.19e24 }; // 木星に似た惑星orbital_entities [ 6 ] = { 1433.529e9 , 0.0 , 0.0 , 0.0 , 9.68e3 , 0.0 , 568.34e24 }; // 土星に似た惑星orbital_entities [ 7 ] = { 2872.463e9 , 0.0 , 0.0 , 0.0 , 6.80e3 , 0.0 , 86.813e24 }; // 天王星に似た惑星orbital_entities [ 8 ] = { 4495.060e9 , 0.0 , 0.0 , 0.0 , 5.43e3 , 0.0 , 102.413e24 }; // 海王星に似た惑星ここでN_ASTEROIDS、 は一時的に 0 のままになる変数ですが、ユーザーの裁量で将来的に多数の小惑星を含めることができます。シミュレーションの設定における重要なステップは、シミュレーションの時間範囲を設定することです。に増分時間ステップも同様これによりシミュレーションが進行します。
double t_0 = 0 ;double t = t_0 ;double dt = 86400 ;double t_end = 86400 * 365 * 10 ; // 約10年分(秒単位)double BIG_G = 6.67e-11 ; // 重力定数上記で確立された位置と速度は、以下の条件を満たすものとして解釈される。。
シミュレーションの範囲は論理的に次の期間となる。。
シミュレーション全体は無数の時間ステップから構成される可能性があります。基本的なレベルでは、各時間ステップでは、各物体について以下を計算します。
上記は、whileループで非常に簡単に実装できます。前述の範囲内に存在する:
while ( t < t_end ) { for ( size_t m1_idx = 0 ; m1_idx < 9 + N_ASTEROIDS ; m1_idx ++ ) { Vector3 a_g = { 0 , 0 , 0 };for ( size_t m2_idx = 0 ; m2_idx < 9 + N_ASTEROIDS ; m2_idx ++ ) { if ( m2_idx != m1_idx ) { Vector3 r_vector ;r_vector.e [ 0 ] = orbital_entities [ m1_idx ] .e [ 0 ] - orbital_entities [ m2_idx ] .e [ 0 ] ; r_vector.e [ 1 ] = orbital_entities [ m1_idx ] .e [ 1 ] - orbital_entities [ m2_idx ] .e [ 1 ] ; r_vector.e [ 2 ] = orbital_entities [ m1_idx ] .e [ 2 ] - orbital_entities [ m2_idx ] .e [ 2 ] ;double r_mag = sqrt ( r_vector . e [ 0 ] * r_vector . e [ 0 ] + r_vector . e [ 1 ] * r_vector . e [ 1 ] + r_vector . e [ 2 ] * r_vector . e [ 2 ]);倍速加速度= -1.0 * BIG_G * ( orbital_entities [ m2_idx ]. e [ 6 ]) / pow ( r_mag , 2.0 );Vector3 r_unit_vector = { r_vector . e [ 0 ] / r_mag , r_vector . e [ 1 ] / r_mag , r_vector . e [ 2 ] / r_mag };a_g.e [ 0 ] + = acceleration * r_unit_vector.e [ 0 ] ; a_g.e [ 1 ] + = acceleration * r_unit_vector.e [ 1 ] ; a_g.e [ 2 ] + = acceleration * r_unit_vector.e [ 2 ] ; } }orbital_entities [ m1_idx ] .e [ 3 ] + = a_g.e [ 0 ] * dt ; orbital_entities [ m1_idx ] .e [ 4 ] + = a_g.e [ 1 ] * dt ; orbital_entities [ m1_idx ] .e [ 5 ] + = a_g.e [ 2 ] * dt ; }for ( size_t entity_idx = 0 ; entity_idx < 9 + N_ASTEROIDS ; entity_idx ++ ) { orbital_entities [ entity_idx ]. e [ 0 ] += orbital_entities [ entity_idx ]. e [ 3 ] * dt ; orbital_entities [ entity_idx ]. e [ 1 ] += orbital_entities [ entity_idx ]. e [ 4 ] * dt ; orbital_entities [ entity_idx ]. e [ 2 ] += orbital_entities [ entity_idx ]. e [ 5 ] * dt ; } t += dt ; }シミュレーションにおいて内側の4つの岩石惑星に焦点を当てると、上記の伝播によって生じる軌道は以下のようになる。
