⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subid3b.m

📁 剑桥大学用于线性和双线性动力学系统辨识的工具箱
💻 M
📖 第 1 页 / 共 2 页
字号:
%                                                                         %%  [h_{1}   :                          :                               ]  %%  [        : Pi_{S}Y_{u}-T_{2i-1}U_{u}:Pi_{S+Y_{i}}Y_{L}-T_{2i-1}U_{L}]  %%  [h_{2i-1}:                          :                               ]  %%                           [Sigma_{1} 0][Omega^{*}_{1}]                  %%  :=[Gamma_{1} Gamma_{2}]*                               (4.1)           %%                           [0         0][Omega^{*}_{2}]                  %%                                                                         %%                                                                         %% *********************************************************************** %  T2=bloctoep([H1; H2(1:end-p,:)],zeros((2*i-1)*p,m),2*i-1);%  T_{2i-1}=T2%  T2=[h_0,..,0;h_1,h_0,...,0;...;h_2i-2,...,h_0]UU=UUU(i*m+1:(3*i-1)*m,:);UL=UUU((i+1)*m+1:3*i*m,:);  YU=YYY(i*p+1:(3*i-1)*p,:);YL=YYY((i+1)*p+1:3*i*p,:);PSYU1=orthproj(YU,S)-T2*UU; clear UU YUUI=UUU(i*m+1:(i+1)*m,:);YI=YYY(i*p+1:(i+1)*p,:);SYI=[S;YI];PSYU2=orthproj(YL,SYI)-T2*UL; clear UL YLif strcmpi(method,'mp')  H=zeros((2*i-1)*p,m);  H=[H1(p+1:end,:);H2];  % H=[h_1;h_2;...;h_2i-1]   [GAMMA,SIGMA,OMEGA]=svd([H PSYU1 PSYU2]);else  [GAMMA,SIGMA,OMEGA]=svd([PSYU1 PSYU2]);endclear PSYU1 PSYU2% Select model ordern = orderselect(n,SIGMA);if i <= n  warning('Block size k <= n. The estimated model might be poor.')end try  SIGMA1=SIGMA(1:n,1:n); clear SIGMAcatch  error('The block size is incompatible with this choice of order.')endGAMMA1=GAMMA(:,1:n); clear GAMMA%GAMMA2=GAMMA(:,(n+1):(2*i-1)*p);OMEGA=OMEGA';OMEGA1=OMEGA(1:n,:); clear OMEGA%if method is 'si' or 'ss', then OMEGA2=OMEGA(:,(n+1):2*jj);%else if method is 'mp', then OMEGA2=OMEGA(:,(n+1):2*jj+m);switch method  case {'si'}   % ************************************************************ %   %                                                              %   %                STEP 5                                        %   %                                                              %   %  O_{2i-1}=Gamma1*Sigma1^{1/2}                                %   %                                                              %   %  [Pi_{S}X_{k} : Pi_{S+Y_{k}}X_{k+1}]=Sigma1^{1/2}Omega1'     %   %                                                              %   % ************************************************************ %      O2=GAMMA1*SIGMA1^0.5;  %  O2=O_{2i-1}   SIGOM=SIGMA1^0.5*OMEGA1;   XKHAT=SIGOM(:,1:jj);  % hat(x_k)   XKKHAT=SIGOM(:,jj+1:2*jj); % hat(x_{k+1})      % ********************************************************* %   %                                                           %   %               STEP 6                                      %   %                                                           %   %   Determine A and C from O_{2i-1} by using the shift      %   %                                                           %   %   invariance property.                                    %   %                                                           %   %********************************************************** %      C=O2(1:p,:);   %A=pinv(O2(1:2*(i-1)*p,:))*O2((p+1):(2*i-1)*p,:);   A=O2(1:2*(i-1)*p,:)\O2((p+1):(2*i-1)*p,:);      % ************************************************************ %   %                                                              %   %               STEP 7                                         %   %                                                              %   %  Reconstruct O_2i.  Solve for B and D from                   %   %                                                              %    %           ||      [YF]                              [UF] ||  %    % B,D=argmin||Pi_{S}    -O_{2i}Pi_{S}X_{k}-T_{2i}(B,D)     ||  %   %      B,D  ||      [YR]                              [UR] ||F %    %                                                              %   %            [D]                                               %   %     BB*VEC(   )=VEC(AA)                             (7.1)    %   %            [B]                                               %   % ************************************************************ %      YFR=[YF;YR];   %AA =orthproj(YFR,S)-obmat(A,C,2*i)*orthproj(XKHAT,S);   AA=orthproj(YFR,S)-obmat(A,C,2*i)*XKHAT; % Should give same result   BB=sumkromat(A,C,UUU,i);   if isDzero	 kk = 0;	 ll = 0;	 BBB = zeros(size(BB,1),n*m);	 %BBB = [];	 for jj = 1:m	   for j = 1:p		 kk = kk+1;	   end	   for j = 1:n		 kk = kk+1;		 ll = ll+1;		 BBB(:,ll) = BB(:,kk);		 %BBB = [BBB BB(:,kk)];	   end	 end	 clear kk ll	 B=BBB\AA(:); clear BBB	 B=reshape(B,n,m);	 D=zeros(p,m);   else	 DB=BB\AA(:);	 DB=reshape(DB,p+n,m);	 D=DB(1:p,:);	 B=DB(p+1:p+n,:);	 clear DB   end   clear AA BB     case {'ss'}    % ************************************************************ %  %                                                              %  %                STEP 5                                        %  %                                                              %  %  Determine XKHAT and XKKHAT                                  %  %                                                              %  %  [ Pi_{S}X_{k} : Pi_{S+Y_{k}}X_{k+1}]=Sigma1^{1/2}Omega1'    %  %                                                              %  % ************************************************************ %    SIGOM =SIGMA1^0.5*OMEGA1;   XKHAT =SIGOM(:,1:jj);  % hat(x_k)  XKKHAT=SIGOM(:,jj+1:2*jj); % hat(x_k+1)    % ************************************************************ %  %                                                              %  %               STEP 6                                         %  %                                                              %  %  Determine A,B,C and D  from                                 %  %                                                              %   %                    || [XKKHAT]    [A B] [XKHAT] ||           %   %  A,B,C,D = argmin  ||           -               ||           %  %           A,B,C,D  ||   [YI]      [C D]   [UI]  ||F          %   %                                                              %  %                                                              %  % ************************************************************ %  AB = XKKHAT/[XKHAT;UI];   A = AB(1:n,1:n);  B = AB(1:n,n+1:n+m);  clear AB  if ~isDzero	CD = YI/[XKHAT;UI];	C = CD(1:p,1:n);	D = CD(1:p,n+1:n+m);	clear CD  else	C = YI/XKHAT;	D = zeros(p,m);  end   case {'mp'}  % ************************************************************ %  %                                                              %  %                STEP 5                                        %  %                                                              %  %  D=h_{0}, O_{2i-1}=Gamma1*Sigma1^{1/2}                       %  %                                                              %  %  [B : Pi_{S}X_{k} : Pi_{S+Y_{k}}X_{k+1}]=Sigma1^{1/2}Omega1' %  %                                                              %  % ************************************************************ %    D=H1(1:p,:); %  D=h_0  O2=GAMMA1*SIGMA1^0.5; %  O2=O_{2i-1}    SVDM=SIGMA1^0.5*OMEGA1; % The matrix to be separated  B=SVDM(:,1:m);  XKHAT=SVDM(:,m+1:jj+m);  % hat(x_k)  XKKHAT=SVDM(:,m+jj+1:m+2*jj); % hat(x_k+1)  % ********************************************************* %  %                                                           %  %               STEP 6                                      %  %                                                           %  %   Determine A and C from O_{2i-1} by using the shift      %  %                                                           %  %   property.                                               %  %                                                           %  %********************************************************** %    C=O2(1:p,:);  %A=pinv(O2(1:2*(i-1)*p,:))*O2((p+1):(2*i-1)*p,:);  A=O2(1:2*(i-1)*p,:)\O2((p+1):(2*i-1)*p,:);  endclear OMEGA1 % ***************************************************** %%                                                       %%               PENULTIMATE STEP                        %%                                                       %%  Determine the noise covariance matrix                %%                                                       %%  [Epsilon_w]=[proj(SYI,X_{i+1})]-[A B][ proj(S,XK)]   %%  [Epsilon_v]=[        YI       ]-[C D][  UI       ]   %%                                                       % % ***************************************************** %EPSILONW=XKKHAT-A*XKHAT-B*UI;EPSILONV=YI-C*XKHAT-D*UI;RES=[EPSILONW;EPSILONV];COV=cov(RES');% ***************************************************************** %%                                                                   %%              FINAL STEP                                           %%                                                                   %%  Determine Kalman filter gain K                                   %%                                                                   %%  Determine error covariance P                                     %%                                                                   %%  SIGMA^{S}=A*SIGMA^{S}*A^{*}+SIGMA^{W}                            %%                                                                   %%  G=A*SIGMA^{S}*C^{*}+SIGMA^{WV}                                   %%                                                                   %%  LAMBDA_{0}=C*SIGMA^{S}*C^{*}+SIGMA^{V}                           %%                                                                   %%  K=(G+APC^{*})(LAMBDA_{0}+CPC^{*})^{-1}                           %%                                                                   %%  P=APA^{*}-(G+APC^{*})(LAMBDA_{0}+CPC^{*})^{-1}(G+APC^{*})^{*}    %%                                                                   % % ***************************************************************** %SIGMAW=COV(1:n,1:n);SIGMAV=COV(n+1:n+p,n+1:n+p);SIGMAWV=COV(1:n,n+1:n+p);SIGMAS=dlyap(A,SIGMAW); % Requires Control System ToolboxG=A*SIGMAS*C'+SIGMAWV;LAMBDA0=C*SIGMAS*C'+SIGMAV;[P,L,K,RR]=dare(A',C',zeros(n,n),LAMBDA0,G,eye(n)); % Requires Control System ToolboxK=K';if nargout > 2  SV = diag(SIGMA1(1:n,1:n));  %SV=zeros(n,1);  %for j=1:n  %  SV(j)=SIGMA1(j,j);  %endend  %M = idss(A,B,C,D,K,zeros(size(A,1),1),Ts);%[E,X0] = pe(M,data);X0 = zeros(size(A,1),1);M = idss(A,B,C,D,K,X0,Ts,'OutputName',data.OutputName,'OutputUnit',data.OutputUnit,'InputName',data.InputName,'InputUnit',data.InputUnit,'TimeUnit',data.TimeUnit);if isDzero  M.nk = ones(1,m);endM.EstimationInfo.Status='estimated';switch method case {'si'}  M.EstimationInfo.Method='SUBID3B - Shift invariance approach'; case {'ss'}  M.EstimationInfo.Method='SUBID3B - State sequence approach'; case {'mp'}  M.EstimationInfo.Method='SUBID3B - Markov parameter approach';endM.EstimationInfo.DataName=data.Name;M.EstimationInfo.DataLength=cy;M.EstimationInfo.DataTs=data.Ts;M.EstimationInfo.DataInterSample=data.InterSample;%M.EstimationInfo.LossFcn=0;%M.EstimationInfo.FPE=0;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                                                           %%                                  END ALGORITHM                            %%                                                                           %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% *** last line of subid3b.m ***

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -