文档

在参数扫描期间绘图parfor

这个示例展示了如何并行执行参数扫描和在并行计算期间绘制进度。你可以用DataQueue监视并行池计算期间的结果。你可以用DataQueue具有并行语言特性,例如parfor,parfevalspmd。这个例子展示了如何在经典系统范德堡尔振荡器上执行参数扫描。该系统可以表示为一组依赖于两个范德堡尔振荡器参数的ode,:

您可以对参数执行并行参数扫描使用一个parfor循环来找出的平均周期当不同。下面的动画显示了本示例在本地集群中的执行。

设置参数扫描值

定义要研究的参数的值范围。创建一个meshgrid来考虑参数的不同组合。

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

准备一个表面图,使结果可视化

声明一个变量来存储扫描的结果。使用用于预先分配,以避免绘制初始曲面。创建一个表面图,以可视化每个参数组合的扫描结果。准备设置,如标题,标签和限制。

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

设置一个DataQueue以在参数扫描期间获取结果

创建一个DataQueue将工人的中间结果发送给客户。使用afterEach函数在客户端定义一个回调,该回调在worker每次发送当前结果时更新表面。

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

执行参数扫描和绘图结果

使用parfor执行并行参数扫描。指导工作人员对meshgrid中各参数组合进行系统求解,计算平均周期。当worker完成计算时,立即将每次迭代的结果发送回客户端。

parforii = 1:numel(N) [t, y] = solveVdp(N(ii), M(ii))l = islocalmax(y(:, 2));发送(D, [ii的意思(diff (t (l)))));结束

扩展到一个集群

如果您可以访问集群,则可以进行扩展。要做到这一点,删除前一个parpool并使用更大集群的配置文件打开一个新集群。下面的代码显示了一个名为“MyClusterInTheCloud”。要自己运行此代码,必须进行替换“MyClusterInTheCloud”使用集群配置文件的名称。调整工人的数量。示例显示了4个工人。通过增加网格的大小来增加总体计算的大小。

gridSize = 25;删除(gcp (“nocreate”));parpool (“MyClusterInTheCloud”4);

如果您在设置集群概要文件之后再次运行参数扫描代码,那么集群中的工作人员将计算结果,并在它们可用时将结果发送到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声明一个函数,用来自workers的结果更新图。

函数updateSurface(s, d) s.ZData(d(1)) = d(2);drawnow (“limitrate”);结束
使用'MyClusterInTheCloud'配置文件启动并行池(parpool)…与4名工人联系。

另请参阅

这个话题有用吗?