function erg=bran_au(T,Tei,TM,TF,TL)
%BRAN_AU  Zustandsregelstruktur 1; 3 Koeff.; automatisiert; hier nur Strecke
%         erg=bran_au(T,Tei,TM,TF,TL) - Einsatz des Digitalen Betragsoptimums
% (BOD) zur Berechnung der Koeffizienten einer digitalen Zustandsregelstruktur
% fuer ein Beispiel nach Brandenburg at 35(1987)7, S. 275/83, dort: Tei=4;
% TM=30; TF=5; und TL=30;60;120  **** automatisierte Berechnung ****
%      T:	Abtastzeit der digitalen Regelung        	     in ms
%      Tei:	Restzeitkonstante  (Verzoegerungsglied fuer Ggstrom) in ms
%      TM:	Motorzeitkonstante (Integrator) 		     in ms
%      TF:	Federzeitkonstante (Integrator)			     in ms
%      TL:	Lastzeitkonstante  (Integrator)			     in ms
%      erg:	[Kdelta Km Kn]

% SCHLUESSELWORTE: Digitales Betragsoptimum, Zustandsregelstruktur,
%                  elastisches Antriebssystem, Fuehrungsoptimierung,
%                  Stoeroptimierung

%  ***** Voraussetzungen: Vorhandensein von bran_aug, minreal1 ****
%  Copyright (c) 1998 Dr. Gert-Helge Geitner; TU Dresden, Fak. ET,
%                     Elektrotechnisches Institut (ETI); Mommsenstr. 13;
%                     D-01062 Dresden, Germany;
%                     Tel./Fax (0351)-463-2917/7280
%                     e-mail: geitner@eti.et.tu-dresden.de
%  Literatur zum Digitalen Betragsoptimum: Geitner, G.-H.:
%                     Entwurf digitaler Regler fuer elektrische Antriebe.
%                     VDE-Verlag GmbH Berlin und Offenbach 1995

if nargin~=5 error('Falsche Eingangsargumenteanzahl'), end
S=[1 1 1];	% S=[Kdelta Km Kn] **** Schalter fuer Wichtungsfaktoren
RFV=[1 2 3];	% RFV=[1 2 3]	   **** Reihenfolgevektor von [Kdelta Km Kn]
   if sum(RFV)~=6 error('Reihenfolgevektor falsch'), end
BM=[2 1 3; 1 1 0; 0 1 0];  % **** SPALTE - Berechnungsanzahl pro fsolve-Ruf
BRF=1;			   % **** Auswahl einer Spalte von BM
% Definition von Zaehlern und Nennern aller Bloecke
  n001=1;                          d001=[Tei 1];
  n002=1;                          d002=[TM 0];
  n003=1;                          d003=1;
  n004=1;                          d004=[TF 0];
  n005=1;                          d005=[TL 0];
% Angabe der Blockanzahl und Bildung eines unverbundenen diagonalen
% Zustandsmodelles des Systems aus den vorherigen Zaehler- und Nenner-
% Bloecken:
%nblocks=5;
%blkbuild;      % Wegem Globalvariablenzugriff nur in script-files!!!
% Unverbundenes Diagonalsystem erzeugen
[a,b,c,d]=tf2ss(n001,d001);  s0n=abs('n000'); s0d=abs('d000');
for t=2:5  HUS=fix(t/100); ZEV=fix(t/10); sk=[0 HUS ZEV-HUS*10 t-ZEV*10];
           s1=char(s0n+sk); s2=char(s0d+sk);
           [at,bt,ct,dt]=tf2ss(eval(s1),eval(s2));
           [a,b,c,d]=append(a,b,c,d,at,bt,ct,dt);
end;       %  !!!Algorithmus so fuer drei ASCII-Stellen (0...9)!!!
% Angabe der Verbindungen zwischen den Bloecken:
Q=[ 1  0  0
    2  1 -4
    3  2 -5
    4  3  0
    5  4  0];    in =[1];  ou=[3 4 2 5];
[ac,bc,cc,dc]=connect(a,b,c,d,Q,in,ou); % verbundenes System
[ap,bp,c,d]=minreal1(ac,bc,cc,dc);      % Zustandseliminierung
[a,b]=c2d(ap,bp,T);                     % Z-Transformation
b(1,4)=0; d(4,4)=0;                     % Wiederherstellung einer sym.
                                        % Struktur=Anzahl Uebertraggsfktn
                                        % a,b,c,d: Unveraenderlicher Teil
PA=sum(S);		% Parameteranzahl
BA=sum(BM);		% Anfangswerte pro Variante (Spalte)
if PA~=BA(BRF) error('Falsche Berechnungsreihenfolge'), end
[i,j]=min(BM);		% i: Minima (0!) pro Spalte; j: zugehoerige Zeilennummer
SZ=j(BRF)-1;		% Schleifenzaehler fuer fsolve-Aufrufe
enr=1;			% Ergebnisnummer
erg=[];			% Anfangswert
for iS=1:SZ
 if iS~=1 erg, end	% Ablaufkontrolle  ****
 TAZ=BM(iS,BRF);	% Transiente Anzahl
 AW=ones(1,TAZ);	% Variable Anfangswerteanzahl
 q=fsolve('bran_aug',AW',[0 0 0 0 1],[],a,b,c,d,erg,BRF,RFV,TAZ,iS);
 for j=1:TAZ
     erg(enr)=q(j);
     enr=enr+1;
 end
end
