function [sys,x0,str,ts,simStateCompliance]=EKF(t,x,u,L,R1,J,Ke,H,Q,R,I,B,P)
global F Z M P K w sita;
switch flag
case 0
[sys,x0,str,ts,simStateCompliance] = mdlInitializeSizes;
case 1
sys = mdlDerivatives(t,x,u);
case 2
sys = mdlUpdate(t,x,u);
case 3
sys = mdlOutputs(t,x,u);
case 4
sys=mdlGetTimeOfNextVarHit(t,x,u);
case 9
sys=mdlTerminate(t,x,u);
sys = []; % do nothing
otherwise
error(['unhandled flag = ',num2str(flag)]);
end
function [sys,x0,str,ts,simStateCompliance] = mdlInitializeSizes(t,x,u,L,R1,Ke,H,Q,R,B,P)
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 1;
sizes.NumOutputs = 1;
sizes.NumInputs = 4;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
str = [];
x0=[];
ts = [0.0001 0];
simStateCompliance = 'UnknownSimState';
Tc=0.0001;
function sys=mdlUpdate(t,x,u)
x=[u(1);u(2);w];
u=[u(3);u(4)];
sita=w*dt;
F = [-R1/L 0 Ke*sin(sita);0 -R1/L -Ke*cos(sita);0 0 0];
M = I+F*Tc;
t=t-Tc;
x=M*x+B*Tc*u;
P = M*P*M'+Q; %预报tk时刻的误差的协方差阵P(k|k-1)
sys=x;
function sys = mdlOutputs(t,x,u)
K = P*H'*((H*P*H'+R)^-1); %计算Kalman滤波器增益K(k)
P = (I-K*H)*P; %给出tk时刻的误差协方差的最优估计p(k|k)
x = x+K*([u(1);u(2)]-H*x);
sys = [w];
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 0.0001;
sys = t + sampleTime;
function sys=mdlTerminate(t,x,u);
sys = [];
上述程序在运行时出现“SWITCH 表达式必须为标量或字符串常”的问题,不知哪里出了问题,请求大神指点一下,谢谢!