声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3290|回复: 4

[电力电机类] 扩展卡尔曼滤波

[复制链接]
发表于 2007-9-9 10:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我的M文件是这样的
function [sys,x0,str,ts] = kalman(t,x,u,flag)
switch flag,
    case 0
        [sys,x0,str,ts]=mdlInitializeSizes;
    case 2
        sys=mdlUpdates(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(FEstmtx,Hmtx,Cmtx);
sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 5;
sizes.NumOutputs     = 2;
sizes.NumInputs      = 2;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 =zeros(5,1);
str = [];
ts  = [1 0];
function sys=mdlUpdates(t,x,u,FEstmtx,Hmtx,Cmtx)
x(1)=Ialfa;x(2)=Ibeta;x(3)=Phira;x(4)=Phirb;x(5)=wr
STEP=1;%步长值
koff=12000;%开始采样
ts=0.001;%仿真输入采样周期
tsest=STEP*ts;%估计采样周期
N=1000;
%MAXSAMPLES=floor(max(size(wr)-koff)/STEP):%最大采样值
Rs=0.7384:Ls=0.127145:Lm=0.1241:Rr=0.7403:Lr=0.127145;%电机定值设定
%PMTXINIT=10:%初始状态估算误差协方差值
%QMTXINIT=1;%过程噪声协方差阵
%RMTXINIT=0.001:%测量噪声协方差阵
%计算矩阵
U=zeros(2,1);Y=U;A=zeros(5,5):C=[1 0 0 0 0;0 1 0 0 0]
%Xestmtx=[0;0;0 ;0]
PP=[10,0,0,0,0;
    0,10,0,0,0;
    0,0,10,0,0;
    0,0,0,10,0;
    0,0,0,0,10];         
Q=[1,0,0,0,0;
   0,1,0,0,0;
   0,0,1,0,0;
   0,0,0,1,0;
   0,0,0,0,200];
RR=[0.001 0;0 0.001];K=zeros(5,2)
%开始参数估计循环
for k=1:N;
  sample=k*STEP+koff%采样时间
U(1)=Va(sample);U(2)=Vb(sample);Y(1)=Ia(sample);Y(2)=Ib(sample)
A=[1-(Rs+(Lm/Lr)*(Lm/Lr)*Rr)*ts/(1-Lm*Lm/(Ls*Lr)),0,ts*Lm*Rr/((Ls-Lm*Lm/Lr)*Lr),x(5)*ts*Lm/(Ls*Lr-Lm*Lm),0;
   0, 1-(Rs+(Lm/Lr)*(Lm/Lr)*Rr)*ts/(1-Lm*Lm/(Ls*Lr)),-x(5)*ts*Lm/(Ls*Lr-Lm*Lm),ts*Lm*Rr/((Ls-Lm*Lm/Lr)*Lr),0;
    ts*Lm*Rr/Lr,0,1-ts*Rr/Lr,-ts*x(5),0;
   0,ts*Lm*Rr/Lr,ts*x(5),1-ts*Rr/Lr,0;
   0,0,0,0,1 ];
x=[A(1,1)*x(1)+A(1,3)*x(3)+A(1,4)*x(4)+ts/(Ls-Lm*Lm/Lr)*U(1);
   A(2,2)*x(2)+A(2,3)*x(3)+A(2,4)*x(4)+ts/(Ls-Lm*Lm/Lr)*U(1);
   A(3,1)*x(1)+A(3,3)*x(3)+A(3,4)*x(4);
   A(4,2)*x(2)+A(4,3)*x(3)+A(4,4)*x(4);
   A(5,5)*x(5) ];
G=[1-(Rs+(Lm/Lr)*(Lm/Lr)*Rr)*ts/(1-Lm*Lm/(Ls*Lr)),0,ts*Lm*Rr/((Ls-Lm*Lm/Lr)*Lr),x(5)*ts*Lm/(Ls*Lr-Lm*Lm),x(4)*ts*Lm/(Ls*Lr-Lm*Lm);
   0, 1-(Rs+(Lm/Lr)*(Lm/Lr)*Rr)*ts/(1-Lm*Lm/(Ls*Lr)),-x(5)*ts*Lm/(Ls*Lr-Lm*Lm),ts*Lm*Rr/((Ls-Lm*Lm/Lr)*Lr),-x(3)*ts*Lm/(Ls*Lr-Lm*Lm);
    ts*Lm*Rr/Lr,0,1-ts*Rr/Lr,-ts*x(5),ts*x(4);
   0,ts*Lm*Rr/Lr,ts*x(5),1-ts*Rr/Lr,ts*x(4);
   0,0,0,0,1 ];
H=[1,0,0,0,0;
   0,1,0,0,0];
C=[1,0,0,0,0;
   0,1,0,0,0];
%根据扩展卡尔曼滤波算法计算
P=G*PP*G'+RR;
K=P*H'*inv(H*P*H'+RR);
x=x+K*(Y-C*x);
PP=P+K*H*P;
%end
%保存变量
Ialfa(k+1)=x(1);
Ibeta(k+1)=x(2);
phira(k+1)=x(3);
phirb(k+1)=x(4);
wr(k+1)=x(5);
end
function sys=mdlOutputs(t,x,u,A,B,C)
sys=x(5);
S-FUNCTION是这样的
提示错误信息Error evaluating parameter 'FunctionName' in block 'resistor1/S-Function': Undefined variable 'myekf' or class 'myekf.m'

[ 本帖最后由 tyler 于 2007-9-9 10:35 编辑 ]
{EAE43FC6-CE16-493A-9474-3BE33EE84128}.GIF
{EAE43FC6-CE16-493A-9474-3BE33EE84128}.GIF

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

 楼主| 发表于 2007-9-9 10:13 | 显示全部楼层
大家帮帮忙啊,谢谢了!
发表于 2007-9-23 12:22 | 显示全部楼层
你加我QQ:531659007     注明:sensorless
我在一篇辽宁工程大学的硕士论文中看到过这段程序
说实话有几处看不懂
我自己写了一个S函数
现在可以用   有空聊聊
发表于 2007-9-28 16:52 | 显示全部楼层
我也在做这方面的 多交流啊
发表于 2009-5-6 15:10 | 显示全部楼层

回复 楼主 tyler 的帖子

你的问题解决了没有?我最近也在做关于这方面的毕设,在编EKF的程序上出了点问题。但是解决不了。想问问你啊。能不能留下QQ让我加下请教下啊
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-25 05:52 , Processed in 0.089619 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表