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=Htheta0(:,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 10:56:49 浏览: 77
这段代码是一个增广最小二乘法系统辨识算法的具体实现代码。整个算法包括以下几个步骤:
1. 载入数据:通过 `sim('work4_26')` 命令载入数据,这些数据包括输入信号 `u_k`、输出信号 `z_k` 和干扰信号 `v_k`。
2. 初始化:定义待估计参数 `a`,并将输入输出数据的大小存储在变量 `n` 中。同时,创建一个大小为 `6x6x2` 的三维数组 `P0` 用于存储待估计参数的协方差矩阵,将其第二个维度赋值为 `10`。定义变量 `e0` 为最大误差,`theta0` 为参数数组,用于存储每一次迭代后参数的估计值,`w0` 为协方差矩阵的初始值。
3. 循环迭代:循环遍历输入输出数据,计算每一次迭代的协方差矩阵 `P0`,利用增广最小二乘法估计参数 `theta0`,并计算误差 `e`。当误差小于预设的最大误差 `e0` 时,跳出循环。
4. 估计输出序列:利用估计的参数 `theta0` 计算估计的输出序列 `Zp`。
5. 绘图:绘制输入信号、真实输出值和估计输出值的图像,以及参数估计过程中参数值的变化情况。
整个算法的核心是增广最小二乘法,通过对输入输出数据的处理,利用增广最小二乘法对系统参数进行估计,并将估计结果与真实输出值进行对比。该算法可以用于多种系统辨识问题,具有较高的准确性和实用性。
阅读全文