在参数扫描期间绘制parfor
并行执行参数扫描,并在并行计算期间绘制进度图。
你可以使用DataQueue
在并行池上计算期间监视结果。你也可以用aDataQueue
具有并行语言的特性,如parfor
,parfeval
而且spmd
.
这个例子展示了如何在经典的范德堡尔振荡器系统上执行参数扫描。这个系统可以表示为一组ode,依赖于范德堡尔振荡器的两个参数, 而且 :
可以对参数执行并行参数扫描
而且
使用一个parfor
循环求的周期均值
当改变它们的时候。下面的动画显示了这个示例在本地集群中的执行。
设置参数扫描值
定义要研究的参数的值范围。创建一个网格来考虑参数的不同组合。
gridSize = 6;mu = linspace(100,150, gridSize);nu = linspace(0.5, 2, gridSize);[M,N] = meshgrid(mu,nu);
准备一个表面图来可视化结果
声明一个变量来存储扫描结果。使用南
用于预分配,以避免绘制初始曲面。创建一个曲面图,以可视化每个参数组合的扫描结果。准备标题、标签和限制等设置。
Z = nan(size(N));c = surf(M, N, Z);包含(“\μ值”,“翻译”,“泰克斯”) ylabel (“\ν值”,“翻译”,“泰克斯”) zlabel (y的平均周期)视图(137,30)轴([100 150 0.5 2 0 500]);
设置一个数据队列来获取参数扫描的结果
创建一个DataQueue
将工人的中间结果发送给客户端。使用afterEach
函数在客户端中定义一个回调函数,在每次worker发送当前结果时更新曲面。
D = parallel.pool.DataQueue;D.afterEach(@(x) updateSurface(c, x));
执行参数扫描和绘图结果
使用parfor
执行并行参数扫描。指导工人求解网格中各参数组合的系统,并计算平均周期。当worker完成计算时,立即将每次迭代的结果发送回客户端。
parforii = 1:numel(N) [t, y] = solveVdp(M(ii), N(ii));L = islocalmax(y(:, 2));send(D, [ii mean(diff(t(l)))]);结束
使用“本地”配置文件启动并行池(parpool)…连接到并行池(工人数:6)。
扩展到集群
如果您可以访问集群,则可以扩展计算。要做到这一点,请删除前一个parpool
,并使用大型集群的配置文件打开一个新的配置文件。下面的代码显示了名为“MyClusterInTheCloud”
.要自己运行此代码,必须替换“MyClusterInTheCloud”
集群配置文件的名称。调整工人数量。这个例子显示了4个工人。通过增加网格的大小来增加整体计算的大小。
gridSize = 25;删除(gcp (“nocreate”));parpool (“MyClusterInTheCloud”4);
使用' myclusterincloud '配置文件启动并行池(parpool)…连接到并行池(工人数量:4)。
如果在设置集群配置文件之后再次运行参数扫描代码,那么集群中的worker将进行计算,并在结果可用时将结果发送到MATLAB客户端。下面的动画展示了这个例子在集群中的执行。
辅助函数
创建一个辅助函数来定义方程组,并在其上应用求解器。
函数[t, y] = solveVdp(mu, nu) f = @(~,y) [nu*y(2);μ* (1 y (1) ^ 2) * y (2) - y (1)];[t,y] = ode23s(f,[0 20*mu],[2;0]);结束
为DataQueue声明一个函数,用来自工作者的结果更新图。
函数updateSurface(s, d) s. zdata (d(1)) = d(2);drawnow (“limitrate”);结束