MATLABで忘却係数付き逐次最小二乗法を実装する

忘却係数付き逐次最小二乗法の更新則は

\begin{align}
\hat{\theta}_{N} &= \hat{\theta}_{N-1} + \dfrac{P_{N-1} z_{N} }{\rho + z_{N}^{T} P_{N-1} z_{N}} \left ( y_{N} – z_{i}^{T} \hat{\theta}_{N-1} \right) \\[1.5ex]
P_{N} &= \frac{1}{\rho} \left ( P_{N-1} – \dfrac{P_{N-1} z_{N} z_{N}^{T} P_{N-1}}{\rho + z_{N}^{T} P_{N-1} z_{N}} \right)
\end{align}

であるのでこれを実装すると次のようになる。

function [theta, Pn, Rn] = rls(theta_,Pn_,Rn_,Yn ,Zn)
Rn=Rn_;

Num = Rn_+Zn'*Pn_*Zn;
Pn = 1/Rn_*(( Pn_ - (Pn_ * Zn * (Zn)' * Pn_) /Num) );
Ln = (Pn_*Zn) /Num;
En = Yn - Zn' * theta_;

theta = theta_ + Ln * En;

end

あとはいい感じに実装すれば動く。

for i = 3:1:100
    x(i) = - a1 * x(i-1) - a2 * x(i-2) + b1 * r(i-1) + b2 * r(i-2);
    y(i) = x(i) + v(i);
    
    Zn = [-y(i-1)  -y(i-2)  r(i-1)  r(i-2)]';
    Yn = y(i);
    
    [Theta,Pn] = rls(Theta, Pn, 0.95, Yn, Zn);
     result(i,:) = Theta' ;
end

コメント

タイトルとURLをコピーしました