主要内容

在参数扫描期间绘图parfor

这个例子展示了如何并行执行参数扫描,以及在并行计算过程中绘制进度。你可以用DataQueue在并行池上监视计算过程中的结果。你也可以用aDataQueue使用并行语言特性,例如parfor,parfevalspmd

该示例显示了如何在van der pol振荡器上执行在经典系统上的参数扫描。该系统可以表示为依赖于两个van der POL振荡器参数的一组ODES, μ. ν :

x ˙ = ν y

y ˙ = μ. ( 1 - x 2 ) y - x

您可以对这些参数执行并行参数扫描 μ. ν 使用一个parfor循环找出的平均周期 y 改变它们时。以下动画显示在本地群集中执行此示例。

设置参数扫描值

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

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

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

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

z = nan(尺寸(n));C =冲浪(m,n,z);Xlabel(“\μ值”,'口译员','tex')ylabel(“\ν值”,'口译员','tex') zlabel (“y的平均周期”)视图(137,30)轴([100 150 0.5 2 0 500]);

设置数据队列以在参数扫描期间获取结果

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

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

执行参数扫描并绘制结果

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

parforN = 1:numel(N) [t, y] = solveVdp(M(ii), N(ii));l = islocalmax(y(:, 2));发送(D, [ii的意思(diff (t (l)))));结束
使用“local”配置文件启动并行池(parpool)…已连接到并行池(workers: 6)。

扩展到集群

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

gridSize = 25;删除(gcp (“nocreate”));parpool (“MyClusterInTheCloud”4);
使用“MyClusterIntheCloud”配置文件启动并行池(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]);结束

为数据队列声明一个函数,以使用来自工作人员的结果更新图表。

功能UpdateSurface(s,d)s.zdata(d(1))= d(2);rawingow(“limitrate”);结束

另请参阅