Улучшайте линейную аналитическую производительность

В этом примере показано, как использовать 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');

Сконфигурируйте ПИ-контроллер, чтобы использовать переменные 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 функция конфигурирует модель, чтобы минимизировать компиляции, даже когда компиляция функций запущена в цикле. Модель компилирует с вызовами 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;

Запустите линейные аналитические функции в пакете с быстрым перезапуском

Можно далее улучшать производительность путем включения, быстро перезапускают для линейного анализа и выполнения пакетного 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;

Сравнение результатов

Сравните результаты линеаризации этих четырех методов. Диаграмма Боде ниже показов, что каждый метод возвращает те же результаты.

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"                      79.9               1    
    "Batch"                    20.97          3.8102    
    "Fast Restart Loop"        30.04          2.6598    
    "Fast Restart Batch"       15.71          5.0859    

Закройте модель Simulink.

bdclose(mdl)

Смотрите также

| | |