S-function error
7 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
iman
le 3 Juin 2012
Réponse apportée : Fatema
le 28 Jan 2023
hi guys when i try to use the follow s-function in a simulink block, i obtain this error:
Error in 'NARMA/S-Function' while executing MATLAB S-function 'NARMASYSTEM', flag = 0 (initialize), at start of simulation.Output argument "x0" (and maybe others) not assigned during call to "F:\Ms control\Adaptive control\Project\MATLAB\NARMASYSTEM.m>NARMASYSTEM".
This is the function code:
function [sys,x0,str,ts] = NARMASYSTEM(t,x,u,flag)
%M-file S-function for defining a discrete system.
% This S-function implements discrete equations
% Generate a discrete linear system:
a1=0.2;
a2=0.1;
g1=1;
g2=0.2;%=-0.2
b1=0.3;
b2=-0.6;
switch flag,
case 0
sys = mdlInitializeSizes(a1,a2,g1,g2,b1,b2); % Initialization
case 2
sys = mdlUpdate(t,x,u,a1,a2,g1,g2,b1,b2); % Update discrete states
case 3
sys = mdlOutputs(t,x,u,a1,a2,g1,g2,b1,b2); % Calculate outputs
case {1, 4, 9} % Unused flags
sys = [];
otherwise
error(['unhandled flag = ',num2str(flag)]); % Error handling
end
% End of dsfunc.
%==============================================================
% Initialization
%==============================================================
function [sys,x0,str,ts] = mdlInitializeSizes(a1,a2,g1,g2,b1,b2)
% Call simsizes for a sizes structure, fill it in, and convert it
% to a sizes array.
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 2;
sizes.NumOutputs = 2;
sizes.NumInputs = 2;
sizes.DirFeedthrough = 0; % Matrix D is non-empty.
sizes.NumSampleTimes = 0.05;
sys = simsizes(sizes);
x0 = [0 1]; % Initialize the discrete states.
str = []; % Set str to an empty matrix.
ts = [1 0]; % sample time: [period, offset]
% End of mdlInitializeSizes.
%==============================================================
% Update the discrete states
%==============================================================
function sys = mdlUpdates(t,x,u,a1,a2,g1,g2,b1,b2)
sys(1) =a1*x(1)*cos(x(1))+a2*(x(1)^2)/(1+x(1)^2)+g1*x(2) ;
sys(2)=b1*sin(x(1))+b2*(x(1)^3)/(2+x(1)^2)+g2*u(1)+u(2);
% End of mdlUpdate.
%==============================================================
% Calculate outputs
%==============================================================
function sys = mdlOutputs(t,x,u,a1,a2,g1,g2,b1,b2)
sys(1) =x(1);
sys(2)=x(2);
% End of mdlOutputs.
0 commentaires
Réponse acceptée
Walter Roberson
le 3 Juin 2012
Your call
sys = mdlInitializeSizes(a1,a2,g1,g2,b1,b2); % Initialization
should be
[sys,x0,str,ts] = mdlInitializeSizes(a1,a2,g1,g2,b1,b2); % Initialization
Plus de réponses (1)
Voir également
Catégories
En savoir plus sur Block and Blockset Authoring dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!