В этом примере показано, как использовать системный целевой файл RSim для выполнения симуляций в области значений значений параметров. Пример использует осциллятор Ван дер Поля и выполняет свип параметра в области значений начального состояния, чтобы получить фазовую схему нелинейной системы.
Можно настроить этот пример для собственного приложения, изменив скрипт MATLAB ®, используемый для создания этого примера. Щелкните ссылку в верхнем левом углу этой страницы, чтобы отредактировать скрипт MATLAB ®. Щелкните ссылку в правом верхнем углу, чтобы запустить этот пример из MATLAB ®. Запустите пример из места с возможностью записи. В примере создаются файлы, которые можно исследовать позже.
В данном примере установите параметр конфигурации модели Поведение параметра по умолчанию на Inlined
. В примере вы создаете Simulink.Parameter
объекты как настраиваемые параметры. Чтобы использовать RSim с поведением параметра Default, заданным как Tunable
, и без явного объявления настраиваемых параметров, см. Запуск пакетных симуляций без перекомпиляции сгенерированного кода.
Чтобы запустить несколько симуляций в окружение Simulink, рассмотрите использование быстрого ускорителя вместо RSim. Для получения информации о быстром ускорителе смотрите Что такое ускорение?. Чтобы протянуть значения параметров, смотрите Оптимизируйте, Оцените и Протяните Значения Параметров блоков.
Убедитесь, что текущая папка доступна для записи. Пример создает файлы.
[stat, fa] = fileattrib(pwd); if ~fa.UserWrite disp('This script must be run in a writable directory'); return end
Откройте модель. Затем откройте приложение Simulink Coder. Установите параметр конфигурации модели Системный целевой файл на rsim.tlc
.
Для получения дополнительной информации об этом графически и настройке других опций, связанных с целью RSim, смотрите здесь.
mdlName = 'rtwdemo_rsim_vdp'; open_system(mdlName); cs = getActiveConfigSet(mdlName); cs.switchTarget('rsim.tlc',[]);
Задайте переменные INIT_X1
(начальное условие для состояния x1), INIT_X2
(начальное условие состояния x2
), и MU
(значение усиления) как настраиваемое. Чтобы создать настраиваемые параметры, преобразуйте переменные в Simulink.Parameter
и сконфигурируйте объекты так, чтобы они использовали класс памяти, отличный от Auto
. В этом примере вы исследуете, как траектории состояний развиваются из различных начальных значений для состояний x1
и x2
в модели.
INIT_X1 = Simulink.Parameter(INIT_X1); INIT_X1.StorageClass = 'Model default'; INIT_X2 = Simulink.Parameter(INIT_X2); INIT_X2.StorageClass = 'Model default'; MU = Simulink.Parameter(MU); MU.StorageClass = 'Model default';
Задайте имена файлов, которые будут созданы.
prmFileName = [mdlName, '_prm_sets.mat']; logFileName = [mdlName, '_run_scr.log']; batFileName = [mdlName, '_run_scr']; exeFileName = mdlName; if ispc exeFileName = [exeFileName, '.exe']; batFileName = [batFileName, '.bat']; end aggDataFile = [mdlName, '_results']; startTime = cputime;
Создайте исполняемую программу RSim для модели. В процессе сборки для модели вычисляется структурная контрольная сумма и встраивается в сгенерированную исполняемую программу. Эта контрольная сумма используется, чтобы проверить, что набор параметров, переданный исполняемой программе, совместим с программой.
slbuild(mdlName);
### Starting build procedure for: rtwdemo_rsim_vdp ### Successful completion of build procedure for: rtwdemo_rsim_vdp Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================= rtwdemo_rsim_vdp Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 5.9294s
Получите значение по умолчанию rtP
структура (набор параметров) для модели. The modelChecksum
поле в rtP
structure - структурная контрольная сумма модели. Это должно совпадать с контрольной суммой, встроенной в исполняемую программу RSim. Если две контрольные суммы не совпадают, исполняемая программа выдает ошибку. rsimgetrtp
генерирует rtP
структура с записями для именованных настраиваемых переменных INIT_X1
, INIT_X2
, и MU
.
rtp = rsimgetrtp(mdlName)
rtp = struct with fields: modelChecksum: [1x4 double] parameters: [1x1 struct] globalParameterInfo: [1x1 struct] collapsedBaseWorkspaceVariables: [] nonTunableVariables: [1x0 struct]
Использование rtp
создайте массив структур с различными значениями для настраиваемых переменных в модели. Как упоминалось ранее, в этом примере вы хотите увидеть, как изменяются траектории состояний для различных начальных значений для состояний x1
и x2
в модели. Для этого сгенерируйте различные наборы параметров с различными значениями для INIT_X1
и INIT_X2
и оставьте настраиваемую переменную MU
установите значение по умолчанию.
INIT_X1_vals = -5:1:5; INIT_X2_vals = -5:1:5; MU_vals = 1; nPrmSets = length(INIT_X1_vals)*length(INIT_X2_vals)*length(MU_vals)
nPrmSets = 121
Этот пример имеет nPrmSets
наборы параметров. Вам нужно запустить столько симуляций. Инициализация aggData
, который является массивом структур, который содержит набор параметров и соответствующие результаты.
aggData = struct('tout', [], 'yout', [], ... 'prms', struct('INIT_X1',[],'INIT_X2',[], 'MU', [])) aggData = repmat(aggData, nPrmSets, 1);
aggData = struct with fields: tout: [] yout: [] prms: [1x1 struct]
Область служебной функции rsimsetrtpparam
создает rtP
структура путем добавления наборов параметров по одному с различными значениями параметров.
idx = 1; for iX1 = INIT_X1_vals for iX2 = INIT_X2_vals for iMU = MU_vals rtp = rsimsetrtpparam(rtp,idx,'INIT_X1',iX1,'INIT_X2',iX2,'MU',iMU); aggData(idx).prms.INIT_X1 = iX1; aggData(idx).prms.INIT_X2 = iX2; aggData(idx).prms.MU = iMU; idx = idx + 1; end end end
Сохраните rtP
массив структур с наборами параметров в MAT-файл.
save(prmFileName,'rtp');
Создайте файл пакетного скрипта, чтобы запустить исполняемую программу RSim над наборами параметров. Каждый запуск считывает указанный набор параметров из параметра MAT-файла и записывает результаты в указанный выходной MAT-файл. Используйте опцию timout, чтобы, если запуск висит (для примера, потому что модель имеет особенность для этого набора параметров), прервать запуск через указанное время предела и перейти к следующему запуску.
Например, эта команда (в Windows ®) задает использование третьего набора параметров из rtP
структура в prm.mat
, записывает результаты в run3.mat
и прекращает выполнение, если запуск занимает более 3600 секунд времени центрального процессора. Во время выполнения скрипт отправляет сообщения от model.exe
на run.log
, который можно использовать для отладки проблем.
model.exe -p prm.mat@3 -o run3.mat -L 3600 2>&1>> run.log
fid = fopen(batFileName, 'w'); idx = 1; for iX1 = INIT_X1_vals for iX2 = INIT_X2_vals for iMU = MU_vals outMatFile = [mdlName, '_run',num2str(idx),'.mat']; cmd = [exeFileName, ... ' -p ', prmFileName, '@', int2str(idx), ... ' -o ', outMatFile, ... ' -L 3600']; if ispc cmd = [cmd, ' 2>&1>> ', logFileName]; else % (unix) cmd = ['.' filesep cmd, ' 1> ', logFileName, ' 2>&1']; end fprintf(fid, ['echo "', cmd, '"\n']); fprintf(fid, [cmd, '\n']); idx = idx + 1; end end end if isunix, system(['touch ', logFileName]); system(['chmod +x ', batFileName]); end fclose(fid);
Создание файла пакета/скрипта для выполнения симуляций позволяет вам один раз вызвать системную команду, чтобы запустить симуляции (или даже запустить пакетный скрипт вне MATLAB ®), вместо вызова системной команды в цикле для каждой симуляции. Это повышает эффективность, поскольку системная команда имеет значительные накладные расходы.
Запустите файл пакета/скрипта, который запускает исполняемую программу RSim один раз для каждого набора параметров и каждый раз сохраняет результаты в другом MAT-файле. Можно запустить пакетный файл из вне MATLAB ®.
[stat, res] = system(['.' filesep batFileName]); if stat ~= 0 error(['Error running batch file ''', batFileName, ''' :', res]); end
Этот пример журналов запуск симуляции результатов в одном пакетном файле, когда он запускает пакетный файл для последовательного запуска n
симуляции по n
наборы параметров. Можно изменить скрипт, чтобы сгенерировать несколько пакетных файлов и запустить их параллельно путем распределения их между несколькими компьютерами. Кроме того, можно запустить пакетные файлы, не запуская MATLAB ®.
Соберите результаты симуляции из выхода MAT-файлов в структуру aggData
. Если выходной MAT-файл, соответствующий конкретному запуску, не найден, установите результаты, соответствующие этому запуску, равными NaN
(не число). Эта ситуация возникает, если запуск симуляции с определенным набором параметров встречается с особенностями в модели.
idx = 1; for iX1 = INIT_X1_vals for iX2 = INIT_X2_vals for iMU = MU_vals outMatFile = [mdlName, '_run',num2str(idx),'.mat']; if exist(outMatFile,'file') load(outMatFile); aggData(idx).tout = rt_tout; aggData(idx).yout = rt_yout; else aggData(idx).tout = nan; aggData(idx).yout = nan; end idx = idx + 1; end end end
Сохраните aggData
структура в MAT-файл результатов. На данной точке можно удалить другие MAT-файлы, как aggData
структура данных содержит агрегирование входа (наборов параметров) и выхода данных (результатов симуляции).
save(aggDataFile,'aggData'); disp(['Took ', num2str(cputime-startTime), ... ' seconds to generate results from ', ... num2str(nPrmSets), ' simulation runs (Steps 2 to 7).']);
Took 23.95 seconds to generate results from 121 simulation runs (Steps 2 to 7).
Постройте график фазовой схемы (X2
от X1
) с различными начальными значениями для X1
и X2
. Схема показывает, что, независимо от начального условия, осциллятор Ван дер Поля сходится к своему режиму естественного осциллятора.
colors = {'b','g','r','c','m','y','k'}; nColors = length(colors); for idx = 1:nPrmSets col = colors{idx - nColors*floor(idx/nColors) + 1}; plot(aggData(idx).prms.INIT_X1, aggData(idx).prms.INIT_X2, [col,'x'], ... aggData(idx).yout(:,1), aggData(idx).yout(:,2),col); hold on end grid on xlabel('X1'); ylabel('X2'); axis('square'); title('Phase diagram for Van der Pol equation');