马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
s函数代码如下:
function [sys,x0,str,ts]=ercichazhi(t,x,u,flag)
global P m D1 D2 D3 P1 P2 P3 D
%P=0;
m=0;
%D=0.5;
%D1=0;D2=0.5;D3=1;P1=0;P3=0;
switch flag,
case 0,
[sys,x0,str,ts]=mdlInitializeSizes(P,m,D1,D2,D3,P1,P2,P3,D);
case 1
sys=mdlDerivatives(t,x,u);
case 2
sys=mdlUpdate(t,x,u,P,m,D1,D2,D3,P1,P2,P3,D);
case 3,
sys=mdlOutputs(t,x,u,P,m,D1,D2,D3,P1,P2,P3,D);
case 4
sys=mdlGetTimeOfNextVarHit(t,x,u);
case 9
sys=mdlTerminate(t,x,u);
%case {1,2,9}
% sys=[];
otherwise
error(['Unhandled flag=',num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes(P,m,D1,D2,D3,P1,P2,P3,D)
sizes=simsizes; % 调用simsizes获得一个用于存放长度信息的结构
sizes.NumContStates=0; %设置连续状态的个数
sizes.NumDiscStates=1; %设置离散状态的个数
sizes.NumOutputs=1; %设置输出信号的个数
sizes.NumInputs=1; %设置输入信号的个数
sizes.DirFeedthrough=0;
%设置直接反馈的状态:0表示没有直接反馈,1表示存在直接反馈
sizes.NumSampleTimes=1; %设置抽样时间的个数(大于等于1)
sys=simsizes(sizes); %通过simsizes把sizes结构返还给sys
x0=[0]; %设置S函数的初始状态x0
str=[]; %设置S函数的保留参数str(应该设置为空向量)
ts=[0.000002 0]; %初始化抽样时间
%================================
function sys=mdlDerivatives(t,x,u)
sys=[]; %计算S函数连续状态的导数并且通过sys参数返还给Simulink
%======================================================
function sys=mdlUpdate(t,x,u,P,m,D1,D2,D3,P1,P2,P3,D)
if m>=3 & P3<u %进行比较,确定包含最大值的最小空间
{
D1=D2,P1=P2;D2=D3,P2=P3;D3=D,P3=u; 此处错误:the expression to the left of the equals sign is not a valid
target for an assignment
D=(m+1)*0.05;
m=m+1;
sys=D;
}
elseif m>=3 & P3>=u
{
D1=D2,P1=P2;D2=D3,P2=P3;D3=D,P3=u;
m=0;
C1=(P3-P1)/(D3-D1);
C2=((P2-P1)/(D2-D1)-C1)/(D2-D3);
D=0.5*(D1+D3-C1/C2);
sys=D;
}
else % 穷举点不到三个时,先进行D1,D2,D3的初始化
{
switch m
case 0
D1=0,P1=u;
D=(m+1)*0.5;
m=m+1;
sys=D;
case 1
D2=D,P2=u;
D=(m+1)*0.5;
m=m+1;
sys=D;
case 2
D3=D,P3=u;
D=(m+1)*0.5;
m=m+1;
sys=D;
end
}
end
%更新S函数的离散状态并且通过sys参数返还给Simulink
%========================================================
function sys=mdlOutputs(t,x,u,P,m,D1,D2,D3,P1,P2,P3,D)
%while m<20
% for i=0:50000000;%延时循环
% d=i;
%end
% m=m+1;
sys=x;
%end
%计算S函数的输出信号并且通过sys参数返还给Simulink
%========================================================
function sys=mdlGetTimeOfNextVarHit
%sys=[];
sampleTime=1;
sys=t+sampleTime;
%下一个抽样时刻设置为与当前时刻相差1秒
%==================================================
function sys=mdlTerminate(t,x,u)
sys=[]; %设置返回参数sys为空矩阵[]
麻烦高手帮忙看看啊,不胜感激!!! |