曲がった時空の測地線を計算する MEX コードの生成
以下の例では、Einstein の一般相対性理論を使用して、曲がった時空の測地線を計算します。
必要条件
この例には必要条件はありません。
例: 水星の歳差運動の計算
この例では、水星の歳差運動を数的に計算します。歳差運動とは、太陽の周囲の楕円軌道の軸が円を描くようにわずかに振れる現象のことです。解析的には、一般相対性理論の方程式を使用すると、この値は非常にわずかで、1 世紀あたり 43 角度秒です。1 角度秒は、1/3600 度 (完全な 1 回転は 360 度) になります。たとえ歳差が極わずかであっても、これは観察と正確に一致します。純粋なニュートン力学 (太陽系の他のすべての惑星の存在を無視する) では、歳差は存在しません。
このアプリケーションでは、主なタイム ステップが 0.5 秒の可変タイム ステップでオイラー法を使用し、完全な 1 回転ごとにタイム ステップを減少します。歳差は、座標軸に対する相対角度を計算する際の太陽からの最大距離に惑星が到達するときに計算されます。
MEX 関数の生成: 水星の歳差運動
コマンドcodegen
を使用して MEX 関数を生成し、コンパイルする MATLAB ファイルの名前を指定します。
codegen gr_mercury_precession
Code generation successful.
関数 gr_mercury_precession
は他の複数の MATLAB 関数を呼び出しますが、codegen
を呼び出すときに指定する必要があるのはエントリポイント関数だけです。
既定で、codegen
は、現在のフォルダーに gr_mercury_precession_mex
という名前の MEX 関数を生成します。これにより、MATLAB コードと MEX 関数をテストして結果を比較することができます。
MEX 関数の実行: 水星の歳差運動
生成された MEX 関数を実行します。
gr_mercury_precession_mex
Progress: 5% Progress: 10% Progress: 15% Progress: 20% Progress: 25% Progress: 30% Progress: 35% Progress: 40% Progress: 45% Progress: 50% Progress: 55% Progress: 60% Progress: 65% Progress: 70% Progress: 75% Progress: 80% Progress: 85% Progress: 90% Progress: 95% Progress: 100%
precession: 0.10468" (0 years 87.87009 days) => 43.481"/century
例: ブラック ホールの光線追跡
Einstein の一般相対性理論の運動方程式は、物体を任意の速度で処理できるため、光の速度で移動する光子にも適用できます。この構成では、背景イメージの前にブラック ホールが存在します。効果をより鮮明にするには、ブラック ホールの広がりを天文学的な割合および背景イメージまで拡大します。このようにして、重力レンズの効果を調べることができます。背景イメージは、ブラック ホールによって生成された曲がった時空によって歪められます。
MEX 関数の生成: ブラック ホールの光線追跡
codegen gr_raytrace
Code generation successful.
MEX 関数の実行: ブラック ホールの光線追跡
写真の光線追跡には、2 GHz x86 マシンを使用した場合で 1 ~ 2 分かかります。画面には、元の写真 (イタリアのミラノの Vittorio Emanuele Mall) と、その隣に同じ写真でブラック ホールが前面にある場合のレンダリング後のイメージが表示されます。
gr_raytrace_mex('mall.jpg');
Progress: 5% Progress: 10% Progress: 15% Progress: 20% Progress: 25% Progress: 30% Progress: 35% Progress: 40% Progress: 45% Progress: 50% Progress: 55% Progress: 60% Progress: 65% Progress: 70% Progress: 75% Progress: 80% Progress: 85% Progress: 90% Progress: 95% Progress: 100%