parfeval
を使用したパラメタスプ中のプロット
この例では,並列パラメタスプをparfeval
により実行し,その結果を計算中にDataQueue
オブジェクトによって戻す方法を示します。
parfeval
はmatlabをブロックしないため,計算の実行中に作業を続行できます。
この例では,ロレン常微分方程式系のパラメタ および に対してパラメタスプを実行し,この系のカオス的性質を説明します。
パラメ,タ,グリッドの作成
パラメタスプで調べるパラメタの範囲を定義します。
gridSize = 40;sigma = linspace(5, 45, gridSize);rho = linspace(50,100, gridSize);Beta = 8/3;
関数meshgrid
を使用して,パラメ,タ,の2次元グリッドを作成します。
[rho,sigma] = meshgrid(rho,sigma);
图オブジェクトを作成し,“可见”
を真正的
に設定すると,このオブジェクトがラ。パラメタスプの結果を可視化するには,表面プロットを作成します。表面のZ
要素を南
で初期化すると,空のプロットが作成されることに注意してください。
图(“可见”,真正的);surface = surf(rho,sigma,NaN(size(sigma)));包含(‘\ρ,“翻译”,“泰克斯”) ylabel (‘\σ’,“翻译”,“泰克斯”)
並列環境の設定
関数parpool
を使用して並列ワ,カ,のプ,ルを作成します。
parpool;
使用'Processes'配置文件启动并行池(parpool)…连接到并行池(工人数:6)。
ワ,カ,からデ,タを送信するには,DataQueue
オブジェクトを作成します。関数afterEach
を使用して,ワ,カ,がデ,タを送信するたびに表面プロットを更新する関数を設定します。関数updatePlot
は,この例の最後で定義するサポ,ト関数です。
Q = parallel.pool.DataQueue;afterEach (Q, @(数据)updatePlot(表面、数据));
並列パラメタスプの実行
パラメタを定義した後,並列パラメタスプを実行できます。
作業負荷を分散すると,parfeval
の効率性が向上します。作業負荷を分散するには,調べるパラメ,タ,をグル,プ化して分割します。この例では、コロン演算子(:
)を使用して,サ一步
として均等に分割します。この結果得られる配列分区
には,分割の境界が含まれます。最後の分割の終点を追加しなければならないことに注意してください。
Step = 100;分区=[1:步骤:数字(西格玛),数字(西格玛)+1]
分区=1×171101 201 301 401 501 601 701 801 901 1001 1101 1201 1301 1401 1501 1601
最良のパフォ,マンスを得るには,次のように分割するようにします。
分割のスケジュ,リングのオ,バ,ヘッドよりも計算時間が長くなる程度に大きい
すべてのワ,カ,をビジ,状態に維持するために十分な分割数が存在する程度に小さい
並列ワ,カ,での関数の実行を表し,その結果を保持するには,未来オブジェクトを使用します。
f(1:numel(partitions)-1) = parallel.FevalFuture;
関数parfeval
を使用して,計算を並列ワ,カ,にオフロ,ドします。parameterSweep
はこのスクリプトの最後で定義されている補助関数で,調べるパラメーターの分割についてのローレンツ系を解きます。これには出力引数が1あるため,parfeval
では出力の数として1
を指定しなければなりません。
为ii = 1:数值(分区)-1 f(ii) = parfeval(@parameterSweep,1,分区(ii),分区(ii+1),西格玛,rho,beta,Q);结束
parfeval
はmatlabをブロックしないため,計算の実行中に作業を続行できます。ワ,カ,は並列で計算を実行し,中間結果を使用できるようになったらDataQueue
によって送信します。
parfeval
が完了するまでMATLABをブロックする場合は,未来オブジェクトに対して関数等待
を使用します。この後のコ,ドがparfeval
の完了に依存する場合,関数等待
を使用すると便利です。
等待(f);
parfeval
が計算を完了すると,等待
は終了し,さらにコ,ドを実行できるようになります。たとえば,結果として生成される表面の輪郭をプロットします。関数fetchOutputs
を使用して,未来オブジェクトに保存された結果を取得します。
results =重塑(fetchOutputs(f),gridSize,[]);contourf(ρ,σ,结果)包含(‘\ρ,“翻译”,“泰克斯”) ylabel (‘\σ’,“翻译”,“泰克斯”)
パラメ、タ、ス、プで計算リソ、スが多く必要で、クラスタ、にアクセス可能な場合は、parfeval
の計算をスケ,ルアップできます。詳細にいては,デスクトップからクラスタ,へのスケ,ルアップを参照してください。
補助関数の定義
調べるパラメ,タ,の分割のロ,レン,系を解く補助関数を定義します。DataQueue
オブジェクトで関数发送
を使用して,中間結果をmatlabクラescアントに送信します。
函数results = parameterscan (first,last,sigma,rho,beta,Q) results = 0 (last-first,1);为2 =第一:持续1 lorenzSystem = @ (t))(σ(ii) * ((2) - (1));A (1)*(rho(ii) - A (3)) - A (2);A (1)* A (2) - * A (3)];[t,a] = ode45(lorenzSystem,[0 100],[1 1 1]);Result = a(end,3);发送(Q, [ii,结果]);Results (ii-first+1) = result;结束结束
新しいデ,タを受け取った時点で表面プロットを更新する別の補助関数を定義します。
函数updatePlot(surface,data) surface. zdata (data(1)) = data(2);drawnow (“limitrate”);结束
参考
parpool
|parallel.pool.DataQueue
|afterEach
|parfeval