ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

分散的方法によるレーダー追跡のシミュレーション

この例では Parallel Computing Toolbox™ を使用して、航空機の進路を追跡するレーダー基地のモンテカルロ シミュレーションを実行します。レーダー基地では、レーダー方程式を使用して航空機の位置を推定します。ここでは測定誤差を確率変数として導入し、レーダー基地はカルマン フィルターによる処理を実行してその誤差を修正します。カルマン フィルターの効果を推定するためにシミュレーションを繰り返し、そのつど航空機はランダムに選択された進路を進みます。

計算についての詳細は、pctdemo_model_radar モデルを開いてくださいpctdemo_model_radar モデルを開いてください

必要条件:

関連する例:

逐次的問題の解析

最初に、逐次的方法の例での計算が、「MATLAB 演算をタスクに分割」の例で導入されたモデルにどのように適合するかを見ます。主な計算は多数のシミュレーションですが、各シミュレーションには 1 秒未満しかかかりません。したがって、各タスクで多数のシミュレーションを実行します。関数 pctdemo_task_radar は 1 回の関数呼び出しで多くのシミュレーションを実行できるため、これをそのままタスク関数として使用できます。

例の設定とデータの読み込み

この例では、既定のプロファイルに基づいて、使用するクラスターを識別します。新しいプロファイルを作成する方法および既定のプロファイルを変更する方法については、プロファイルのドキュメンテーションプロファイルのドキュメンテーションを参照してください。例の難易度または作成されるタスクの数を変更する方法については、「Parallel Computing Toolbox の例の設定をカスタマイズ」を参照してください。

[difficulty, myCluster, numTasks] = pctdemo_helper_getDefaults();

シミュレーションの回数と各シミュレーションの長さを pctdemo_setup_radar で定義します。例の難易度によって、実行するシミュレーションの数が制御されます。関数 pctdemo_setup_radar はまた、航空機が取れる異なった進路の例と、航空機の推定位置の誤差を表示します。詳細は、pctdemo_setup_radar のコードを参照pctdemo_setup_radar のコードを参照してください。

[fig, numSims, finishTime] = pctdemo_setup_radar(difficulty);
startClock = clock;

作業を小さいタスクに分割

この例で計算量の多い部分はモンテカルロ シミュレーションであり、関数 pctdemo_helper_split_scalar を使用して numSims 件のシミュレーションを numTasks 個のタスクに分割します。

[taskSims, numTasks] = pctdemo_helper_split_scalar(numSims, numTasks);
fprintf(['This example will submit a job with %d task(s) ' ...
         'to the cluster.\n'], numTasks);
This example will submit a job with 4 task(s) to the cluster.

ジョブの作成と投入

シミュレーション ジョブと、そのジョブ内のタスクを作成します。タスク itaskSims(i) 件のシミュレーションを実行します。タスク関数は、逐次的方法の例で使用したものと同じ関数であることに注意してください。詳細は、pctdemo_task_radar のコードを参照pctdemo_task_radar のコードを参照してください。

job = createJob(myCluster);
for i = 1:numTasks
    createTask(job, @pctdemo_task_radar, 1, {taskSims(i), finishTime});
end

ジョブを投入して完了するまで待ちます。

submit(job);
wait(job);

結果の取得

ジョブの結果を取得し、すべてのタスクが正常に終了したことを確認し、そのうえでジョブを削除します。タスクが正常に完了しなかった場合は fetchOutputs がエラーをスローしますが、この場合、エラーをスローする前にジョブを削除しておく必要があります。

try
    jobResults = fetchOutputs(job);
catch err
    delete(job);
    rethrow(err);
end

結果を書式設定します。jobResults のすべての配列が列方向に連結され、したがって (finishTime + 1) 行 numSims 列の行列が得られることに注意してください。

residual = cat(2, jobResults{:});

すべての検証が完了したので、ジョブを削除します。

delete(job);

経過時間の測定

分散計算で使用される時間は、「逐次的方法によるレーダー追跡のシミュレーション」の例において、同じ一連の計算を実行するためにかかる時間と比較する必要があります。経過時間は基礎となるハードウェアおよびネットワーク インフラストラクチャによって変わります。

elapsedTime = etime(clock, startClock);
fprintf('Elapsed time is %2.1f seconds\n', elapsedTime);
Elapsed time is 31.1 seconds

結果のプロット

シミュレーションの結果を使用して、範囲推定誤差の標準偏差を時間の関数として計算します。詳細は、pctdemo_plot_radar のコードを参照pctdemo_plot_radar のコードを参照してください。

pctdemo_plot_radar(fig, residual);

この情報は役に立ちましたか?