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

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

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

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