mixed.m моделирует непрерывный интегратор, сопровождаемый дискретной единичной задержкой. В форме блок-схемы Simulink, модель имеет вид.
Ниже приведен код для M-файла S-функции.
function [sys,x0,str,ts] = mixedm(t,x,u,flag)
% пример гибридный системы ,
% состоящей из непрерывного интегратора (1/s) последовательно с
% задержкой на один шаг(1/z).
%
% Установить период осуществления выборки и смещений для единичной задержки.
dperiod = 1;
doffset = 0;
switch flag,
case 0
[sys,x0,str,ts] = mdlInitializeSizes(dperiod,doffset);% Инициализация
case 1
sys = mdlDerivatives(t,x,u); % Вычислить производные
case 2
sys = mdlUpdate(t,x,u,dperiod,doffset); % Модифицировать дисковые состояния
case 3
sys = mdlOutputs(t,x,u,doffset,dperiod); % Вычислить выходы
case {4, 9}
sys = []; % Неиспользованные флажки
otherwise
error(['unhandled flag = ',num2str(flag)]); % Обработка ошибок
end
% Конец mixedm.
%
%==============================================================
% mdlInitializeSizes
% Возвратить размеры, установить состояния и периоды дискретизации .
%==============================================================
function [sys,x0,str,ts] = mdlInitializeSizes(dperiod,doffset)
sizes = simsizes;
sizes.NumContStates = 1;
sizes.NumDiscStates = 1;
sizes.NumOutputs = 1;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 2;
sys = simsizes(sizes);
x0 = ones(2,1);
str = [];
ts = [0, 0
dperiod, doffset]; % Задание времени дискретизации
% Конец mdlInitializeSizes.
%
%==============================================================
% mdlDerivatives
% Вычислить производные для непрерывных состояний.
%==============================================================
%
function sys = mdlDerivatives(t,x,u)
sys = u;
% конец mdlDerivatives.
%
%==============================================================
% mdlUpdate
% Обработать обновления дискретных состояний, произвести выбор момента
%квантования , и требований главного шага квантования.
%==============================================================
%
function sys = mdlUpdate(t,x,u,dperiod,doffset)
% Следующее дискретное состояние является выходом интегратора.
% Надо возвратить это дискретное состояние при относительном отклонении
% непрерывного время от значения, к ближайшему моменту
%времени кратному дискреному шагу, менее 1e-8,
%иначе возвращаем [], что указывает, что дискретное состояние не должно измениться.
%
if abs(round((t-doffset)/dperiod)-(t-doffset)/dperiod) < 1e-8
sys = x(1);
% mdlUpdate "запирает" значение непрерывного состояния x (1),
%таким образом вводя задержку.
else
sys = []; % Этот момент - не момент времени выборки, так матрица sys возвратилась
% пустой , чтобы указать, что состояния не имеют изменений
end
% Конец mdlUpdate.
%
%==============================================================
% mdlOutputs
% Возвратить вектор выхода для S-функции.
%==============================================================
%
function sys = mdlOutputs(t,x,u,doffset,dperiod)
% возвращение выхода с единичной задержкой, если мы имеем момент времени
% выборки в пределах допуска 1e-8, иначе возвращаем [], указывающую,
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.