image thumbnail

Rekursive Erweiterte Fehlerquadrate-Identifikationsmethode

by

 

Die Rekursive Erweiterte Fehlerquadrate-Identifikationsmethode dient zur Systemparameterschaetzung.

rels_systemidentification(y,u,na,nb)
function rels_systemidentification(y,u,na,nb)
%--------------------------------------------------------------------------
%          Rekursive Erweiterte Fehlerquadrate-Identifikationsmethode                                                                                    %
%--------------------------------------------------------------------------

% -------------------------------------------------------------------------
%Prozessdifferenzengleichung:
% y(k)+a(1)*y(k-1)+...+a(na)*y(k-na) = b(0)*u(k)+b(1)*u(k-1)+b(nb)*u(k-nb)+e(k)
%
%   u: Eingang
%   y: Ausgang
%   na: Nullstellen-Anzahl
%   nb: Pole-Anzahl=Ordnung des Prozesses
%   
%   yest: Gescheatzter Ausgang
%   rela_fehler: Relativer Gleichungsfehler 
%   a = [a0 a1 ... ana]: Koeffizientenvektor vom Eingangssignal 
%   b = [b0 b1 ... bnb]: Koeffizientenvektor vom Ausgangsignal
%--------------------------------------------------------------------------

if nargin<1,   y=y;  end
if nargin<2,   u=u;   end
if nargin<3,   na=8;  end
if nargin<4,   nb=8;  end
if na<1,       na=8;  end
if nb<1,       nb=8;  end

N=1e3;
lamda0=0.1;
lamda= random('Normal',0,1,1,N);
% lamda= random('uniform',0,1,length(lamda),N);
% lamda=firls(N-1,[0 .4 .5 1],[1 1 0 0],[1 10]);

% for k=1:length(lamda),
%     lamda(k) = lamda(1)*lamda(k)+lamda(length(lamda))* (1-lamda(1));
% end;

n=na+nb;
delta = 1e3;
theta0=zeros(n);  % initialisierung von theta
P0=delta.*eye(n); %initialisierung von P
eps=zeros(n);

py=zeros(na);
pu=zeros(nb);
ymat=[y zeros(8,8);zeros(8,8) y]';

for i=n-1:-1:n-na
if i>0,
    py(n-i)=-y(i);
end
end
for i=n-1:-1:n-nb
if i>0, 
    pu(n-i)=u(i); 
end
end

phi = [py zeros(nb);zeros(na) pu];

for j=1:length(P0),
    
lamda=lamda0*lamda+1-lamda0;
x_vals=[lamda; lamda]; y_vals=[zeros(1,length(lamda)); lamda];

P =1/lamda(j)*P0*[eye(n) - P0*phi*phi'*[abs(lamda(j))+ phi'*P0*phi]^-1];
eps = [y  zeros(na);zeros(na) zeros(na)]- theta0'*phi;   
theta=theta0 + P*phi*eps;
theta0=theta;
yest=theta0'*phi;
P0=P;
end

figure,
stem(x_vals,y_vals,'fill','--');

if (P<1 | P>1e3), error('P soll passend sein');end
if (P<0 | P>100), disp ('Wahrnung:P ist im normalen Fall groesser als 1 und kleiner als unendlich');end

nu=length(u);
nmax=max(na,nb);
a1= [1; theta(1:na)'];
b1 = theta(na+1:n)';
% e1=filter(a1,1,y)-filter(b1,1,u);
% V1=(e1'*e1)/(nu-nmax);
% FPE1=V1*(1+n/nu)/(1-n/nu);
% rela_fehler = sqrt((e1'*e1)./(y'*y));

% for i=1:nmax e1(i)=0; end;    
disp('b1 Koeffizienten')
disp(b1)
disp('a1 Koeffizienten')
disp(a1)
% disp(['relativer Gleichungsfehler = ', num2str(100*rela_fehler),' %']);

% nullstell=roots(a1); % nullstelen von a1(1/z)
% 
% if all(abs(nullstell)<1)
%         sprintf('Das Prozess ist kausal')
% else
%         sprintf('Das Prozess ist nicht kausal')
% end


figure,
plot(y)
title('Systemausgang ') ;
xlabel('Abtastzeiten')
ylabel('echtes Ausgangsignal');
figure,
plot(yest,'r')
title('Schaetzerausgang') ;
xlabel('Abtastzeiten')
ylabel('geschaetztes Ausgangsignal');
figure,
semilogy((abs(eps))) ;
title('Gleichungsfehler') ;
xlabel('Abtastzeiten');
ylabel('Epsilon-Werte');
figure,
plot(theta)
title('Konvergenz de geschaetzten Koeffizienten') ;
xlabel('Abtastzeiten');
ylabel('Koeffizientenverlauf');
% axis([1  length(y)-500  min(min(theta)) max(max(theta)) ]);

end

Contact us