%ue12 erzeugt Daten fuer den Entwurf eines Infinity-Norm-optimalen
%	Reglers fuer die Strecke:
%
%	         1
%	G(s) = -----
%	       s + 1

%
%       z1
%	-------+
%	       |                   +----+
%	    +--|------------------>| W1 |---> v1
%	z2  |  |                   +----+
%	----|--|------------+                   || T   ||     => min.
%	    |  |            |                        vz   infty
%	    |  v   +---+    v      +----+
%	    *--o-->| G |--->O--*-->| W2 |---> v2
%	    |      +---+       |   +----+
%	    |                  |
%	    |      +---+       |
%	    +------| K |<------+
%	           +---+
%
%	Die Gewichtsfunktionen W1 und W2 koennen durch die
%	Vertaerkungen bei tiefen und hohen Frequenzen sowie die
%	Grenzfrequenzen definiert werden.


%	Copyright (c) 1996 K. Mueller, IfR
%	$Revision: 1.0.a $  $Date: 1996/08/02 $

disp(' ')
disp('    ----------------------------------------')
disp('    H_inf optimaler Regler fuer die Strecke:')
disp(' ')
disp('		         1')
disp('		G(s) = -----')
disp('		       s + 1')
disp('    ----------------------------------------')
disp(' ')

% Stellgroesse
if exist('W1') ~=1
VlW1 = 0.0;  VhW1 = 0.38;  FgW1 = 0.01;
[a,b,c,d] = wgt1o(VlW1,VhW1,FgW1);
W1 = pck(a,b,c,d);
end

% Regelgroesse
if exist('W2') ~= 1
VlW2 = 100.0;  VhW2 = 0.0;  FgW2 = 0.005;
[a,b,c,d] = wgt1o(VlW2,VhW2,FgW2);
W2 = pck(a,b,c,d);
end

% Strecke
[a,b,c,d] = tf2ss([1],[1 1]);
G=pck(a,b,c,d);

done = input(' o Vorhandenes W1 (Stellgroesse) verwenden? [n]? ','s');
if sum(size(done)) ~= 2
    done = 'n';
end
while done == 'n',
    disp(' ')
    disp('------------------------------------------------------')
    disp('Spezifikation des Entwurfs durch Gewichtsfunktion  W1:')
    disp('  (Bewertung der  S t e l l g r o e s s e )')
    disp('------------------------------------------------------')
    fprintf('Verstaerkung  t i e f e  Frequenzen = %f',VlW1);
    x = input('---> neuer Wert oder <ret>: ');
    if sum(size(x)) == 2
        VlW1 = x;
    end
    fprintf('  Verstaerkung  h o h e  Frequenzen = %f',VhW1);
    x = input('---> neuer Wert oder <ret>: ');
    if sum(size(x)) == 2
        VhW1 = x;
    end
    fprintf('                      Grenzfrequenz = %f',FgW1);
    x = input('---> neuer Wert oder <ret>: ');
    if sum(size(x)) == 2
        FgW1 = x;
    end
    [a,b,c,d] = wgt1o(VlW1,VhW1,FgW1);
    bode(a,b,c,d)
    done = input(' o Gewichtsfunktion ok [j]? ','s');
    W1 = pck(a,b,c,d);
end

done = input(' o Vorhandenes W2 (Regelgroesse) verwenden? [n]? ','s');
if sum(size(done)) ~= 2
    done = 'n';
end
while done == 'n',
    disp(' ')
    disp('------------------------------------------------------')
    disp('Spezifikation des Entwurfs durch Gewichtsfunktion  W2:')
    disp('  (Bewertung der  R e g e l g r o e s s e )')
    disp('------------------------------------------------------')
    fprintf('Verstaerkung  t i e f e  Frequenzen = %f',VlW2);
    x = input('---> neuer Wert oder <ret>: ');
    if sum(size(x)) == 2
        VlW2 = x;
    end
    fprintf('  Verstaerkung  h o h e  Frequenzen = %f',VhW2);
    x = input('---> neuer Wert oder <ret>: ');
    if sum(size(x)) == 2
        VhW2 = x;
    end
    fprintf('                      Grenzfrequenz = %f',FgW2);
    x = input('---> neuer Wert oder <ret>: ');
    if sum(size(x)) == 2
        FgW2 = x;
    end
    [a,b,c,d] = wgt1o(VlW2,VhW2,FgW2);
    bode(a,b,c,d)
    done = input(' o Gewichtsfunktion ok [j]? ','s');
    W2 = pck(a,b,c,d);
end

disp(' ')
disp(' * Danke das genuegt.')
disp(' ')
disp(' * Erzeugen von P ...')
systemnames = ' G W1 W2 ';
inputvar = '[ z(2); u ]';
outputvar = '[ W1; W2; G + z(2) ]';
input_to_G = '[ u + z(1) ]';
input_to_W1 = '[ u ]';
input_to_W2 = '[ G + z(2) ]';
sysoutname = 'P';
cleanupsysic = 'yes';
sysic

disp(' ')
disp(' * Reglerentwurf ...')
clear K
[K,GW,gfin]=hinfsyn(P,1,1,0.1,100,0.01);

disp(' ')
disp('----------------------------------------------------')
if exist('K')
    disp(' Ein Regler konnte erfolgreich berechnet werden.')
    if gfin > 1.1
        disp(' ===> Die Spezifikationen konnten nicht eingehalten werden.')
        fprintf('      ===> Faktor: %f\n', gfin')
    elseif gfin < 0.9
        disp(' ===> Die Spezifikationen wurden uebertroffen.')
        fprintf('      ===> Faktor: %f\n', gfin')
    else
        disp(' ===> Die Spezifikationen wurden erreicht.')
    end
else
    disp(' *** Es konnte keine Regler berechnet werden ***')
end
disp('----------------------------------------------------')
disp(' ')

disp(' o Simulation T (Zeitbereich) ...')
systemnames = ' K G ';
inputvar = '[ w ]';
outputvar = '[ G; -K ]';
input_to_K = '[ w - G ]';
input_to_G = '[ -K ]';
sysoutname = 'GCL';
cleanupsysic = 'yes';
sysic

[a,b,c,d]=unpck(GCL);
[y,x,t] = step(a,b,c,d);
figure(1)
subplot(2,1,1)
plot(t,y(:,1),[0,t(length(t))],[0 0],':',[0,t(length(t))],[1 1],'-.')
xlabel('Zeit [sec]')
ylabel('Regelgroesse')
title('Spungantwort Sollwert')
subplot(2,1,2)
plot(t,y(:,2),[0,t(length(t))],[0 0],':',[0,t(length(t))],[1 1],'-.')
xlabel('Zeit [sec]')
ylabel('Stellgroesse')
clear x

disp(' o Betraege von |S|, |KS| (Frequenzbereich) ...')
systemnames = ' K G ';
inputvar = '[ w ]';
outputvar = '[ -K; w - G ]';
input_to_K = '[ w - G ]';
input_to_G = '[ -K ]';
sysoutname = 'SKS';
cleanupsysic = 'yes';
sysic

w = logspace(-4,4,200);
fg = frsp(SKS,w);
fgw1 = veval('.*',vinv(frsp(W1,w)),gfin);
fgw2 = veval('.*',vinv(frsp(W2,w)),gfin);
figure(2)
subplot(2,1,1);
vplot('liv,lm',sel(fg,1,1),fgw1)
xlabel('Frequenz [rad/sec]'), ylabel('KS, ga/W1')
title('Stellgroesse/Robustheit')
subplot(2,1,2);
vplot('liv,lm',sel(fg,2,1),fgw2)
xlabel('Frequenz [rad/sec]'), ylabel('S, ga/W2')
title('Performance')
figure(1)

disp(' o Danke, das genuegt.')
% KPM-E
