这是关于参数辨识的S函数,代码如下:
simulink图及错误提示如下图:
矩阵的维度我确认过几次了找不出问题,求老哥们解答
function [sys,x0,str,ts]
=
pmsmRLSm3(t,x,u,flag)
switch flag
case 0
[sys,x0,str,ts]=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);
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes()
sizes = simsizes;
sizes.NumContStates = 0; % 连续状态个数
sizes.NumDiscStates = 18; % 离散状态的个数
sizes.NumOutputs = 3; % 输出数目
sizes.NumInputs = 7; % 输入数目
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1; % 至少需要的采样时间
sys = simsizes(sizes);
global lm;
lm=0.99;
global Ts;
Ts=5e-5;
theta0=[0,0,0]; %被辨识参数的初值,取充分小的实向量
Pn0=1*eye(3); % 协方差矩阵,取充分大的实数
i0=[0;0;0];i1=[0;0;0];
x0=[theta0';Pn0(:);i0;i1];% 需要更新的状态向量的初值
str=[];ts=[Ts,0]; % 继承输入信号的采样时间
function sys=mdlDerivatives(t,x,u)
sys = [];
function sys=mdlUpdate(t,x,u)
Ld=1.55e-3; Lq=1.55e-3;
% Ld=u(6); Lq=u(7);
I=eye(3);
p=2; %极对数
global lm;
global Ts;
h=[u(1);u(6)-u(2);u(7)-u(3)]'; %采集数据 id,iq,ud,uq,w,Ld,Lq
Pn0=1*eye(3);
K=Pn0.*h/(lm+h'.*Pn0.*h); %计算增益矩阵k
Pn1=(Pn0-K.*h'.*Pn0)/lm; %计算下一个协方差阵
theta0=x(1:3)';
%theta0=[0;0;0]; %从状态变量中分离出theta0
y=u(1);
theta1=theta0+K.*(y-h'.*theta0);
%theta0=theta1;
i0=[u(1);u(2);u(3)];i1=[u(4);u(6);u(7)];
sys=[theta1;Pn1(:);i0;i1];
function sys=mdlOutputs(t,x,u)
sys=x(1:3)';