Улучшение эффективности линейного анализа

В этом примере показано, как использовать fastRestartForLinearAnalysis функция для ускорения нескольких вызовов функций компиляции в программном обеспечении Simulink ® Control Design™, таком как findop и linearize.

Запуск команд линейного анализа в цикле

В этом примере вы обрезаете и линеаризируете модель регулирования скорости вращения двигателя с обратной связью. Вы варьируете параметры управления ПИ и наблюдаете, как изменяется поведение с обратной связью в установившемся состоянии. Начиная с 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

The 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;

Запуск функций линейного анализа в пакете с fastRestartForLinearAnalysis

Эффективность может быть дополнительно улучшена путем включения перезапуска для линейного анализа и выполнения пакетной linearize и findop функций. В этом случае модель компилируется один раз с вызовами в operspec, findop, и linearize.

Запуск и запись времени выполнения с быстрым перезапуском для линейного анализа on.

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"                     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)

См. также

| | |