function [R]=havobo(siz,opa)
%HAVOBO   Hilfsfile fuer casbod.m
%         [R]=havobo(siz,opa)
% Vorbereitung fuer BOD-Optimierung ausgehend von Strecke im Z-Bereich (siz)
% und ausgewaehlter Optimierungsart (opa) durch Berechnung der Rx-Koeffizienten:
%
% R=[R2F R2L0 R2L1 ... R2LD R2Q0 ... R2QD R2ZL R2ZP;
%     .                 .    .        .   R4ZL R4ZP;
%     .                 .   RAQ0 ... RAQD  0    0  ;
%    RAF  .    .   ... RALD  0   ...  0    0    0  ;]
%
% Es werden nur die entsprechend "opa" tatsaechlich benoetigten
% Zeilen und Spalten von "r" berechnet.
%
% siz = [Vz N n1 ... nN;         opa = [fos kon D I gon]
%        k  M m1 ... mM]
% M  : steht bei Kompensation fuer M-quer
% fos: fuehrungs- (0) oder stoeroptimal (1)
% kon: Kompensation (1) oder nicht (0)
% D  : Ordnung des mit "R" zu berechnenden Reglerzaehler(anteil)s
% I  : Reglerintegralanteil (1) oder nicht (0)
% gon: gedaempfter D-Anteil (1) oder nicht (0)
%      -nur fuer Sonderfall D=0 und Fuehrungsoptimierung (z.Z.)

% SCHLUESSELWOERTER: Hilfsfile

% Vorraussetzung ist das Vorhandensein des m- Files havaib.m

% Copyright (c) 1994 Hagen Jahn
%                    TU Dresden; Elektrotechnisches Institut
%                    Mommsenstr. 13; D-01062 Dresden; Germany

% Es werden folgende allgemeine Parameter definiert:
alf=-opa(4); M=siz(2,2); D=opa(3);

% Die Werte RAF werden fuer jede Variante benoetigt:
maxi=M+1; mini=-1; Kz=D; Ks=maxi; zei=2;
[m,K]=havaib(maxi,mini,zei,siz,Kz,Ks);
for x=1:(D+1+opa(5))
  R(x,1)=0;
  for i=x:(M+1)
    var=0;
    for j=(0+1-mini):((M-i+1)+1-mini)
      var=(alf*m(j-1)+m(j))*(alf*m(j+i-1)+m(j+i))+var;
    end
    R(x,1)=K(x,i)*var+R(x,1);
  end
end
% Die Werte RAL werden fuer jede Variante benoetigt."D" und "opa(5)"
% entscheiden ueber die Anzahl.
k=siz(2,1); N=siz(1,2); siz(1,2)=1; I=max((N+k),(M+1-k));
maxi=N+k+I+(2*D); mini=k-I-1; Kz=D+1; Ks=I+D; if mini>0 mini=0; end
[m,K]=havaib(maxi,mini,zei,siz,Kz,Ks);
for l=0:D
  for x=1:(D+1+opa(5))
    R(x,l+2)=0;
    for i=x:(I+l)
      var=0;
      for j=(k+1-mini):((N+k)+1-mini)
        o=j-1+mini;
        var=siz(1,2+o-k)*(m(j-i+l)+(alf*m(j-i+l-1))+m(j+i+l)+...
						(alf*m(j+i+l-1)))+var;
      end
      R(x,l+2)=K(x,i)*var+R(x,l+2);
    end
  end
end
siz(1,2)=N;
if opa(1)==1
% Die Werte RAQl werden nur fuer Stoeroptimierung benoetigt
maxi=N+D; mini=-D; zei=1; Ks=maxi;
[n,K]=havaib(maxi,mini,zei,siz,Kz,Ks);
for l=0:D
  for x=1:(D+1)
    R(x,3+D+l)=0;
    for i=x:(N+l)
      var=0;
      for j=(0+1-mini):((N-i+l)+1-mini)
        var=(n(j)*n(j+i-l))+(n(j-l)*n(j+i))+var;
      end
      R(x,3+D+l)=K(x,i)*var+R(x,3+D+l);
    end
  end
end
elseif opa(5)==1
% Werte RAZL und RAZP werden nur fuer verzoegerten D-Anteil benoetigt
maxi=2*M+4; mini=-(M+2); zei=2; Kz=2; Ks=maxi/2;
[m,K]=havaib(maxi,mini,zei,siz,Kz,Ks);
for x=1:2
  R(x,3+D)=0;
  for i=x:(M+2)
    var=0;
    for j=(1+1-mini):((M+2)+1-mini)
    var=(alf*m(j-2)+m(j-1))*(m(j-i)+(alf*m(j-i-1))+m(j+i)+...
						  (alf*m(j+i-1)))+var;
    end
    R(x,3+D)=K(x,i)*var+R(x,3+D);
  end
end
I=max((N+k-1),(M+2-k)); siz(1,2)=1;
maxi=N+k+I-1; mini=k-I-2; Ks=I; if mini>0 mini=0; end
[m,K]=havaib(maxi,mini,zei,siz,Kz,Ks);
for x=1:2
  R(x,4+D)=0;
  for i=x:I
    var=0;
    for j=(k+1-mini):((N+k)+1-mini)
      o=j-1+mini;
      var=siz(1,2+o-k)*(m(j-i-1)+(alf*m(j-i-2))+m(j+i-1)+...
						  (alf*m(j+i-2)))+var;
    end
    R(x,4+D)=K(x,i)*var+R(x,4+D);
    end
end
siz(1,2)=N;
end
