主要内容

在参数扫描期间绘制parfor

并行执行参数扫描,并在并行计算期间绘制进度图。

你可以使用DataQueue监视并行池上计算期间的结果。你也可以用aDataQueue具有并行语言等特性parforparfeval而且spmd

这个例子展示了如何在经典系统Van der Pol振荡器上进行参数扫描。这个系统可以表示为一组依赖于两个范德堡尔振荡器参数的ode, μ 而且 ν

x ˙ ν y

y ˙ μ 1 - x 2 y - x

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

设置参数扫描值

定义要探测的参数的值范围。创建一个网格来说明参数的不同组合。

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将工作者的中间结果发送到客户机。使用afterEach函数在客户端中定义一个回调,该回调在每次工作者发送当前结果时更新曲面。

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

执行参数扫描和绘制结果

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

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

扩展到集群

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

gridSize = 25;删除(gcp (“nocreate”));parpool (“MyClusterInTheCloud”4);
使用“myclusterincloud”配置文件启动并行池(parpool)…连接到并行池(工人数量: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声明一个函数,用来自工作者的结果更新图。

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

另请参阅

|

相关的话题

Baidu
map