sim('work4_26'); %% 载入数据 a=[1.5 0.7 1 0.5 -1 0.2]'; u=u_k; v=v_k; Z=z_k; n=size(Z); %% 函数 n=size(Z,1); %初始化 P0=zeros(6, 6, 2); % 待估计参数的维度为6,创建一个大小为 6x6x2 的三维数组,并用零填充 P0(:,:,2) = 10 * eye(6); % 将一个大小为 6x6 的单位矩阵乘以 10,并存储在 P 的第二个维度中 e0=0.01; theta0(:,:)=ones(6,n); w0=1; for k=3:n H(k,:)=[-Z(k-1) -Z(k-2) u(k-1) u(k-2) v(k-1) v(k-2)]; P0(:,:,k)=P0(:,:,k-1)-P0(:,:,k-1)*H(k,:)'*inv(inv(w0)+H(k,:)*P0(:,:,k-1)*H(k,:)')*H(k,:)*P0(:,:,k-1); K(:,k)=P0(:,:,k-1)*H(k,:)'*inv(inv(w0)+ H(k,:)*P0(:,:,k-1)*H(k,:)'); theta0(:,k)=theta0(:,k-1)+K(:,k)*(Z(k)-H(k,:)*theta0(:,k-1)); e=max(abs((theta0(:,k)-theta0(:,k-1))\theta0(:,k-1))); if k<n if e<e0 j=k; break end else j=n; end end Zp=H*theta0(:,j);%估计的输出序列 Zm=Z(:,:);%真实输出序列 m=size(theta0,1); %% 绘图 subplot(3,1,1); stem(u); xlabel('k','FontSize',15); title('输入信号u(k)') subplot(3,1,2); plot(Zm,'r-'); hold on plot(Zp,'b--'); xlabel('k','FontSize',15); title('输出信号真实值与估计值对比') legend('真实值','估计值'); subplot(3,1,3); for i=1:m plot(theta0(i,1:j)); hold on; end legend('a1','a2','b1','b2','c1','c2'); title('theta值变换')
时间: 2024-02-29 22:56:50 浏览: 114
这段代码是一个基于增广最小二乘法的系统辨识算法,用于估计一个具有6个参数的线性系统的参数。其中,输入信号为u,输出信号为Z,通过对输入输出数据的处理,利用增广最小二乘法对系统参数进行估计,并将估计结果与真实输出值进行对比。代码中包含了绘图功能,可以直观地展示估计结果与真实值的差异,以及参数估计过程中参数值的变化情况。该算法可以用于多种系统辨识问题,具有较高的准确性和实用性。
阅读全文