Этот пример показывает, как использовать объекты Simulink.SimulationData.DatasetRef
и функцию parsim
к данным о потоковом вводе из MAT-файла версии 7.3 для параллельных симуляций. Считайте выполнение шагов обрисованным в общих чертах в этом примере, когда входные параметры для вашей симуляции будут слишком большими, чтобы загрузить в память. Например, можно использовать данные, регистрируемые для персистентного устройства хранения данных от одного набора параллельных симуляций, как введено для другого.
Этот пример использует parsim
, чтобы запустить несколько симуляций модели с каждой симуляцией с помощью уникальных входных данных. Модель основана на sldemo_suspn_3dof модели, измененной, чтобы использовать блоки Inport в качестве источника для входных параметров вместо блока Signal Editor. Модель моделирует ответ системы подвески к различным дорожным условиям. MAT-файл, используемый в этом примере, содержит несколько объектов Simulink.SimulationData.Dataset
, представляющих различные дорожные условия. Пример использует объекты DatasetRef
передать содержимое потоком целого объекта Dataset
, на который ссылаются, как вход симуляции.
Можно также передать данные потоком для отдельных сигналов в параллельные симуляции, запущенные с parsim
с помощью объектов matlab.io.datastore.SimulationDatastore
. Для получения дополнительной информации при создании объектов SimulationDatastore
, смотрите Потоковые Сигналы Человека Использовать Объекты SimulationDatastore.
Загрузите модель ex_sldemo_suspn_3dof_parsim_stream
. Модель получает входные данные через два блока Inport и каждый объект Dataset
, используемый, когда вход симуляции содержит два элемента: один для каждого Inport.
mdl = 'ex_sldemo_suspn_3dof_parsim_stream';
open_system(mdl)
Можно использовать функцию Simulink.SimulationData.DatasetRef.getDatasetVariableNames
, чтобы оценить содержимое MAT-файла, содержащего входные данные, не загружая данные в память. Функция возвращает массив ячеек, который содержит элементы для имени каждой переменной Simulink.SimulationData.Dataset
, которую содержит файл. Используйте функцию, чтобы получить доступ к именам переменных и определить количество тестов в файле.
varNames = Simulink.SimulationData.DatasetRef.getDatasetVariableNames('suspn_3dof_test_cases.mat');
numTestCases = numel(varNames);
Можно передать данные о тесте потоком в модель с помощью объектов Simulink.SimulationData.DatsetRef
. Ссылки на объект DatasetRef
переменная в файле раньше создавала его и загружает переменные данные инкрементно. Создайте объект DatasetRef
для каждого объекта Simulink.SimulationData.Dataset
в файле тестов.
for idx1 = 1:numTestCases inputData(idx1) = Simulink.SimulationData.DatasetRef('suspn_3dof_test_cases.mat',... varNames{idx1}); end
Чтобы использовать набор входных параметров теста, как введено для набора параллельных симуляций, создайте массив объектов Simulink.SimulationInput
, что можно передать функции parsim
. Используйте функцию setExternalInput
, чтобы задать объект Simulink.SimulationData.DatasetRef
, соответствующий тесту как данные к потоку как вход симуляции.
in(1:numTestCases) = Simulink.SimulationInput(mdl); for idx2 = 1:numTestCases in(idx2) = setExternalInput(in(idx2),inputData(idx2)); end
Используйте функцию parsim
, чтобы запустить симуляцию для каждого теста. Когда у вас есть Parallel Computing Toolbox™, симуляции выполнений функции parsim
параллельно. Без Parallel Computing Toolbox функция parsim
запускает симуляции в сериале.
Функция parsim
создает пул рабочего на основе настройки Parallel Computing Toolbox. По умолчанию parsim
использует локальный пул. Если вы используете удаленных рабочих, можно использовать пару "имя-значение" AttachedFiles
, чтобы отправить MAT-файл, содержащий входные данные теста каждому рабочему. Когда вы задаете пару "имя-значение" AttachedFiles
, parsim
отправляет копию файла каждому рабочему, который может не торопиться для больших файлов. Для потоковой передачи входных данных от большого файла локальные рабочие могут быть быстрее, потому что у рабочих есть доступ к файлу, не создавая и отправляя копии. Когда вы используете удаленных рабочих, рассматриваете хранение MAT-файла в месте, к которому все удаленные рабочие могут получить доступ и создание, DatasetRef
возражает что ссылка что копия файла.
out = parsim(in);
[22-Feb-2019 02:10:02] Checking for availability of parallel pool... Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 12). [22-Feb-2019 02:10:37] Starting Simulink on parallel workers... [22-Feb-2019 02:11:26] Configuring simulation cache folder on parallel workers... [22-Feb-2019 02:11:27] Loading model on parallel workers... [22-Feb-2019 02:11:41] Running simulations... [22-Feb-2019 02:11:57] Completed 1 of 20 simulation runs [22-Feb-2019 02:11:58] Completed 2 of 20 simulation runs [22-Feb-2019 02:11:58] Completed 3 of 20 simulation runs [22-Feb-2019 02:11:59] Completed 4 of 20 simulation runs [22-Feb-2019 02:11:59] Completed 5 of 20 simulation runs [22-Feb-2019 02:11:59] Completed 6 of 20 simulation runs [22-Feb-2019 02:11:59] Completed 7 of 20 simulation runs [22-Feb-2019 02:11:59] Completed 8 of 20 simulation runs [22-Feb-2019 02:11:59] Completed 9 of 20 simulation runs [22-Feb-2019 02:11:59] Completed 10 of 20 simulation runs [22-Feb-2019 02:11:59] Completed 11 of 20 simulation runs [22-Feb-2019 02:11:59] Completed 12 of 20 simulation runs [22-Feb-2019 02:12:04] Completed 13 of 20 simulation runs [22-Feb-2019 02:12:04] Completed 14 of 20 simulation runs [22-Feb-2019 02:12:05] Completed 15 of 20 simulation runs [22-Feb-2019 02:12:05] Completed 16 of 20 simulation runs [22-Feb-2019 02:12:05] Completed 17 of 20 simulation runs [22-Feb-2019 02:12:05] Completed 18 of 20 simulation runs [22-Feb-2019 02:12:05] Completed 19 of 20 simulation runs [22-Feb-2019 02:12:05] Completed 20 of 20 simulation runs [22-Feb-2019 02:12:05] Cleaning up parallel workers...
Можно получить доступ к результатам симуляции программно, когда симуляции заканчиваются. Создайте график, показывающий вертикальное смещение для автомобиля для всех дорожных тестов профиля.
if isempty(out(1).ErrorMessage) legend_labels = cell(1,numTestCases); for i = 1:numTestCases if isempty(out(i).ErrorMessage) simOut = out(i); ts = simOut.logsout.get('vertical_disp').Values; ts.plot; legend_labels{i} = ['Run ' num2str(i)]; end hold all end title('Response of a 3-DoF Suspension Model') xlabel('Time (s)'); ylabel('Vehicle vertical displacement (m)'); legend(legend_labels,'Location','NorthEastOutside'); end
Вы можете также результаты симуляции представления parsim
с помощью Simulation Manager. Чтобы просмотреть результаты в Simulation Manager, используйте пару "имя-значение" ShowSimulationManager
для parsim
. С Simulation Manager можно контролировать прогресс выполнений, данных моделирования представления, и показать результаты parsim
в Инспекторе Данных моделирования.
Когда вы закончили идти параллельно симуляции, можно закрыть пул рабочего.
delete(gcp('nocreate'));
Загрузите Большие данные для симуляций