gusucode.com > ​​系统辨识中的各种辨识算法matlab源码程序 > code/elsident.m

    %增广最小二乘法
%di'=[-y(i),-y(i+1),...,-y(i+n-1),u(i),...u(i+n-1),e(i),...,e(i+n-1)]
%系数向量o'=[an,...a1,bn,...b1,cn,...,c1]


%打开数据
%load('c:\\MATLAB701\\work\\data.mat');   %打开数据
data;
%标量的输入
fprintf(1,'\n');%换行
n=input('input the system order of n :');  %变量数为2n

O1=zeros(3*n,1);       %系数向量,下标1表示为迭代的第k次
P1=1000*eye(3*n);      
N=200-n;           %可用数据总数
e1=zeros(n,1);     %初始残差数据0

j=0;               %计算残差平方和,舍去前2*n项                   
for i=1:N
u1=u(i:n+i-1);
%y1=y(1:2*n)
y1=-y(i:n+i-1);
d1=[y1;u1;e1];           %测量数据
e=y(n+i)-d1'*O1;         %预测偏差
K=P1*d1/(d1'*P1*d1+1);   %增益向量
O2=O1+K*e;               %系数向量
   %P2=(1-K*d1')*P1;   %递推矩阵,这个语句导致严重错误,不是1而是单位阵
                      %P2很快就不再是方阵,但不会提示错误 
P2=(eye(3*n)-K*d1')*P1;
%P2=P1-K*d1'*P1; 
O1=O2;
P1=P2;
e1=[e1(2:n);e];
if i>2*n
    j=j+e^2;
end
end
O1
j