kramann.info
© Guido Kramann

Login: Passwort:










Regelungssysteme
1 day_by_day
2 Heizregelkreis
3 Verzoegerungsglieder
4 Laplace
..4.1 Eigenwerte
..4.2 PT1
..4.3 PRegler
..4.4 Scilab
5 Regleroptimierung
..5.1 Guetefunktion
..5.2 Heuristiken
..5.3 Scilab
..5.4 Gradientenverfahren
..5.5 ModifizierteG
..5.6 Gleichstrommotor
..5.7 Stoerverhalten
6 Javaanwendung
..6.1 PIDgeregelterAntrieb
..6.2 RungeKuttaIntegrator
..6.3 Gradientenverfahren
7 Einstellregeln
..7.1 Totzeit
..7.2 Methode1
..7.3 Methode2
..7.4 Scilab
..7.5 Daempfungsgrad
..7.6 Uebung
8 Polvorgabe
9 Beobachter
10 AutonomerHackenprosche
..10.1 Herleitung
..10.2 Scilab
..10.3 Modellerweiterung
..10.4 Scilab
..10.5 Modellgueltigkeit
..10.6 java
11 Stabilitaet
..11.1 Beispiele
..11.2 Nyqusitkriterium
..11.3 Windup
..11.4 Bode
12 Adaptiv
..12.1 Definition
..12.2 Einachser
..12.3 Auswertung
..12.4 Identifikation
..12.5 Regleroptimierung
..12.6 Zustandsregler
..12.7 Beobachter
13 Analyse
..13.1 Linear
..13.2 Nichtlinear
14 Kalmanfilter
15 Ue_04_2014
..15.1 Geschwindigkeit
..15.2 Richtung
..15.3 Gesamtsystem
..15.4 RiccatiUSW
..15.5 TdOT
16 Inverses_Pendel
17 Einachser
..17.1 Mechanik
..17.2 Uebung8
18 Fuzzy
..18.1 Fuzzylogik
..18.2 FuzzyRegler
..18.3 Uebung9
..18.5 Softwareentwicklung
....18.5.1 AgileSoftwareentwicklung
....18.5.2 FuzzyRegler
....18.5.3 Uebung
..18.6 Umsetzung
....18.6.1 FuzzyRegler
....18.6.2 Simulation
....18.6.3 Optimierung
....18.6.4 Uebung
..18.7 Haengependel
....18.7.1 Haengependel
....18.7.2 Simulation
....18.7.3 FuzzyRegler
....18.7.4 Optimierer
....18.7.5 Genetisch
..18.8 Information
..18.9 Energie
21 Beispiel1
98 day_by_day_WS2021_SoSe21
99 day_by_day_SoSe2018
kramann.info
© Guido Kramann

Login: Passwort:




Regleroptimierung auf Grundlage des identifizierten Übertragungsverhaltens

(EN google-translate)

(PL google-translate)

003_optimierung.zip - Skripte zu nachfolgender Darstellung.

Besonderheiten bei der Modellierung:

  • Totzeit 0.01s - Indem die Integratorschrittweite einfach auf diesen Wert gesetzt wird, bedarf es keiner Zwischenspeicherung des Stellsignals.
  • ω und das Integral von φ werden für den D- und I-Anteil wie im realen System numerisch bestimmt.

Zur besseren Übersicht, ist das Skript in mehrere Teile gegliedert:

hauptprogramm.sce

clear();

pa=1.2929002
pb=5.6333807
pc=3069.5433

u_begrenzt_aktuell = 0;  //global, wird in modell und simulation benötigt.

exec einachsermodell.sce;
exec ruku.sce;

//Rauschen:
MITTELWERT = 0.0;
STREUUNG   = 0.2;

exec simulation.sce
exec fehlerfunktion.sce
exec optimierer.sce

P_ANTEIL=25000.0;
I_ANTEIL=1000.0;
D_ANTEIL=500.0;

x0=[P_ANTEIL;I_ANTEIL;D_ANTEIL];

xopt = meinoptimierer(berechneFehler,x0,x0.*0.01, x0.*100.0);

P_ANTEIL_OPT=xopt(1);
I_ANTEIL_OPT=xopt(2);
D_ANTEIL_OPT=xopt(3);

//Testsimulationen durchführen:

y0=[0.2;0;0];
t=0:dt:1.5;

y=simulation(xopt,y0,t);

plot(t,y(1,:));

Code 0-1: hauptprogramm.sce

einachsermodell.sce

Agii=[   0, 1,    0;
         0, 0,    1;
         0,-pc/pa,-pb/pa];

Bgii=[0;0;1/pa];

function f = modell(t,yy)
    f = Agii*yy+Bgii*u_begrenzt_aktuell; 
endfunction

Code 0-2: einachsermodell.sce

ruku.sce

function yneu=ruku(y,t,dt)
       k1=modell(t,y);
       k2=modell(t+0.5*dt,y+0.5.*dt.*k1);
       k3=modell(t+0.5*dt,y+0.5.*dt.*k2);
       k4=modell(t+dt,y+dt.*k3);
       yneu=y+dt.*(k1+2.*k2+2.*k3+k4)./6;
endfunction

Code 0-3: ruku.sce

simulation.sce

function ygir_sim=simulation(x,y0,t)
    P_ANTEIL=x(1);
    I_ANTEIL=x(2);
    D_ANTEIL=x(3);

    zs=size(t);
    z=zs(2);

    t0 = 0;

    yalt = y0;
    ygir_sim = yalt

    u_begrenzt_aktuell = 0;
    u_merk = [0];

    index_umerk = 1;

    //Für die numerische Bestimmung der Zustandsgrößen
    phi       = y0(1);
    phi_alt   = y0(1);
    phi_integ = 0.0;    
    omega     = 0.0;

    for i=1:1:z-1
        takt = t(i);

        phi_alt = phi;
        phi = yalt(1) + grand(1, 1, "nor", MITTELWERT, STREUUNG);
;
        phi_integ = phi_integ + phi*dt;    
        omega = (phi - phi_alt)/dt;

        //Zeitschritt durchführen:
        yneu=ruku(yalt,takt,dt);
        ygir_sim=[ygir_sim,yneu];
        yalt=yneu;

        //Erst danach das Stellsignal aktualisieren:
        u_begrenzt_aktuell = -P_ANTEIL*phi - I_ANTEIL*phi_integ - D_ANTEIL*omega;
        if u_begrenzt_aktuell>480 then
            u_begrenzt_aktuell=480;
        end

        if u_begrenzt_aktuell<-480 then
            u_begrenzt_aktuell=-480;
        end
    end
endfunction

Code 0-4: simulation.sce

fehlerfunktion.sce

dt=0.01;
t=0:dt:1.5;
zs=size(t);
z=zs(2);

function err=berechneFehler(x)
    err=0.0;

    t=0:dt:3.0;


    y0=[0.2;0;0];
    ygir_sim=simulation(x,y0,t);
    err = err + ygir_sim(1,1:z)*ygir_sim(2,1:z)';

    y0=[0.0;0.2;0];
    ygir_sim=simulation(x,y0,t);
    err = err + ygir_sim(1,1:z)*ygir_sim(2,1:z)';

    y0=[-0.4;0;0];
    ygir_sim=simulation(x,y0,t);
    err = err + ygir_sim(1,1:z)*ygir_sim(2,1:z)';

    y0=[0.3;0.2;0];
    ygir_sim=simulation(x,y0,t);
    err = err + ygir_sim(1,1:z)*ygir_sim(2,1:z)';

endfunction

Code 0-5: fehlerfunktion.sce

optimierer.sce

function bestparam = meinoptimierer(fehlerfunktion,startparam,minparam,maxparam)
    x0 = startparam;
    deltax = (maxparam-minparam).*0.0001;
    xakt=x0;

    sx = size(x0);
    zx = sx(1);

    fehler_akt = fehlerfunktion(x0);

    for i=1:100
        k = grand(1, 1, "uin", 1, zx);
        xneu = xakt;
        if xneu(k)+deltax(k)<maxparam(k) & xneu(k)-deltax(k)>minparam(k) then
            xneu(k)=xneu(k)+deltax(k);
            fehler_neu_plus = fehlerfunktion(xneu);
            xneu = xakt;
            xneu(k)=xneu(k)-deltax(k);
            fehler_neu_minus = fehlerfunktion(xneu);
 
            if fehler_neu_plus<fehler_akt then
                fehler_akt=fehler_neu_plus;
                xakt(k)=xakt(k)+deltax(k);
                deltax(k) = deltax(k)*1.01;
            elseif fehler_neu_minus<fehler_akt then
                fehler_akt=fehler_neu_minus;
                xakt(k)=xakt(k)-deltax(k);
                deltax(k) = deltax(k)*1.01;
            else
                deltax(k) = deltax(k)*0.99;
            end
        end
    end    

    bestparam = xakt;
endfunction

Code 0-6: optimierer.sce

P_ANTEIL = 25009.874
I_ANTEIL = 980.10298 
D_ANTEIL = 495.63126

Code 0-7: Gefundene Parameter.

Zeitverlauf des Kippwinkels φ in rad mit den optimierten Parametern in der Simulation (Beispiel-Anfangsbedingung φ0=0.2rad).

Bild 0-1: Zeitverlauf des Kippwinkels φ in rad mit den optimierten Parametern in der Simulation (Beispiel-Anfangsbedingung φ0=0.2rad).