主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

parforを使用したパラメータースイープ中のプロット

この例では,パラメータースイープを並列実行して,並列計算中に進行状況をプロットする方法を説明します。DataQueueを使用して,並列プールでの計算中に結果を監視できます。また,DataQueueparforparfevalspmdなどの並列言語機能と共に使用することもできます。

この例では,古典的なシステムであるファンデルポール振動子でパラメータースイープを実行する方法を説明します。このシステムは,ファンデルポール振動子の2つのパラメーター μ ν に依存する一連の颂歌として表すことができます。

x ˙ ν y

y ˙ μ 1 - x 2 y - x

parforループを使用してパラメーター μ および ν に対して並列パラメータースイープを実行し,パラメーター変動時の y の平均周期を求めることができます。次のアニメーションは,この例をローカルクラスターで実行した場合を示します。

パラメータースイープ値の設定

調査するパラメーターの値の範囲を定義します。パラメーターのさまざまな組み合わせに対処するために,meshgridを作成します。

gridSize = 6;mu = linspace(100, 150, gridSize);nu = linspace(0.5, 2, gridSize);[M, N] = meshgrid(μ,ν);

結果を可視化する表面プロットの準備

スイープの結果を格納する変数を宣言します。を使用して事前代入し,初期表面がプロットされないようにします。パラメーターの組み合わせごとに,スイープの結果を可視化する表面プロットを作成します。タイトル,ラベル,範囲などを設定します。

Z =南(大小(N));c = surf(M, N, Z);包含(“\μ值”“翻译”“泰克斯”) ylabel (“\ν值”“翻译”“泰克斯”) zlabel (“y的平均周期”)视图(137,30)轴([100 150 0.5 2 0 500]);

パラメータースイープ中に結果を取得するDataQueueの設定

中間結果をワーカーからクライアントに送信するためにDataQueueを作成します。関数afterEachを使用して,ワーカーが現在の結果を送信するたびに表面を更新するコールバックをクライアントで定義します。

D = parallel.pool.DataQueue;D.afterEach (@ (x) updateSurface (c、x));

パラメータースイープの実行と結果のプロット

parforを使用して並列パラメータースイープを実行します。meshgridのパラメーターの組み合わせごとにシステムの解を求めて平均周期を計算するように,ワーカーに指示します。ワーカーが計算を終了するとすぐに,各反復の結果をクライアントに送信します。

parforii = 1:numel(N) [t, y] = solveVdp(M(ii), N(ii));L = islocalmax(y(:, 2));发送(D, [ii的意思(diff (t (l)))));结束
使用“local”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:6)。

クラスターへのスケールアップ

クラスターにアクセスできる場合,計算をスケールアップできます。これを行うには,前回のparpoolを削除し,より大きいクラスター用のプロファイルを使用して新しいものを開きます。以下のコードは,“MyClusterInTheCloud”という名前のクラスタープロファイルを示します。このコードを実行するには,“MyClusterInTheCloud”を自分のクラスタープロファイルの名前に置き換えなければなりません。ワーカー数を調整します。この例では4個のワーカーが示されています。グリッドのサイズを大きくして,計算全体のサイズを大きくします。

gridSize = 25;删除(gcp (“nocreate”));parpool (“MyClusterInTheCloud”4);
使用myclusterincloud配置文件启动并行池(parpool)…连接到并行池(工作人员数量:4)。

クラスタープロファイルの設定後にパラメータースイープコードを再度実行すると,クラスターのワーカーが計算を行い,結果が使用可能になるとMATLABクライアントに送信します。次のアニメーションは,この例をクラスターで実行した場合を示します。

補助関数

方程式系を定義する補助関数を作成し,それにソルバーを適用します。

函数[t, y] = = * (u, u)μ* (1 y (1) ^ 2) * y (2) - y (1)];[t,y] = ode23s(f,[0 20*mu],[2;0]);结束

ワーカーから得られた結果でグラフを更新するために,DataQueueの関数を宣言します。

函数updatessurface (s, d) . zdata (d(1)) = d(2);drawnow (“limitrate”);结束

参考