Линеаризация с использованием различных методов преобразования скорости

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

Пример задачи

В модели Simulink scdmrate.mdl Существует три различных частоты дискретизации, заданных в пяти блоках. Эти блоки

  • sysC - непрерывный линейный блок,

  • Integrator - непрерывный интегратор,

  • sysTs1 - блок, который имеет шаг расчета 0,01 секунды,

  • sysTs2 - блок, который имеет шаг расчета 0,025 секунд, и

  • Zero-Order Hold - блок, который дискретизирует входящий сигнал в 0,01 секунде.

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

scdmrate

В этом примере вы линеаризируете модель между выходом блока sysTs1 и блок Zero-Order Hold. Кроме того, вы добавляете открытие цикла в блоке Zero-Order Hold для извлечения модели объекта управления для системы.

model = 'scdmrate';
io(1) = linio('scdmrate/sysTs1',1,'input');
io(2) = linio('scdmrate/Zero-Order Hold',1,'openoutput');

Использование этих точек линеаризации эффективно приводит к линеаризации модели scdmrate_ol.

scdmrate_ol

При линеаризации модели, которая содержит как непрерывные, так и дискретные сигналы, программное обеспечение сначала преобразует непрерывные сигналы в дискретные сигналы, используя метод преобразования скорости. Метод преобразования ставок по умолчанию является удержанием нулевого порядка. Чтобы просмотреть или изменить метод преобразования скорости, используйте RateConversionMethod свойство в функции linearizeOptions. Следующая команда показывает, что RateConversionMethod установлено значение по умолчанию, zoh:

opt = linearizeOptions
 
Options for LINEARIZE:
    LinearizationAlgorithm         : blockbyblock
    SampleTime (-1 Auto Detect)    : -1
    UseFullBlockNameLabels (on/off): off
    UseBusSignalLabels (on/off)    : off
    StoreOffsets (true/false)      : false
    StoreAdvisor (true/false)      : false

Options for 'blockbyblock' algorithm
    BlockReduction (on/off)                   : on
    IgnoreDiscreteStates (on/off)             : off
    RateConversionMethod (zoh/tustin/prewarp/ : zoh
                          upsampling_zoh/           
                          upsampling_tustin/        
                          upsampling_prewarp        
    PreWarpFreq                               : 10
    UseExactDelayModel (on/off)               : off
    AreParamsTunable (true/false)             : true

Options for 'numericalpert' algorithm
    NumericalPertRel : 1.000000e-05
    NumericalXPert   : []
    NumericalUPert   : []

Следующая команда выполняет линеаризацию с помощью метода удержания нулевого порядка. Потому что линеаризация включает в себя Zero-Order Hold блок, шаг расчета линеаризации 0,01.

sys_zoh = linearize(model,io,opt);

Следующие команды изменяют метод преобразования скорости на метод Тастина (Билинейное преобразование), а затем линеаризируются с помощью этого метода. Шаг расчета этой линеаризированной модели также составляет 0,01.

opt.RateConversionMethod = 'tustin';
sys_tust = linearize(model,io,opt);

Можно также создать линейную модель непрерывного времени, задав шаг расчета как 0 в объекте опции. Метод преобразования скорости все еще создает линейную модель дискретного времени, но затем преобразует модель дискретного времени в модель непрерывного времени.

opt.SampleTime = 0;
sys_c = linearize(model,io,opt);

Диаграммы Боде для трех линеаризаций показывают эффекты двух методов преобразования скорости. В этом примере метод преобразования скорости Тастина дает наиболее точное представление фазовому отклику непрерывной системы, а удержание нулевого порядка дает лучшее соответствие величины ответу.

p = bodeoptions('cstprefs');
p.YLimMode = {'manual'};
p.YLim = {[-100 0];[-180 -30]};
p.Grid = 'on';
bodeplot(sys_c,sys_zoh,sys_tust,p);
h = legend('sys_c','sys_zoh','sys_tust','Location','SouthWest');
h.Interpreter = 'none';

Закройте модели:

bdclose('scdmrate');
bdclose('scdmrate_ol');