% Regler_Bode ist ein simples MATLAB-Programm zur Berechnung des 
% Verstärkungsfaktors eines optimierten Reglers zu gegebenen 
% Übertragungsfunktionen von Strecke (Gs) und Regler (Gr). 
% Der Phasenrand Prand kann beliebig verändert werden, sollte aber 
% aus Stabilitätsgründen im Bereich von 30° bis 70° liegen.

% Definieren der Phasenreserve bzw. des Phasenrands Prand:
Prand=70 %#ok<*NOPTS>
% Berechnen der Übertragungsfunktion des offenen Regelkreis Go:
Go=Gr*Gs	 
% BODE-Diagramm grafisch ausgeben, um zu sehen, in welchem Frequenzbereich
% die Phase von -180°+Phasenrand liegt
bode(Go), grid, legend('Go')		
% Eventl. Anpassen an richtigen Bereich => vgl. dazu BODE-Diagramm
% Werden keine Werte fü die niedrigste und die höchste Potenz angegeben
% wird der Wertebereich von 10^-2 bis 10^2 definiert.
min_Potenz=input('Untere Grenze, also niedrigste Potenz des Wertebereichs w: ')
max_Potenz=input('Obere Grenze, also höchste Potenz des Wertebereichs w: ')
if isempty(min_Potenz)  % liefert "true" bzw. 1 wenn min_Potenz leer ist
    display('Kein unterer Wert eingegeben, Default: -2'),min_Potenz=-2 
    if isempty(max_Potenz)
        display('Kein oberer Wert eingegeben, Default: 2'),max_Potenz=2 
    else
        if max_Potenz<=min_Potenz
            display('Oberer Wert kleiner als unterer Wert, Default: 2'),max_Potenz=2 
        end
    end
else
    if isempty(max_Potenz)
        display('Kein oberer Wert eingegeben, Default: '),max_Potenz=min_Potenz+4
    else
        if max_Potenz<=min_Potenz
            display('Oberer Wert kleiner als unterer Wert, Default: '),max_Potenz=min_Potenz+4
        end
    end
end    
        
% Definieren von Frequenzwertebereich w:
% (Semikolon NICHT vergessen, sonst Auflistung von 10.000 Zeilen!)
w=logspace(min_Potenz,max_Potenz,10000);	
% Zuordnen von Phasen- (p) und Amplitudenwerten (a):
[a,p,w]=bode(Go,w);	% Semikolon NICHT vergessen!
% Berechnen des Verstärkungsparameters Kv:
[Kv,Pm,wa,wp]=margin(a,p-Prand,w)	
% Darstellung der Verschiebung von Go um Phasenrand von 60°:
figure; margin(Kv*Go), grid
% Berechnung des geschlossenen Regelkreises (Führungsübertragunsgfunktion)
% für die Regelstrecke ohne und mit optimiertem Regler (Verstärkungsfaktor
% Kr):
Gw_0=feedback(Go,1)	
Gw =feedback(Go*Kv,1)	
% Führungssprungantwort des geschlossenen Regelkreises im Vergleich zur
% Sprungantworten der Regelstrecke ohne Regler und des offenen Regelkreises
figure;step(Gs,Gw_0,Gw), grid
legend('Gs - Regelstrecke', 'Gw_0 - geschlossener RK ohne Optimierung', 'Gw - geschlossener RK mit optimiertem Regler')	