You are on page 1of 7

系统建模作业

专 业: 电子信息

姓 名: 薛润

学 号: 20721894

成 绩:
考虑如下模型
z(k)-1.5z(k-1)+0.7z(k-2)=u(k-1)+0.5u(k-2)+v(k)
其中 v(k)是均值为 0,方差为 1 的白噪声。根据模型生成数据,采用递推最
小二乘法对模型参数进行辨识,要求绘出各参数随时间的变化曲线。

解:仿真程序如下:

% 产生 M 序列

function [Out]=M_Seq_Gen(m,plength,A)

%plength=4;length=15; %M 序列周期=2^plength-1 ,%置 M 序列总长度和级数 ,


a 是幅度

for n=1:plength %移位寄存器输入 X(i)初 T 态(1111)

X(n)=1;

end

for i=1:m

for j=plength:-1:2

X(j)=X(j-1);

end

X(1)=xor(X(plength-1),X(plength)); %异或运算

if X(plength)==0

Out(i)=-1;

else

Out(i)=X(plength);
end

end

%save ('mdata','Out');

%绘图

%i1=i;

k=1:1:m;

plot(k,Out,'g',k,Out,'g')

xlabel('k')

ylabel('M 序列')

title('移位寄存器产生的 M 序列')

end

% RLS

L=480;A=1;%数据长度 L=480,幅值为 1

u1=M_Seq_Gen(L,4,A);%形成 1 个数据长度为 480,幅值为 1 的 4 阶 M 序列

f=zeros(1,480);

f(1)=1;

for i=2:479

f(i+1)=f(i-1);%形成 1 个数据长度为 480,幅值为 1 的方波序列


end

u=xor(u1,f);%形成 1 个数据长度为 480,幅值为 1 的 4 阶逆 M 序列

% plot(u,'r')

v = wgn(1,L,2); %产生高斯白噪声

z=zeros(0,16);

z(1)=0;z(2)=0;%取 z 的前两个初值为 0

for k=3:L

z(k)=1.5*z(k-1)-0.7*z(k-2)+u(k-1)+0.5*u(k-2)+v(k);

end

c0=[0.001 0.001 0.001 0.001]';%直接给出被辨识参数的初始值,即一个充分小的实


向量

p0=10^6*eye(4,4);%直接给出初始状态 P0,即一个充分大的实数单位矩阵

E=0.000000005;%相对误差的初始值大小

c=[c0,zeros(4,L-1)];%被辨识参数矩阵的初始值及大小

e=zeros(4,L);%相对误差的初始值及大小

for k=3:L;

h1=[-z(k-1),-z(k-2),u(k-1),u(k-2)]';

x=h1'*p0*h1+1;

x1=inv(x);

k1=p0*h1*x1;%计算 K(k);
d1=z(k)-h1'*c0;

c1=c0+k1*d1;%计算辨识参数 C(k);

e1=c1-c0;

e2=e1./c0;

e(:,k)=e2;

c0=c1;

c(:,k)=c1;

p1=p0-k1*k1'*[h1'*p0*h1+1];%计算 P(k)

p0=p1;

end

c;e;

a1=c(1,:);a2=c(2,:);b1=c(3,:);b2=c(4,:);ea1=e(1,:);ea2=e(2,:);eb1=e(3,:);eb2=e(4,:);

figure(1);

i=1:L;

plot(i,a1,'r',i,a2,':',i,b1,'g',i,b2,':')

legend('参数 a1 的过渡过程','参数 a2 的过渡过程','参数 b1 的过渡过程','参数 b2


的过渡过程');

title('递推最小二乘法的参数变化')

figure(2);

i=1:L;
plot(i,ea1,'r',i,ea2,'g',i,eb1,'b',i,eb2,'r:')

legend('参数 a1 的识别精度','参数 a2 的识别精度','参数 b1 的识别精度','参数 b2


的识别精度');

title('识别精度')

a1=c(1,480);a2=c(2,480);b1=c(3,480);b2=c(4,480);%从中分离并显示 a1,b1,a2,b2

fprintf(' a1=%f\n',a1);

fprintf(' a2=%f\n',a2);

fprintf(' b1=%f\n',b1);

fprintf(' b2=%f\n',b2);

仿真结果如下:

You might also like