主要内容

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

この例では,並列パラメタスプをparfevalにより実行し,その結果を計算中にDataQueueオブジェクトによって戻す方法を示します。

parfevalはmatlabをブロックしないため,計算の実行中に作業を続行できます。

この例では,ロレン常微分方程式系のパラメタ σ および ρ に対してパラメタスプを実行し,この系のカオス的性質を説明します。

d d t x σ y - z d d t y x ρ - z - y d d t z xy - β x

パラメ,タ,グリッドの作成

パラメタスプで調べるパラメタの範囲を定義します。

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”);结束

参考

|||

関連するトピック