随机牛顿法

一、原理

随机牛顿法 - recursive stochastic Newton algorithm ,RSNA
确定性系统的梯度矫正法-计算简单,但Input/Output含有噪声则此方法不适用。
为此,必须研究随机系统的梯度矫正法。
考虑模型:

随机牛顿法_第1张图片

 随机牛顿法_第2张图片

二、程序代码 

%随机递推牛顿参数估计

a=[1 -1.5 0.7]';
b=[1 0.5]';
d=3;%对象参数

na=length(a)-1;nb=length(b)-1;%na、nb为A、B阶次

L=400;%仿真长度
uk=zeros(d+nb,1);%输入初值:uk(i)表示u(k-i)
yk=zeros(na,1);%输出初值
xik=zeros(na,1);%白噪声初值 \xi
etak=zeros(d+nb,1);%白噪声初值 \eta
u=randn(L,1);%输入采用白噪声序列
xi=sqrt(0.1)*randn(L,1);%白噪声序列 \xi
eta=sqrt(0.25)*randn(L,1);%白噪声序列 \eta

theta=[a(2:na+1);b];%对象参数真值
thetae_1=zeros(na+nb+1,1);%参数估计初值
Rk_1=eye(na+nb+1);

for k=1:L
    phi=[-yk;uk(d:d+nb)];
    e(k)=a'*[xi(k);xik]-b'*etak(d:d+nb);
    y(k)=phi'*theta+e(k);%采集输出数据
    
    %随机牛顿算法
    R=Rk_1+(phi*phi'-Rk_1)/k;
    dR=det(R);
    if abs(dR)<10^(-6)%避免矩阵非奇异
        R=eye(na+nb+1);
    end
    IR=inv(R);
    thetae(:,k)=thetae_1+IR*phi*(y(k)-phi'*thetae_1)/k;
    
    %更新数据
    thetae_1=thetae(:,k);
    Rk_1=R;
    
    for i=d+nb:-1:2
        uk(i)=uk(i-1);
        etak(i)=etak(i-1);
    end
    uk(1)=u(k);
    etak(1)=eta(k);
    
    for i=na:-1:2;
        yk(i)=yk(i-1);
        xik(i)=xik(i-1);
    end
    yk(1)=y(k);
    xik(1)=xi(k);
    
end

plot([1:L],thetae);
xlabel('k');
ylabel('参数估计a、b');
legend('a_1','a_2','b_0','b_1');
axis([0 L -2 1.5]);

三、运行结果

参数估计值:

a1=-1.47922682959731
a2=0.693491828871900
b0=0.956854920151644
b1=0.551437466149981

运行曲线:

随机牛顿法_第3张图片

PS:如果需要更精确模型,可以增加仿真时长。

本文参考:系统辨识与自适应控制MATLAB仿真(第三版)庞中华,崔红编著

 

你可能感兴趣的:(算法,人工智能,matlab)