扩展卡尔曼滤波的S函数实现试题.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
扩展卡尔曼滤波器的s函数编写 function [sys,x0,str,ts] = sekfs(t,x,u,flag) switch flag, case 0, [sys,x0,str,ts]=mdlInitializeSizes; case 2, sys=mdlUpdate(t,x,u); case 3, sys=mdlOutputs(t,x,u); case {1,4,9}, sys=[]; otherwise error([Unhandled flag = ,num2str(flag)]); end function [sys,x0,str,ts]=mdlInitializeSizes sizes = simsizes; sizes.NumContStates = 0; sizes.NumDiscStates = 3; sizes.NumOutputs = 1; sizes.NumInputs = 1; sizes.DirFeedthrough = 0; sizes.NumSampleTimes = 1; sys = simsizes(sizes); x0 = [4.5000 15.0000 15.0000]; str = []; ts = 1e-6; function sys=mdlUpdate(t,x,u) global Qon; Qon=1; R=1e-2; Q=Qon*diag([1e-2 1e-2 1e-2]); G_basal = 4.5; % mmol/L X_basal = 15; % mU/L I_basal = 15; % mU/L P1 = 0.028735; % min-1 P2 = 0.028344; % min-1 P3 = 5.035e-5; % mU/L V1 = 12; % L n = 5/54; % min D = 5; To=1e-6; % for i=1:3 % for j=1:3 % P(i,j)=x(3*i+j); % end % end P=[0.01 0 0; 0 0.01 0;0 0 0.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,1) = x(2)+(-P2 * (x(2) - X_basal) + P3 * (x(3) - I_basal))*To; xp(3,1) = x(3)+(-n * x(3) + u(1) / V1)*To; F=[ -P1-x(2),-x(1),0 ;0,-P2,P3;0,0, -n]; P=F*P*F+Q; H=[1,0,0]; K=P*H*inv(H*P*H+R); D=u(1); H=xp(1,1); xp=xp+K*(D-H); P=P-K*H*P; %sys=[xp(1,1);xp(2,1);xp(3,1)]; for i=1:3 sys(i)=xp(i,1); end % for i=1:3 % for j=1:3 % sys(i,j)=P(3*i+j); % end % end function sys=mdlOutputs(t,x,u) sys =x(1); Error in untitled/S-Function while executing M-File S-function sekfs, flag = 2 (update), at time 0. MATLAB error message: Inner matrix dimensions must agree. 哪里错了? 最佳答案 H=[1,0,0]; K=P*H*inv(H*P*H+R); D=u(1); H=xp(1,1); xp=xp+K*(D-H); P=P-K*H*P; H是一个3*1的矩阵,但在下面H=xp(1,1),这时又变成一个数了,后面xp=xp+K*(D-H);没有问题。但是P=P-K*H*P;这里就出现了矩阵维数不对。你换过来就行了。 你的调用要是在for循环体中,那么你的输入参数比如x是否进行矩阵维数扩展,即表示成x(1,k)这种形式?(这条可能就是产生问题的最主要原因) 另外x和u的维数是否正确?我看这个函数程序中的x应该是3维的列向量 还有你函数中xp=zeros(3,size(x,2));这句所生成的是一个三维的列向量,那么下面的xp(1,1)..xp(3,1)这些调用是否合理等都需要认真考虑 func

文档评论(0)

yy558933 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档