В этом примере показано, как использовать fastRestartForLinearAnalysis функция для ускорения нескольких вызовов для компиляции функций в программном обеспечении Simulink ® Control Design™, таких какfindop и linearize.
В этом примере выполняется обрезка и линеаризация модели управления частотой вращения двигателя с замкнутым контуром. Вы изменяете параметры управления PI и наблюдаете, как поведение замкнутого цикла изменяется в установившемся состоянии. С тех пор linearize и findop вызываются в цикле, модель компилирует 2 * N + 1 раз, включая первый вызов operspec.
Откройте модель управления частотой вращения двигателя и получите точки линейного анализа из модели.
mdl = 'scdspeedctrl'; open_system(mdl) io = getlinio(mdl); fopt = findopOptions('DisplayReport','off');

Настройка контроллера PI для использования базовых переменных рабочего пространства kp и ki.
blk = [mdl,'/PID Controller']; set_param(blk,'P','kp'); set_param(blk,'I','ki');
Создайте сетку значений параметров для изменения.
vp = 0.0005:0.0005:0.003; vi = 0.0025:0.0005:0.005; [KP,KI] = ndgrid(vp,vi); N = numel(KP); sz = size(KP);
Инициализируйте базовые переменные рабочей области.
kp = KP(1); ki = KI(1);
Выполните цикл и запишите время выполнения.
t = cputime; ops = operspec(mdl); for i = N:-1:1 kp = KP(i); ki = KI(i); % Trim the model. op = findop(mdl,ops,fopt); [j,k] = ind2sub(sz,i); % Linearize the model. sysLoop(:,:,j,k) = linearize(mdl,io,op); end
Рассчитайте прошедшее время.
timeElapsedLoop = cputime - t;
Вместо того, чтобы закольцовывать параметры, findop и linearize может принять структуру изменения пакетного параметра непосредственно, чтобы уменьшить количество операций компиляции модели. В этом случае модель трижды компилируется с вызовами operspec, findop, и linearize.
Время выполнения и записи.
t = cputime; ops = operspec(mdl);
Создайте структуру параметров партии.
params(1).Name = 'kp'; params(1).Value = KP ; params(2).Name = 'ki'; params(2).Value = KI ;
Обрезать модель по набору параметров.
op = findop(mdl,ops,params,fopt);
Линеаризация модели по набору параметров и рабочих точек.
sysBatch = linearize(mdl,io,op,params);
Рассчитайте прошедшее время.
timeElapsedBatch = cputime - t;
fastRestartForLinearAnalysis fastRestartForLinearAnalysis функция настраивает модель для минимизации компиляций даже при выполнении функций компиляции внутри цикла. Модель компилируется с вызовами operspec, findop, и linearize в цикле.
Запустите цикл и запишите время выполнения с включенным быстрым перезапуском для линейного анализа.
t = cputime;
Включить быстрый перезапуск для линейного анализа. Предоставление точек линейного анализа для минимизации компиляций между вызовами findop и linearize.
fastRestartForLinearAnalysis(mdl,'on','AnalysisPoints',io);
Обрезка и линеаризация модели в цикле.
ops = operspec(mdl); for i = N:-1:1 kp = KP(i); ki = KI(i); % Trim the model. op = findop(mdl,ops,fopt); [j,k] = ind2sub(sz,i); % Linearize the model. sysFastRestartLoop(:,:,j,k) = linearize(mdl,io,op); end
Поворот быстрого перезапуска для линейного анализа, который отменяет компиляцию модели.
fastRestartForLinearAnalysis(mdl,'off');
Рассчитайте прошедшее время.
timeElapsedFastRestartLoop = cputime - t;
Производительность можно дополнительно повысить, включив перезапуск ast для линейного анализа и выполнив пакет linearize и findop функции. В этом случае модель компилируется один раз с вызовами operspec, findop, и linearize.
Запуск и запись времени выполнения с быстрым перезапуском для линейного анализа.
t = cputime;
Включить быстрый перезапуск для линейного анализа. Предоставление точек линейного анализа для минимизации компиляций между вызовами findop и linearize.
fastRestartForLinearAnalysis(mdl,'on','AnalysisPoints',io)
Создайте структуру параметров партии.
params(1).Name = 'kp'; params(1).Value = KP ; params(2).Name = 'ki'; params(2).Value = KI ;
Обрезать модель по набору параметров.
ops = operspec(mdl); op = findop(mdl,ops,params,fopt);
Линеаризация модели по набору параметров и рабочих точек.
sysFastRestartBatch = linearize(mdl,io,op,params);
Отключите быстрый перезапуск для линейного анализа, который отменяет компиляцию модели.
fastRestartForLinearAnalysis(mdl,'off');
Рассчитайте прошедшее время.
timeElapsedFastRestartBatch = cputime - t;
Сравните результаты линеаризации четырех методов. График bode ниже показывает, что каждый метод возвращает одни и те же результаты.
compareIdx = 1:N; bode(... sysLoop(:,:,compareIdx), ... sysBatch(:,:,compareIdx), ... sysFastRestartLoop(:,:,compareIdx), ... sysFastRestartBatch(:,:,compareIdx)); legend(... 'Loop Linearization', ... 'Batch Linearization', ... 'Loop Linearization with Fast Restart', ... 'Batch Linearization with Fast Restart')

Скомпилировать истекшее время и коэффициент ускорения для каждого метода в таблице. Вы можете получить значительный прирост производительности, используя пакетную обрезку и линеаризацию, а также fastRestartForLinearAnalysis.
Method = ["Loop","Batch","Fast Restart Loop","Fast Restart Batch"]'; TimeElapsed = [timeElapsedLoop,timeElapsedBatch,timeElapsedFastRestartLoop,timeElapsedFastRestartBatch]'; SpeedUpFactor = TimeElapsed(1)./TimeElapsed; TimeElapsedTable = table(Method,TimeElapsed,SpeedUpFactor)
TimeElapsedTable =
4x3 table
Method TimeElapsed SpeedUpFactor
____________________ ___________ _____________
"Loop" 66.55 1
"Batch" 16.07 4.1413
"Fast Restart Loop" 19.23 3.4607
"Fast Restart Batch" 13.9 4.7878
Закройте модель Simulink.
bdclose(mdl)