Несколько советов рабочего процесса моделирований

Цель этой демонстрации состоит в том, чтобы обеспечить полезные советы для выполнения нескольких моделирований с помощью параллельных инструментов моделирования. Этот пример будет работать, даже если Параллельные вычисления, Toolbox™ не доступен, но моделирования, запустятся в сериале. Мы будем использовать модель sldemo_suspn_3dof для этого примера.

mdl = 'sldemo_suspn_3dof';
isModelOpen = bdIsLoaded(mdl);
open_system(mdl);

Инициализация массива Simulink. Объекты SimulationInput

Обычно вы создадите массив Simulink. SimulationInput возражает в порядке запустить несколько моделирований. Существует несколько способов инициализировать массив прежде, чем заполнить его с данными.

numSims = 5;
Cf_sweep = Cf*linspace(.05,.95, numSims);

Метод 1: Инициализируйте массив перед циклом

in(numSims) = Simulink.SimulationInput;
for idx = 1:numSims
    % Need to populate the model name since we get any empty array by default
    in(idx).ModelName = 'sldemo_suspn_3dof';
    in(idx) = in(idx).setVariable('Cf', Cf_sweep(idx));
end

Метод 2: Инициализируйте массив в цикле

Обратите внимание на то, что idx переменной цикла начинает с самого большого значения так, чтобы целый массив был предварительно выделен.

for idx = numSims:-1:1
    % Since we are indexing from 5 to 1, the first iteration will
    % initialize the array.
    in(idx) = Simulink.SimulationInput('sldemo_suspn_3dof');
    in(idx) = in(idx).setVariable('Cf', Cf_sweep(idx));
end

Установка параметров модели и блока

setModelParameter и методы setBlockParameter используют тот же синтаксис пары значения параметров, который использует API set_param. Это означает, что большинство значений, в которых вы передаете этим методам, должно быть символьными массивами, не их литеральным значением.

for idx = numSims:-1:1
    in(idx) = Simulink.SimulationInput('sldemo_suspn_3dof');

    % Incorrect
    in(idx) = in(idx).setModelParameter('StartTime', 5);

    % Correct
    in(idx) = in(idx).setModelParameter('StartTime', '3');
end

Установка переменных

Метод setVariable ожидает, что вы передадите литеральное значение, которое вы хотите присвоить переменной. Идея состоит в том, что это тесно отражает синтаксис assignin.

for idx = numSims:-1:1
    in(idx) = Simulink.SimulationInput('sldemo_suspn_3dof');

    % Incorrect, Cf is expected to be a double, not a character array
    in(idx) = in(idx).setVariable('Cf', '2500');

    % Correct, Cf is a scalar double
    in(idx) = in(idx).setVariable('Cf', 2500);
end

Диагностирование ошибок периода выполнения

Примите, что вы случайно настроили массив Simulink. SimulationInput возражает с неправильным значением.

Mb_sweep = linspace(0, 1500, numSims);
for idx = numSims:-1:1
    in(idx) = Simulink.SimulationInput('sldemo_suspn_3dof');

    % Accidentally set the Mass to 0 on the first iteration
    in(idx) = in(idx).setVariable('Mb', Mb_sweep(idx));

    % Shorten the stop time
    in(idx) = in(idx).setModelParameter('StopTime','1');
end

Моделирование их вызовет ошибку периода выполнения

out = sim(in);
[28-Jul-2018 13:33:59] Running simulations...
[28-Jul-2018 13:34:01] Completed 1 of 5 simulation runs. Run 1 has errors.
[28-Jul-2018 13:34:02] Completed 2 of 5 simulation runs
[28-Jul-2018 13:34:03] Completed 3 of 5 simulation runs
[28-Jul-2018 13:34:03] Completed 4 of 5 simulation runs
[28-Jul-2018 13:34:04] Completed 5 of 5 simulation runs
Warning: Simulation(s) with indices listed below completed with errors. Please
inspect the corresponding SimulationOutput to get more details about the error:
[1] 

К счастью, можно осмотреть Simulink. Объект SimulationOutput видеть любые сообщения об ошибке, которые прибывают из моделирования.

out(1).ErrorMessage
ans =

    'Derivative of state '1' in block 'sldemo_suspn_3dof/Body Dynamics/Vertical (Z) dynamics/Zdot' at time 0.0 is not finite. The simulation will be stopped. There may be a singularity in the solution.  If not, try reducing the step size (either by reducing the fixed step size or by tightening the error tolerances)'

Это работает, чтобы отладить проблемы о параллельных рабочих также.

for idx = numSims:-1:1
    in(idx) = Simulink.SimulationInput('sldemo_suspn_3dof');

    % Accidentally set the Mass to 0 on the first iteration
    in(idx) = in(idx).setVariable('Mb', Mb_sweep(idx));

    % Shorten the stop time
    in(idx) = in(idx).setModelParameter('StopTime','1');
end

out = parsim(in);
[28-Jul-2018 13:34:04] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'local' profile ...
connected to 12 workers.
[28-Jul-2018 13:34:51] Loading Simulink on parallel workers...
[28-Jul-2018 13:35:29] Configuring simulation cache folder on parallel workers...
[28-Jul-2018 13:35:30] Loading model on parallel workers...
[28-Jul-2018 13:35:41] Running simulations...
[28-Jul-2018 13:35:53] Completed 1 of 5 simulation runs. Run 1 has errors.
[28-Jul-2018 13:35:53] Completed 2 of 5 simulation runs
[28-Jul-2018 13:35:53] Completed 3 of 5 simulation runs
[28-Jul-2018 13:35:53] Completed 4 of 5 simulation runs
[28-Jul-2018 13:35:53] Completed 5 of 5 simulation runs
Warning: Simulation(s) with indices listed below completed with errors. Please
inspect the corresponding SimulationOutput to get more details about the error:
[1] 
[28-Jul-2018 13:35:53] Cleaning up parallel workers...

Осмотр Simulink. SimulationOutput показывает неличную производную ошибку.

out(1).ErrorMessage
ans =

    'Derivative of state '1' in block 'sldemo_suspn_3dof/Body Dynamics/Vertical (Z) dynamics/Zdot' at time 0.0 is not finite. The simulation will be stopped. There may be a singularity in the solution.  If not, try reducing the step size (either by reducing the fixed step size or by tightening the error tolerances)'

Метод applyToModel сконфигурирует вашу модель с настройками на SimulationInput, таким образом, можно будет отладить проблему локально.

in(1).applyToModel;

Заметьте, что значение переменного Mb в базовом рабочем пространстве изменяется на 0, чтобы отразить значение, которое использовалось в моделировании, соответствующем первому объекту SimulationInput в in.

Закройте работников MATLAB

Наконец, закройте параллельный пул и модель, если они не были ранее открыты.

if(~isModelOpen)
    close_system(mdl, 0);
end
delete(gcp('nocreate'));
Parallel pool using the 'local' profile is shutting down.
Была ли эта тема полезной?