function erg=zust_au1(T,Tei,TM,TF,TL,SAK)
%ZUST_AU1 state control structure 1: 3 coefficients; automated; here plant only,
%         erg=zust_au1(T,Tei,TM,TF,TL(,SAK)) - application of the Discontinuous
% Amplitude Optimum(BOD) to calculate coefficients of a discontinuous state control
% structure - example by Brandenburg: at 35(1987)7, pp. 275/83;
% quod vide: Tei=4; TM=30; TF=5; und TL=30;60;120  *** automated calculation ***
%      T:	   sampling time of the discontinuous control in ms
%      Tei:	   first order time delay (model of closed current control loop) in ms
%      TM:	   motor time constant (integrator) in ms
%      TF:	   spring time constant (integrator) in ms
%      TL:	   load time constant  (integrator) in ms
%      (,SAK): optionally: switch for operation control,
%              display of partial results: 0=no/1=yes; default=0;
%      erg:	   results as vector [Kdelta Km Kn]

% KEY WORDS: Discontinuous Amplitude Optimum, BOD, state control structure,
%            elastic drive train, optimization, undelayed input signals,
%            delayed input signals

%  ***** preconditions: existence of function zust_aug1.m ****
%  Copyright (c) 1997-2018. All Rights Reserved.
%                     Dr. Gert-Helge Geitner; TU Dresden, Fak. ET,
%                     Elektrotechnisches Institut (ETI); Mommsenstr. 13;
%                     D-01062 Dresden, Germany;
%                     http://eeiwzg.et.tu-dresden.de/ae2_files/ae_1.htm
%  Reference regarding Discontinuous Amplitude Optimum: Geitner, G.-H.:
%                     Entwurf digitaler Regler fuer elektrische Antriebe.
%                     publisher: VDE-Verlag GmbH Berlin und Offenbach 1995
%                     ISBN 3-8007-1847-2

%-----------------------------German -------------------------------------------
%ZUST_AU1 Zustandsregelstruktur 1; 3 Koeff.; automatisiert; hier nur Strecke
%         erg=zust_au1(T,Tei,TM,TF,TL(,SAK)) -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
%      (,SAK): wahlweise: Schalter zur Steuerung der Ablaufkontrolle; 
%              Teilergebnisanzeige: 0=nein/1=ja; default=0;
%      erg:	   [Kdelta Km Kn]

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

%  ***** Voraussetzungen: Vorhandensein von zust_aug1 ****
%  Copyright (c) 1997-2018. All Rights Reserved.
%                     Dr. Gert-Helge Geitner; TU Dresden, Fak. ET,
%                     Elektrotechnisches Institut (ETI); Mommsenstr. 13;
%                     D-01062 Dresden, Germany;
%                     e-mail: Gert-Helge.Geitner@tu-dresden.de
%                     http://eeiwzg.et.tu-dresden.de/ae2_files/ae_1.htm
%  Literatur zum Digitalen Betragsoptimum: Geitner, G.-H.:
%                     Entwurf digitaler Regler fuer elektrische Antriebe.
%                     VDE-Verlag GmbH Berlin und Offenbach 1995
%----------------------End German----------------------------------------------

narginchk(5,6)  % obsolete versions: error(nargchk(5,6,nargin))
if nargin==5 SAK=0; 
   else if ~(SAK==0|SAK==1) error('Incorrect input argument 6!'); end; end
S=[1 1 1];	    % S=[Kdelta Km Kn]  **** switch for weighting factors
RFV=[1 2 3];	% RFV=[1 2 3]	    **** sequence vector with [Kdelta Km Kn]
   if sum(RFV)~=6 error('Incorrect sequence vector'), end
BM=[2 1 3; 1 1 0; 0 1 0];  % **** COLUMN - number of calculations per fsolve call
BRF=1;			   % **** choice of a column of matrix BM
% Definition of numerators and denominators of all blocks (transfer functions)
  n001=1;                          d001=[Tei 1];
  n002=1;                          d002=[TM 0];
  n003=1;                          d003=1;
  n004=1;                          d004=[TF 0];
  n005=1;                          d005=[TL 0];
% declaration of the number of blocks (transfer functions) and definition of an
% unconnected diagonal state model of the system using the above defined
% numerator and denominator polynomials:
%nblocks=5;
%blkbuild;  % because of global variable access for script files only!!!
% define an unconnected diagonal system
[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;       %  !!!Thus algorithm prepared for three ASCII positions (0...9)!!!
% definition of the connections between the blocks (transfer functions):
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); % connected system
[ap,bp,c,d]=minreal(ac,bc,cc,dc);       % state elimination
[a,b]=c2d(ap,bp,T);                     % z-transform
b(1,4)=0; d(4,4)=0;                     % rebuilding of a symmetrical
                                        % structure=number of blocks
                                        % a,b,c,d: invariable part
PA=sum(S);		% number of parameters
BA=sum(BM);		% initial values per variant (column)
if PA~=BA(BRF) error('Incorrect calculation sequence'), end
[i,j]=min(BM);		% i: Minima (0!) per column; j: associated row number
SZ=j(BRF)-1;		% loop counter for fsolve calling
enr=1;			% result number
erg=[];			% initial value
%OPTIONS display: optimset,
%options=optimset('Display','iter','TolFun',1e-18); %iteration supervision 
options=optimset('Display','off','TolFun',1e-18);
for iS=1:SZ
 if iS~=1&SAK==1 erg, end % operation control  ****
 TAZ=BM(iS,BRF);          % transient number
 AW=ones(TAZ,1);          % variable number of initial values
 x=[];
 x=fsolve(@(x) zust_aug1(x,a,b,c,d,erg,BRF,RFV,TAZ,iS),AW,options);
 for j=1:TAZ
     erg(enr)=x(j);
     enr=enr+1;
 end
end
