在参数扫描与阴谋parfor
这个例子展示了如何执行一个参数在并行计算并行扫描和情节的进展。您可以使用一个DataQueue
监测结果在计算一个平行的池。你也可以使用DataQueue
与并行语言特性等parfor
,parfeval
和spmd
。
这个例子展示了如何执行一个参数扫描在古典系统上,范德堡尔振荡器。这个系统可以表示为一组常微分方程依赖于两个范德堡尔振荡器参数, 和 :
您可以执行一个平行的参数扫描参数
和
使用一个parfor
循环的平均周期
当不同。下面的动画显示了一个执行这个例子的本地集群。
设置参数值
定义参数值的范围。创建一个meshgrid占参数的不同组合。
gridSize = 6;μ= linspace (100、150、gridSize);ν= linspace (0.5, 2, gridSize);[M, N] = meshgrid(μ,ν);
准备一个曲面图来可视化结果
声明一个变量来存储扫描的结果。使用南
预先配置,以避免策划一个初始表面。创建一个曲面图来可视化的结果为每个参数的组合。准备等设置标题、标签和限制。
Z =南(大小(N));c =冲浪(M, N, Z);包含(“\μ值”,“翻译”,“泰克斯”)ylabel (“\ν值”,“翻译”,“泰克斯”)zlabel (“意味着一段y”)视图(137,30)轴([100 150 0.5 - 2 0 500]);
设置一个参数扫描期间DataQueue获取结果
创建一个DataQueue
将中间结果从工人到客户机。使用afterEach
定义一个回调函数在客户端更新表面每一次一个工人发送当前的结果。
D = parallel.pool.DataQueue;D.afterEach (@ (x) updateSurface (c、x));
执行参数扫描和阴谋的结果
使用parfor
执行并行扫描参数。指导员工解决系统为每个meshgrid中的参数,并计算平均值。立即将每次迭代的结果发送回客户端当工人完成计算。
parfor2 = 1:元素个数(N) [t、y] = solveVdp (M (ii)、N (2));l = islocalmax (y (:, 2));发送(D, [ii的意思(diff (t (l)))));结束
开始平行池(parpool)使用“本地”概要文件…连接到平行池(工人数量:6)。
一个集群规模
如果你访问一个集群,你可以扩大你的计算。要做到这一点,删除前面parpool
概要文件,打开一个新的使用更大的集群。下面的代码显示了一个集群配置文件命名“MyClusterInTheCloud”
。运行此代码,您必须更换“MyClusterInTheCloud”
集群的配置文件的名称。调整员工的数量。这个例子显示了4个工人。提高整体的大小计算通过增加网格的大小。
gridSize = 25;删除(gcp (“nocreate”));parpool (“MyClusterInTheCloud”4);
开始平行池(parpool)使用“MyClusterInTheCloud”概要文件…连接到平行池(工人数量:4)。
如果你运行参数扫描代码后再设置集群配置文件,然后在集群中的工人MATLAB计算并将结果发送到客户端时可用。下面的动画显示了一个执行这个例子的集群。
辅助函数
创建一个helper函数来定义系统的方程,并应用解算器。
函数[t、y] = solveVdp(μ,ν)f = @ (~, y)[ν* y (2);μ* (1 y (1) ^ 2) * y (2) - y (1)];[t、y] = ode23s (f[0 * 20μ][2;0]);结束
声明一个函数DataQueue更新图的结果来自于工人。
函数updateSurface(年代,d) s.ZData (d (1)) = d (2);drawnow (“limitrate”);结束