parforВ этом примере показано, как выполнять сдвиг параметров параллельно и выполнять график хода выполнения параллельных вычислений. Вы можете использовать DataQueue для мониторинга результатов во время вычислений в параллельном пуле. Также можно использовать DataQueue с параллельными языковыми функциями, такими как parfor, parfeval и spmd.
В примере показано, как выполнить сдвиг параметров в классической системе, осцилляторе Ван дер Пол. Эта система может быть выражена в виде набора ОДУ, зависящих от двух параметров осциллятора Ван-дер-Поля,
y-x
Можно выполнить параллельное протягивание параметра над параметрами parfor цикл, чтобы выяснить средний период при их изменении. Следующая анимация показывает выполнение этого примера в локальном кластере.

Определите диапазон значений для исследуемых параметров. Создайте сетку для учета различных комбинаций параметров.
gridSize = 6; mu = linspace(100, 150, gridSize); nu = linspace(0.5, 2, gridSize); [M,N] = meshgrid(mu,nu);
Объявите переменную для сохранения результатов сдвига. Использовать nan для предварительного выделения во избежание вывода на печать исходной поверхности. Создайте график поверхности для визуализации результатов сдвига для каждой комбинации параметров. Подготовьте такие параметры, как заголовок, метки и пределы.
Z = nan(size(N)); c = surf(M, N, Z); xlabel('\mu Values','Interpreter','Tex') ylabel('\nu Values','Interpreter','Tex') zlabel('Mean Period of y') view(137, 30) axis([100 150 0.5 2 0 500]);

Создать DataQueue для отправки промежуточных результатов от работников клиенту. Используйте afterEach для определения обратного вызова в клиенте, который обновляет поверхность каждый раз, когда работник отправляет текущий результат.
D = parallel.pool.DataQueue; D.afterEach(@(x) updateSurface(c, x));
Использовать parfor для выполнения параллельного сдвига параметров. Проинструктируйте работников решить систему для каждой комбинации параметров в сетке и вычислить средний период. Сразу же отправьте результат каждой итерации клиенту, когда работник закончит вычисления.
parfor ii = 1:numel(N) [t, y] = solveVdp(M(ii), N(ii)); l = islocalmax(y(:, 2)); send(D, [ii mean(diff(t(l)))]); end
Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 6).
При наличии доступа к кластеру можно увеличить масштаб вычислений. Для этого удалите предыдущий parpoolи откройте новый профиль для большего кластера. Приведенный ниже код показывает профиль кластера с именем 'MyClusterInTheCloud'. Чтобы выполнить этот код самостоятельно, необходимо заменить 'MyClusterInTheCloud' с именем профиля кластера. Скорректируйте количество работников. В примере показано 4 работника. Увеличьте размер всего расчета, увеличив размер сетки.
gridSize = 25; delete(gcp('nocreate')); parpool('MyClusterInTheCloud',4);
Starting parallel pool (parpool) using the 'MyClusterInTheCloud' profile ... Connected to the parallel pool (number of workers: 4).
При повторном запуске кода сдвига параметров после установки профиля кластера работники в кластере вычисляют и отправляют результаты клиенту MATLAB, когда они становятся доступными. Следующая анимация показывает выполнение этого примера в кластере.

Создайте вспомогательную функцию для определения системы уравнений и примените к ней решатель.
function [t, y] = solveVdp(mu, nu) f = @(~,y) [nu*y(2); mu*(1-y(1)^2)*y(2)-y(1)]; [t,y] = ode23s(f,[0 20*mu],[2; 0]); end
Объявите функцию для DataQueue, чтобы обновить график с результатами, полученными от работников.
function updateSurface(s, d) s.ZData(d(1)) = d(2); drawnow('limitrate'); end