exponenta event banner

Быстрое моделирование по диапазону значений параметров

В этом примере показано, как использовать целевой файл системы RSim для выполнения моделирования по диапазону значений параметров. В примере используется осциллятор Ван дер Пол и выполняется сдвиг параметров в диапазоне значений начального состояния для получения фазовой диаграммы нелинейной системы.

Этот пример можно настроить для собственного приложения, изменив сценарий MATLAB ®, используемый для создания этого примера. Щелкните ссылку в левом верхнем углу этой страницы, чтобы изменить сценарий MATLAB ®. Щелкните ссылку в правом верхнем углу, чтобы запустить этот пример из MATLAB ®. Запустите пример из доступного для записи расположения. В этом примере создаются файлы, которые можно исследовать позже.

В этом примере задайте для параметра конфигурации модели Поведение параметра по умолчанию значение Inlined. В примере создается Simulink.Parameter объекты в качестве настраиваемых параметров. Использование RSim с параметрами по умолчанию, для которых установлено значение Tunableи без явного объявления перестраиваемых параметров см. раздел Выполнение пакетного моделирования без перекомпиляции сгенерированного кода.

Для выполнения нескольких симуляций в среде Simulink рекомендуется использовать ускоритель, а не RSim. Сведения о быстром ускорителе см. в разделе Что такое ускорение?. Сведения о значениях параметров сдвига см. в разделе Оптимизация, оценка и значения параметров блока сдвига.

Модель подготовки

Убедитесь, что текущая папка доступна для записи. В примере создаются файлы.

[stat, fa] = fileattrib(pwd);
if ~fa.UserWrite
    disp('This script must be run in a writable directory');
    return
end

Откройте модель. Затем откройте приложение Simulink Coder. Задайте для параметра конфигурации модели System target file значение 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 структура (набор параметров) для модели. modelChecksum в поле rtP структура - структурная контрольная сумма модели. Это должно соответствовать контрольной сумме, встроенной в исполняемую программу 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-файл. Используйте опцию тайм-аута, чтобы, если прогон зависает (например, потому что модель имеет сингулярность для этого набора параметров), прервать прогон после указанного ограничения времени и перейти к следующему прогону.

Например, эта команда (в 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 и сопоставление результатов

Сбор результатов моделирования из выходных 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');