MATLAB.Exponenta
–Û·Ë͇ Matlab&Toolboxes

Simulink

Советы пользователям Simulink от ведущего раздела

Полный список советов

15. Блок передаточной функции с переменными коэффициентами

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

Создать такой блок можно используя методику моделирования передаточных функций изложенную в [1]. Передаточная функция:

представляется в виде

,

где

.

Затем численно решается дифференциальное уравнение, соответствующее передаточной функции

.

Для этого значения производных определяются на основе вычисления правых частей следующей системы нормальных дифференциальных уравнений:

,

где

u - входное воздействие,

- переменные состояния.

Искомое решение (выходная переменная) находится следующим образом:

.

Для реализации изложенного алгоритма разработан блок Transfer Fcn (vp), схема и пиктограмма которого показаны на рис.1. Входное воздействие подается на входной порт In, а выходной сигнал снимается с порта Out. На вход Num должен быть подан вектор коэффициентов числителя, а на вход Den - вектор коэффициентов знаменателя. В окне задания параметров (рис. 2) необходимо указать размерность векторов коэффициентов числителя и знаменателя.

Рис. 1

Окно задания параметров:

Рис. 2

Параметры блока:

Numerator length:

[Размерность вектора коэффициентов числителя]. Размерность вектора коэффициентов числителя не должна превышать размерность вектора коэффициентов знаменателя.

Denominator length:

[Размерность вектора коэффициентов знаменателя].

Сам алгоритм расчета выходного сигнала блока реализован с помощью S-функции, текст которой с необходимыми комментариями приведен ниже.

function [sys,x0,str,ts] = PF_DR(t,x,u,flag,n_chisl,n_znam)
%   Дробно-рациональная передаточная функция. Коэффициенты
%   числителя и знаменателя передаются через вход S-функции
%   В параметрах S-функции необходимо указать размерности векторов
%   числителя (n_chisl) и знаменателя (n_znam)

% Черных И.В., 8.01.2005 - 10.01.2005

%   Определение максимальной размерности знаменателя:
if n_znam <=1
     n_znam_max = 1;
else 
     n_znam_max = n_znam;
end


switch flag,  % В зависимости от значения переменной flag происходит
              % вызов того или иного метода:

%===============%
% Инициализация %
%===============%
  case 0,
    [sys,x0,str,ts] = mdlInitializeSizes(n_znam,n_znam_max,n_chisl);
    dx1 = 0;
% Присвоение производной первой переменной состояния нулевого 
% начального значения
    set_param(gcb,'UserData',dx1);
% Запоминание значения dx1 в параметре UserData блока S-function

%====================%
% Расчет производных %
%====================%
  case 1,
    sys = mdlDerivatives(t,x,u,n_znam,n_znam_max,n_chisl);
    dx1 = sys(n_znam-1); % Извлечение производной первой
                         % переменной состояния
    set_param(gcb,'UserData',dx1);
% Запоминание значения dx1 в параметре UserData блока S-function 

%===========================================%
% Расчет значений вектора выходных сигналов %
%===========================================%
  case 3,

    dx1 = get_param(gcb,'UserData');
% Присвоение значения dx1, извлеченного из параметра UserData
% блока S-function 
    sys = mdlOutputs(t,x,u,n_znam,n_chisl,dx1);

%=========================================%
% Неи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(n_znam,n_znam_max,n_chisl)

sizes = simsizes;
sizes.NumContStates = n_znam_max; % Число непрерывных переменных
                                  % состояния.
sizes.NumDiscStates  = 0; % Число дискретных  переменных состояния.
sizes.NumOutputs    = 1; % Число выходных переменных (размерность
                         % выходного вектора).
sizes.NumInputs = (1 + n_znam + n_chisl); 
% Число входных переменных (размерность входного вектора).
sizes.DirFeedthrough = 1; % Прямой проход. Есть проход входного
                          % сигнала на выход
sizes.NumSampleTimes = 1; % Размерность вектора шагов модельного
                          % времени.

sys = simsizes(sizes);

x0 = zeros(n_znam_max,1); % Задание вектора начальных значений
                          % переменных состояния. 
                          % Начальные условия нулевые, если порядок
                          % числителя меньше порядка знаменателя

str = [];   % Параметр зарезервирован для будущего использования.
ts  = [0 0];% Матрица из двух колонок, задающая шаг модельного
            % времени и смещение.
                          
% Окончание mdlInitializeSizes
%
%=============================================================%
% mdlDerivatives                                              %
% Функция для расчета значений производных вектора состояния  %
% непрерывной части системы                                   %
%=============================================================%
%

function sys = mdlDerivatives(t,x,u,n_znam,n_znam_max,n_chisl);

[u_vh,a,b] = param(u,n_znam,n_chisl);
% Извлечение из входного сигнала входной переменной, 
% а также векторов знаменателя и числителя
sys  = zeros(n_znam_max,1); 

if n_znam > 1 
   for k = 1:(n_znam - 2); 
      sys(k) = x(k+1);
   end
   
   s = 0;
   for k = 1:(n_znam - 1);
      s = s + (a(k)/a(n_znam))*x(k);
   end
  sys(n_znam-1) = u_vh - s;   % Вычисление производных выходного
                              % сигнала
end
% Окончание mdlDerivatives

%
%========================================================% 
% mdlOutputs                                             %
% Функция для расчета значений вектора выходных сигналов %
%========================================================%
%
function sys=mdlOutputs(t,x,u,n_znam,n_chisl,dx1)

[u_vh,a,b] = param(u,n_znam,n_chisl);
% Извлечение из входного сигнала входной переменной 
% и векторов знаменателя и числителя

x1=x;
x1(n_znam) = dx1; 

sys = 0;
   for k = 1: n_chisl;
      sys = sys + b(k)/a(n_znam)*x1(k); % Вычисление выходного
                                        % сигнала
  end

 if t == 0  % Вычисление выходного сигнала для момента времени t == 0
     if n_chisl == n_znam
        sys = u_vh*b(n_chisl)/a(n_znam); 
% Если порядки числителя и знаменателя равны, то выходной сигнал
% равен входному, умноженному на отношение свободных членов
     else 
        sys = 0;
% В противном случае выходной сигнал равен 0.
    end
end
% Окончание mdlOutputs


function [u_vh,a,b] = param(u,n_znam,n_chisl);
% Функция извлечения из входного сигнала входной переменной
% и векторов знаменателя и числителя

u_vh = u(1);  % Извлечение входного сигнала

% Извлечение вектора коэффициентов знаменателя:
n = n_znam;
for k = 2:(2 + n_znam - 1);
    a(n) = u(k);
    n = n - 1;
end

% Извлечение вектора коэффициентов числителя:
n = n_chisl;
for k = (2 + n_znam):(2 + n_znam + n_chisl -1);
    b(n) = u(k);
    n = n - 1;
end

% Окончаниие функции param

Пример 1:

На рис. 3 показано сравнение работы нового блока со стандартным блоком Transfer Fcn. Как видно из графиков на рисунке, результаты полностью совпадают.

Рис. 3

Скачать пример (Ex_TF_Var_Param_1.zip)

В том случае, если коэффициенты числителя и знаменателя заданы в виде таблиц в функции какого-либо параметра необходимо иметь также блок обеспечивающий интерполяцию коэффициентов при изменении этого параметра. Такой блок может быть создан на основе S-функции с применением стандартной функции MATLAB interp1. Схема и пиктограмма блока интерполяции показаны на рис.4. Окно задания параметров показано на рис.5.

Рис. 4

Окно задания параметров:

Рис. 5

Параметры блока:

Vector of input values:

[Вектор входных значений]. Размерность вектора коэффициентов числителя не должна превышать размерность вектора коэффициентов знаменателя.

Matrix (vector) of output values:

[Матрица или вектор выходных значений]. Каждая строка в матрице выходных значений соответствует новому набору коэффициентов.

Interpolation method:

[Метод интерполяции]. Значение параметра выбирается из списка:

  • linear - линейная интерполяция,
  • cubic - кубическая интерполяция,
  • spline - сплайн-интерполяция.

Сам алгоритм расчета выходного сигнала блока реализован с помощью S-функции, текст которой с необходимыми комментариями приведен ниже.

function [sys,x0,str,ts] = Interp_table(t,x,u,flag,x_vh,y_vh,method)
%   Функция для интерполирования коэффициентов полиномов передаточной
%   функции.
%   x_vh - вектор аргумента
%   y_vh - матрица значений табличной функции
%   method - метод интерполяции
% Черных И.В., 25.01.2005


switch flag,   % В зависимости от значения переменной flag происходит
               % вызов того или иного метода:

%===============%
% Инициализация %
%===============%
  case 0,
    [sys,x0,str,ts]=mdlInitializeSizes(y_vh);


%===========================================%
% Расчет значений вектора выходных сигналов %
%===========================================%
  case 3,
    sys=mdlOutputs(t,x,u,x_vh,y_vh,method);

%=========================================%
% Неиcпользуемые значения переменной flag %
%=========================================%

  % В примере не используются методы для завершения работы S-функции,
  % нет дискретных переменных состояния, нет вычисления производных,
  % поэтому значения переменной flag = 1, 2, 4, 9 не используются.
  % Результатом S-функции в этом случае является пустая матрица.

  case {1, 2, 4, 9}
    sys=[];


%======================================%
% Неизвестное значение переменной flag %
%======================================%
  otherwise
    error(['Unhandled flag = ',num2str(flag)]);

end
% Окончание csfunc

%
%===============================================================%
% mdlInitializeSizes                                            %
% Функция инициализации                                         %
% Расчет начальных условий, значений вектора шагов модельного   % 
% времени,размерности матриц                                    %
%===============================================================%
%
function [sys,x0,str,ts]=mdlInitializeSizes(y_vh)

[size_x size_y] = size(y_vh);

sizes = simsizes;
sizes.NumContStates  = 0; % Число непрерывных переменных состояния.
sizes.NumDiscStates  = 0; % Число дискретных  переменных состояния.
sizes.NumOutputs     = size_y; % Число выходных переменных 
                               % (размерность выходного вектора).
sizes.NumInputs      = 1 ; % Число входных переменных
                           % (размерность входного вектора).
sizes.DirFeedthrough = 1; % Прямой проход. Есть проход входного
                          % сигнала на выход
sizes.NumSampleTimes = 1; % Размерность вектора шагов модельного времени.

sys = simsizes(sizes);
x0  = [];  % Задание вектора начальных значений переменных состояния. 
           % Начальные условия нулевые
str = [];  % Параметр зарезервирован для будущего использования.
ts  = [0 0]; % Матрица из двух колонок, задающая шаг модельного
             % времени и смещение.
% Окончание mdlInitializeSizes
%
%========================================================% 
% mdlOutputs                                             %
% Функция для расчета значений вектора выходных сигналов %
%========================================================%
%
function sys=mdlOutputs(t,x,u,x_vh,y_vh,method)

sys = interp1(x_vh,y_vh,u,method);
  
% Окончание mdlOutputs

Пример 2:

На рис. 6 показана схема с в которой интерполяция коэффициентов передаточной функции производится с помощью разработанного блока Interp Fcn. Значения коффициентов числителя и знаменателя считываются из файлов с помощью блока Load Num & Den. Схема выполняет расчет для любого значения переменной x, лежащего в пределах от 0 до 6.6.

Рис. 6

Скачать пример (Ex_TF_Var_Param_2.zip)


Поиск по сайту:

Система Orphus

Яндекс.Метрика