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

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

Проблема в качестве примера

В модели 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');