plot(freq2,abs(X2(1:21)),'k-');
时间: 2024-04-20 18:27:29 浏览: 14
这也是一个MATLAB代码,用于绘制频谱图。其中,freq2是横坐标,表示频率;X2是纵坐标,表示频率对应的幅值。abs函数用于将复数的幅角转换为实数的幅值,X2(1:21)表示取X2的前21个元素。'k-'表示绘制黑色实线。不过需要注意的是,如果freq2是从0到fs/2的等间隔数列,那么长度应该是22才对应着fs/2这个点。
相关问题
clc clear close all m=6; u=idinput(2^m-1,'prbs')'; v=normrnd(0,sqrt(0.1),1,2^m); z=zeros(1,2^m); P=100*eye(4);%Pm=inv(Hm'*Hm) theta(:,1)=zeros(4,1); theta(:,2)=zeros(4,1); for k=3:2^m z(k)= -1.5*z(k-1)-0.7*z(k-2)+u(k-1)+0.5*u(k-2)+v(k); h=[-z(k-1) -z(k-2) u(k-1) u(k-2)]; K=P*h'*inv(1+h*P*h'); theta(:,k)=theta(:,k-1)+K*(z(k)-h*theta(:,k-1)); e1(:,k-1)=(theta(:,k)-theta(:,k-1))./theta(:,k-1); e(:,k-1)=abs(e1(:,k-1)); if max(e(:,k-1))<0.000001 break end P=P-P*h'*inv(1+h*P*h')*h*P; end %% figure(1); plot(theta(1,:),'r','LineWidth',1.2); hold on; plot(theta(2,:),'k','LineWidth',1.2); hold on; plot(theta(3,:),'g','LineWidth',1.2); hold on; plot(theta(4,:),'b','LineWidth',1.2); hold on; grid on; legend('a1','a2','b1','b2'); title('递推最小二乘参数辨识'); figure(2); plot(e1(1,:),'r','LineWidth',1.2); hold on; plot(e1(2,:),'k','LineWidth',1.2); hold on; plot(e1(3,:),'g','LineWidth',1.2); hold on; plot(e1(4,:),'b','LineWidth',1.2); hold on; grid on; title('辨识精度'); legend('a1','a2','b1','b2');请分析这段代码
这段代码实现了一个递推最小二乘参数辨识算法,用于识别一个线性的、时不变的、四个参数的系统。具体来说,代码的主要过程如下:
1. 生成一个长度为 $2^m-1$ 的伪随机二进制序列 $u$,用于作为输入信号。
2. 生成一个方差为 $0.1$ 的高斯白噪声序列 $v$,用于模拟系统的测量噪声。
3. 初始化参数向量 $\theta$ 和协方差矩阵 $P$。其中,$\theta$ 包含了系统的四个参数,$P$ 是一个 $4\times 4$ 的单位矩阵。
4. 从第三个采样点开始,根据递推式 $z(k)= -1.5z(k-1)-0.7z(k-2)+u(k-1)+0.5u(k-2)+v(k)$ 计算系统的响应输出 $z(k)$。
5. 构造当前时刻的输入-输出向量 $h$,并计算卡尔曼增益 $K=P\cdot h'/(1+h\cdot P\cdot h')$。
6. 根据卡尔曼增益,更新参数向量 $\theta$。
7. 计算当前时刻的相对误差 $\epsilon=(\theta(k)-\theta(k-1))/\theta(k-1)$。
8. 判断相对误差是否满足精度要求(这里的要求是每个参数的相对误差小于 $10^{-6}$),如果满足,则跳出循环。
9. 根据卡尔曼增益,更新协方差矩阵 $P$。
10. 重复步骤 4-9,直到精度要求被满足或者达到迭代次数。
最后,代码使用两个图像展示了参数向量的估计结果和相对误差随时间的变化。
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值变换')
这段代码是一个增广最小二乘法系统辨识算法的具体实现代码。整个算法包括以下几个步骤:
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. 绘图:绘制输入信号、真实输出值和估计输出值的图像,以及参数估计过程中参数值的变化情况。
整个算法的核心是增广最小二乘法,通过对输入输出数据的处理,利用增广最小二乘法对系统参数进行估计,并将估计结果与真实输出值进行对比。该算法可以用于多种系统辨识问题,具有较高的准确性和实用性。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)