exponenta event banner

Повышение производительности линейного анализа

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

Выполнение функций линейного анализа в пакетном режиме с помощью startRestartForLinearAnalysis

Производительность можно дополнительно повысить, включив перезапуск 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)

См. также

| | |