资源描述:
《扩展卡尔曼滤波的S函数实现》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、扩展卡尔曼滤波器的s函数编写function[sys,x0,str,ts]=sekfs(t,x,u,flag)switchflag,case0,[sys,x0,str,ts]=mdlInitializeSizes;case2,sys=mdlUpdate(t,x,u);case3,sys=mdlOutputs(t,x,u);case{1,4,9},sys=[];otherwiseerror(['Unhandledflag=',num2str(flag)]);endfunction[sys,x0,str,ts]=mdlInitializeSizessizes
2、=simsizes;sizes.NumContStates=0;sizes.NumDiscStates=3;sizes.NumOutputs=1;sizes.NumInputs=1;sizes.DirFeedthrough=0;sizes.NumSampleTimes=1;sys=simsizes(sizes);x0=[4.500015.000015.0000];str=[];ts=1e-6;functionsys=mdlUpdate(t,x,u)globalQon;Qon=1;R=1e-2;Q=Qondiag([1e-21e-21e-2]);G_bas
3、al=4.5;%mmol/LX_basal=15;%mU/LI_basal=15;%mU/LP1=0.028735;%min-1P2=0.028344;%min-1P3=5.035e-5;%mU/LV1=12;%Ln=5/54;%minD=5;To=1e-6;%fori=1:3%forj=1:3%P(i,j)=x(3i+j);%end%endP=[0.0100;00.010;000.01];xp=zeros(3,size(x,2));xp(1,1)=x(1)+(-P1(x(1)-G_basal)-(x(2)-X_basal)x(1)+D)To;xp(2,
4、1)=x(2)+(-P2(x(2)-X_basal)+P3(x(3)-I_basal))To;xp(3,1)=x(3)+(-nx(3)+u(1)/V1)To;F=[-P1-x(2),-x(1),0;0,-P2,P3;0,0,-n];P=FPF'+Q;H=[1,0,0];K=PH'inv(HPH'+R);D=u(1);H=xp(1,1);xp=xp+K(D-H);P=P-KHP;%sys=[xp(1,1);xp(2,1);xp(3,1)];fori=1:3sys(i)=xp(i,1);end%fori=1:3%forj=1:3%sys(i,j)=P(3i+
5、j);%end%endfunctionsys=mdlOutputs(t,x,u)sys=x(1);Errorin'untitled/S-Function'whileexecutingM-FileS-function'sekfs',flag=2(update),attime0.MATLABerrormessage:Innermatrixdimensionsmustagree.哪里错了?最佳答案H=[1,0,0];K=PH'inv(HPH'+R);D=u(1);H=xp(1,1);xp=xp+K(D-H);P=P-KHP;H是一个31的矩阵,但在下面H=xp
6、(1,1),这时又变成一个数了,后面xp=xp+K(D-H);没有问题。但是P=P-KHP;这里就出现了矩阵维数不对。你换过来就行了。你的调用要是在for循环体中,那么你的输入参数比如x是否进行矩阵维数扩展,即表示成x(1,k)这种形式?(这条可能就是产生问题的最主要原因)另外x和u的维数是否正确?我看这个函数程序中的x应该是3维的列向量还有你函数中xp=zeros(3,size(x,2));这句所生成的是一个三维的列向量,那么下面的xp(1,1)..xp(3,1)这些调用是否合理等都需要认真考虑function[sys,x0,str,ts]=str_s
7、im(t,x,z,flag,T,n,R1,xinit,Pinit)%EKFSExtendedKalmanfilterS-functionforrekursiveidentification%ThisM-fileisdesignedtobeusedinaSimulinkS-functionblock.%ItimplementsanextendedKalmanfilterforjointstateestimation%andparametertracking.Sofar,onlyoutputerrorSISOmodelsare%supported%%Inpu
8、t:theta%Output:(dummy)%switchflag,%%%%%%