Модель непрерывной системы, описываемой уравнениями пространства состояния дана в файле csfunc.m . Данная S-функция моделирует непрерывную систему с двумя входами, двумя выходами и двумя переменными состояния. Параметры модели (значения матриц A,В,С,D) задаются в теле S-функции и передаются в callback-методы через их заголовки в качестве дополнительных параметров. Ниже приведен текст этой S-функции.
S-функция csfunc:
function [sys,x0,str,ts] = csfunc(t,x,u,flag)% CSFUNC Пример S-функции. Спомощью уравнений пространства состояния% моделируется непрерывная система:%% x' = Ax + Bu% y = Cx + Du%% Значения матриц передаются в callback-методы через их заголовки% в качестве дополнительных параметров% %% Шаблон для создания S-функции - файл sfuntmpl.m .% % Copyright 1990-2001 The MathWorks, Inc.% $Revision: 1.8 $% Авторский перевод комментариев: Черных И.В.% Задание матриц:A=[-0.09 -0.01 1 0]; % Mатрица системы. B=[ 1 -7 0 -2]; % Mатрица входа. C=[ 0 2 1 -5]; % Mатрица выхода. D=[-3 0 1 0]; % Mатрица обхода. switch flag, % В зависимости от значения переменной flag происходит % вызов того или иного метода:%===============%% Инициализация %%===============% case 0, [sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D);%====================%% Расчет производных %%====================% case 1, sys=mdlDerivatives(t,x,u,A,B,C,D);%===========================================%% Расчет значений вектора выходных сигналов %%===========================================% case 3, sys=mdlOutputs(t,x,u,A,B,C,D);%=========================================%% Неиcпользуемые значения переменной flag %%=========================================% % В примере не используются методы для завершения работы S-функции, % нет дискретных переменных состояния, % поэтому значения переменной flag = 2, 4, 9 не используются. % Результатом S-функции в этом случае является пустая матрица. case { 2, 4, 9 } sys=[];%======================================%% Неизвестное значение переменной flag %%======================================% otherwise error(['Unhandled flag = ',num2str(flag)]);end% Окончание csfunc%%===============================================================%% mdlInitializeSizes %% Функция инициализации %% Расчет начальных условий, значений вектора модельного времени,%% размерности матриц %%===============================================================%%function [sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D)sizes = simsizes;sizes.NumContStates = 2; % Число непрерывных переменных состояния.sizes.NumDiscStates = 0; % Число дискретных переменных состояния.sizes.NumOutputs = 2; % Число выходных переменных (размерность выходного % вектора).sizes.NumInputs = 2; % Число входных переменных (размерность входного % вектора).sizes.DirFeedthrough = 1; % Прямой проход. Есть проход входного сигнала % на выход. % (матрица D не пустая).sizes.NumSampleTimes = 1; % Размерность вектора шагов модельного времени.sys = simsizes(sizes);x0 = zeros(2,1); % Задание вектора начальных значений переменных % состояния. Начальные условия нулевые.str = []; % Параметр заразервирован для будущего % использования.ts = [0 0]; % Матрица из двух колонок, задающая шаг модельного % времени и смещение.% Окончание mdlInitializeSizes%%========================================================================%% mdlDerivatives %% Функция для расчета значений производных вектора состояния непрерывной %% части системы %%========================================================================%%function sys=mdlDerivatives(t,x,u,A,B,C,D)sys = A*x + B*u;% Окончание mdlDerivatives%%========================================================%% mdlOutputs%% Функция для расчета значений вектора выходных сигналов %%========================================================%function sys=mdlOutputs(t,x,u,A,B,C,D)sys = C*x + D*u;% Окончание mdlOutputs
Пример модели с S-функцией csfunc приведен на рис.16.5.