Code covered by the BSD License  

Highlights from
Identification of LTI System with nonlinear Feedback

Identification of LTI System with nonlinear Feedback

by

 

A nonlinear identification scheme is provided for a LTI-system with a feedback-nonlinearity

sfunmoment(t, x, u, flag,...
function [sys,x0,str,ts] = sfunmoment(t, x, u, flag,...
				      parameters),
%       An S-function which computes the Mirror Moment
%
%       The input is in the Form:
%       u = [V_M(t), phi(t), V_L(t), V_R(t)]
%
%       The parameter structure has the following entries:
%       d0: gap width
%       lm: mirror lenght
%       bm: mirror width
%
%       Heiko Wolfram 2005.
%
%       $Id: sfunmoment.m,v 0.1 2005/08/12 12:57:04 hwol Exp $

%   What is returned by SFUNC at a given point in time, T, depends on the
%   value of the FLAG, the current state vector, X, and the current
%   input vector, U.
%
%   FLAG   RESULT             DESCRIPTION
%   -----  ------             --------------------------------------------
%   0      [SIZES,X0,STR,TS]  Initialization, return system sizes in SYS,
%                             initial state in X0, state ordering strings
%                             in STR, and sample times in TS.
%   1      DX                 Return continuous state derivatives in SYS.
%   2      DS                 Update discrete states SYS = X(n+1)
%   3      Y                  Return outputs in SYS.
%   4      TNEXT              Return next time hit for variable step sample
%                             time in SYS.
%   5                         Reserved for future (root finding).
%   9      []                 Termination, perform any cleanup SYS=[].


  switch flag,
    
    %%%%%%%%%%%%%%%%%%
    % Initialization %
    %%%%%%%%%%%%%%%%%%
   case 0,
    [sys,x0,str,ts]=mdlInitializeSizes;
    
    %%%%%%%%%%%
    % Outputs %
    %%%%%%%%%%%
   case 3,
    sys=mdlOutputs(t, x, u, parameters);
    
    %%%%%%%%%%%%%%%%
    % Unused flags %
    %%%%%%%%%%%%%%%%
   case { 1, 2, 4, 9 },
    sys = [];
    
   case 'moment',
    sys = LocalMoment(parameters, u, x);
    
    %%%%%%%%%%%%%%%%%%%%
    % Unexpected flags %
    %%%%%%%%%%%%%%%%%%%%
   otherwise
    error(['Unhandled flag = ',num2str(flag)]);
    
  end % case flag
  
% end  sfun_moment
    
%
%=============================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================
%
function [sys,x0,str,ts] = mdlInitializeSizes 
  
  % simsizes for a sizes structure
  sizes = simsizes;
  
  sizes.NumContStates  = 0; % number of continuous states
  sizes.NumDiscStates  = 0; % number of discrete states
  sizes.NumOutputs     = 1; % number of system outputs (length of output y)
  sizes.NumInputs      = 4; % number of system inputs (length of input u)
  sizes.DirFeedthrough = 1; % direct feedthrough flag; used to detect algebraic loops.
  sizes.NumSampleTimes = 0; % at least one sample time is needed
    
  sys = simsizes(sizes);
  
  % initialize the initial conditions
  x0  = []; 
  
  % str is always an empty matrix
  str = [];
  
  % initialize the array of sample times
  ts = [];
% end mdlInitializeSizes


%
%=============================================================================
% mdlOutputs
% Return the block outputs.
%=============================================================================
%
function sys = mdlOutputs(t,x,u,params)

  sys = LocalMoment(params, u(1) + u(4), u(2)) -...
	LocalMoment(params, u(1) + u(3), -u(2));

% end mdlOutputs


%
%=============================================================================
% LocalMoment
% Calculate Moment for one Plate.
%=============================================================================
%
function yout = LocalMoment(params, u, phi)
  
  epsilon0 = 8.8541978E-12;
  
  if abs(phi) < sqrt(eps),
      
    % Taylor Approximation
    yout = (params.bm^2*params.lm*epsilon0*...
	    (-3*params.d0 + 2*params.bm*phi)*u^2)/(48*params.d0^3);
    
  else;
    
    yout = params.lm*epsilon0*u^2*cos(phi)/sin(phi)^2*...
	   ( (params.bm*sin(phi))/(4*params.d0 + 2*params.bm*sin(phi)) - ...
	     atanh((params.bm*sin(phi))/(4*params.d0 + params.bm*sin(phi))) ...
	     );
  end;
  
% end LocalMoment


%% End of File

Contact us