Matlab最小二乘系統辨識

原理還是比較簡單的,不贅述,程序裏面的註釋也寫的比較清楚了

%仿真對象:y(k)-1.5y(k-1)+0.7y(k-2)=v(k)+u(k)-0.8u(k-1)
%辨識模型:y(k)+a1 y(k-1)+a2 y(k-2)=v(k)+b1 u(k)+b2 u(k-1)
%數據長度取n=20000,加權矩陣爲I,v(k)是服從正態分佈的白噪聲N(0,1),u(k)=sin(k)
%待估計參數K=[a1 a2 a3 a4]';準則函數J(K)=(Yn-HnK)'(Yn-HnK);
%將辨識模型寫爲:y(k)=v(k)+a1 y(k-1)+a2 y(k-2)+b1 u(k)+b2 u(k-1)
%                    =v(k)+KHn
%Hn=|y(2) y(1)|
%   |y(3) y(2)|
%   |.........|
clear
close all
data_length=20002;
%% 產生白噪聲和輸入
v=randn(1,data_length);
v=v./max(v);
u=zeros(1,data_length);
for k=1:data_length
    u(k)=sin(k);
end
%% 獲得觀測值
y=zeros(1,data_length);
for k=3:data_length
    y(k)=1.5*y(k-1)-0.7*y(k-2)+v(k)+u(k)-0.8*u(k-1);
end
%% 構造Hn和Y矩陣
Hn=zeros(data_length-2,2);
count=1;
for k=1:10000
    Hn(k,2)=y(count);
  
    count=count+1;
    Hn(k,1)=y(count);
    Hn(k,4)=u(count);
    Hn(k,3)=u(count+1);
end
%% 求解參數
Y=y(3:data_length)';
c1=Hn'*Hn;
c2=inv(c1);
c3=Hn'*Y;   
K=c2*c3

%% 將辨識得到的參數代入,得估計輸出
y_e=zeros(1,data_length);
for k=3:data_length
    y_e(k)=K(1)*y_e(k-1)+K(2)*y_e(k-2)+v(k)+K(3)*u(k)+K(4)*u(k-1);
end

%% 畫出實際輸出和辨識輸出,進行對比
plot((1:data_length),y');title('實際輸出')
hold on
plot((1:data_length),y_e');title('辨識輸出')
figure
subplot(2,1,1)
plot((1:data_length),y');title('實際輸出')
subplot(2,1,2)
plot((1:data_length),y_e');title('辨識輸出')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章