В этом примере показано, как использовать системный конечный файл RSim, чтобы запустить симуляции в области значений значений параметров. Пример использует Осциллятор Ван дер Поля и выполняет развертку параметра в области значений значений начального состояния, чтобы получить схему фазы нелинейной системы.
Можно настроить этот пример для собственного приложения путем изменения скрипта MATLAB®, используемого, чтобы создать этот пример. Щелкните по ссылке в левом верхнем угле этой страницы, чтобы отредактировать скрипт MATLAB®. Щелкните по ссылке в правом верхнем углу, чтобы запустить этот пример от MATLAB®. Запустите пример от перезаписываемого местоположения. Пример создает файлы, которые можно хотеть исследовать позже.
В данном примере установите поведение параметра Значения по умолчанию параметра конфигурации модели на Inlined. В примере вы создаете Simulink.Parameter объекты как настраиваемые параметры. Использовать RSim с набором поведения параметра По умолчанию к Tunable, и явным образом не объявляя настраиваемые параметры, смотрите Симуляции Пакета Запуска, Не Перекомпилировав Сгенерированный код.
Чтобы запустить несколько симуляций в окружении Simulink, рассмотрите использование быстрого акселератора вместо RSim. Для получения информации о быстром акселераторе смотрите то, Что Ускорение? (Simulink). Чтобы развернуть значения параметров, смотрите, Оптимизируют, Оценка и Значения Параметров блоков Развертки (Simulink).
Убедитесь, что текущая папка перезаписываема. Пример создает файлы.
[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 для модели. Во время процесса сборки структурная контрольная сумма вычисляется для модели и встраивается в сгенерированную исполняемую программу. Эта контрольная сумма используется, чтобы проверять, что набор параметра, переданный исполняемой программе, совместим с программой.
rtwbuild(mdlName);
### Starting build procedure for model: rtwdemo_rsim_vdp ### Successful completion of build procedure for model: rtwdemo_rsim_vdp
Получите rtP по умолчанию структура (набор параметра) для модели. modelChecksum поле в rtP структура является структурной контрольной суммой модели. Это должно совпадать с контрольной суммой, встроенной в исполняемую программу RSim. Если эти две контрольных суммы не соответствуют, исполняемая программа производит ошибку. rsimgetrtp генерирует rtP структура с записями для именованных настраиваемых переменных INIT_X1, INIT_X2, и MU.
rtp = rsimgetrtp(mdlName)
rtp =
struct with fields:
modelChecksum: [3.9650e+09 72732328 1.0543e+09 2.7709e+09]
parameters: [1x1 struct]
globalParameterInfo: [1x1 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-файл. Используйте время опция так, чтобы, если запуск зависает (например, потому что модель имеет сингулярность для того набора параметра), прервите выполнявшийся предел требуемого времени и перейдите к следующему запуску.
Например, эта команда (на Windows®) задает использование третьего набора параметра от rtP структура в prm.mat, пишут результаты в run3.mat, и выполнение аварийных прекращений работы, если запуск занимает больше времени, чем 3 600 секунд процессорного времени. При выполнении скрипт передает сообщения по каналу от 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 22.03 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');
