Построение графика во время подбора параметра parfor

В этом примере показано, как выполнить развертку параметра параллельно, и график прогрессируют во время параллельных расчетов. Можно использовать DataQueue контролировать результаты во время расчетов на параллельном пуле. Можно также использовать DataQueue с функциями языка параллельного программирования, такими как parfor, parfeval и spmd.

Пример показывает, как выполнить развертку параметра в классической системе, Осцилляторе Ван дер Поля. Эта система может быть описана в виде набора ОДУ, зависящих от двух параметров Осциллятора Ван дер Поля, μ и ν:

x˙=νy

y˙=μ(1-x2)y-x

Можно выполнить параллельную развертку параметра по параметрам μ и ν использование parfor цикл, чтобы узнать средний период y при варьировании их. Следующая анимация показывает выполнение этого примера в локальном кластере.

Настройте значения развертки параметра

Задайте область значений значений для параметров, которые будут исследоваться. Создайте meshgrid с учетом различных комбинаций параметров.

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, чтобы выбрать результаты во время развертки параметра

Создайте DataQueue отправить промежуточное звено следует из рабочих клиенту. Используйте afterEach функция, чтобы задать коллбэк в клиенте, который обновляет поверхность каждый раз рабочий, отправляет текущий результат.

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

Выполните развертку параметра и постройте результаты

Используйте parfor выполнять параллельную развертку параметра. Дайте рабочим команду решать систему для каждой комбинации параметров в meshgrid и вычислять средний период. Сразу передайте результат обратно каждой итерации клиенту, когда рабочий закончит расчеты.

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

Смотрите также