kramann.info
© Guido Kramann

Login: Passwort:










12.7 Entwurf eines Zustandsreglers mit Beobachter

12.7 Draft of a state controller with observer (EN google-translate)

12.7 Szkic kontrolera państwowego z obserwatorem (PL google-translate)

Prinzip des Zustandsreglers mit Beobachter und Angleichung zwischen Simulation und realem System durch Rückführung der Differenz von y<sub>real</sub> - y<sub>sim</sub> auf den Eingang der simulierten Strecke.

Bild 12.7-1: Prinzip des Zustandsreglers mit Beobachter und Angleichung zwischen Simulation und realem System durch Rückführung der Differenz von yreal - ysim auf den Eingang der simulierten Strecke.

Um eine realistische Umsetzung zu erhalten, wird der Zustandsregler von einem numerisch rekonstruierten Zustand gespeist und mit einem einfachen Integrationsverfahren parallel zum realen Modell simuliert.

In order to obtain a realistic conversion, the state controller of fed a numerically reconstructed state and with a simple Integration method simulated parallel to the real model.

Aby uzyskać realistyczną konwersję, kontroler stanu karmione liczbowo zrekonstruowanym stanem i proste Metoda integracji symulowana równolegle do modelu rzeczywistego.

Als Besonderheit wird zunächst das Euler-Verfahren und dann das implizite Eulerverfahren verwendet und miteinander verglichen.

As a special feature, first the Euler method and then the implicit Euler method is used and compared to each other.

Jako specjalną cechę najpierw stosuje się metodę Eulera, a następnie niejawną metodę Eulera i w porównaniu do siebie nawzajem.

Integration mit Euler vorwärts

Integration with Euler forward

Integracja z Eulerem do przodu

007_beobachter.zip - Skripte zur realisierung des Zustandsreglers mit Beobachter des Einachsers als Simulation mit Euler vorwärts.
Simulationsergebnis zum Zustandsregler mit Beobachter. Integration mit Euler vorwärts. FEHLERHAFTES Skript: u_begrenzt_aktuell = -RR*ynum + LL*(ynum-ysim);

Bild 12.7-2: Simulationsergebnis zum Zustandsregler mit Beobachter. Integration mit Euler vorwärts. FEHLERHAFTES Skript: u_begrenzt_aktuell = -RR*ynum + LL*(ynum-ysim);

Simulationsergebnis zum Zustandsregler mit Beobachter. Integration mit Euler vorwärts. KORRIGIERTES Skript: u_begrenzt_aktuell = -RR*ysim + LL*(ynum-ysim);

Bild 12.7-3: Simulationsergebnis zum Zustandsregler mit Beobachter. Integration mit Euler vorwärts. KORRIGIERTES Skript: u_begrenzt_aktuell = -RR*ysim + LL*(ynum-ysim);

function ygir_sim=simulation(x,y0,t)
    RR = [x(1),x(2),x(3),x(4)];

    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;
    omega_alt     = 0.0;

    s_int=0.0;
    s_phi=0.0;
    s_ome=0.0;
    s_alf=0.0;

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

        phi_alt = phi;
        omega_alt = omega;

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

        //Numerisch rekonstruierter Zustand:
        ynum = [phi_integ;phi;omega;alfa];

        //weiteren Zustand durch Simulation rekonstruieren:
        s_int       = s_int + s_phi*dt;
        s_phi       = s_phi + s_ome*dt;
        s_ome       = s_ome + s_alf*dt;
        s_alf       = s_alf + (  (-pc/pa)*s_ome  + (-pb/pa)*s_alf + (1/pa)*u_begrenzt_aktuell  )*dt;

        ysim = [s_int;s_phi;s_ome;s_alf];

        //Korrekturfaktor, um simuliertes y nahe an das reale zu holen:
        LL = [1.0,100.0,1.0,0.1]; //phi am stärksten gewichten

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

        yalt=yneu;

        //Erst danach das Stellsignal aktualisieren:

        //u_begrenzt_aktuell = -RR*ynum + LL*(ynum-ysim);   FEHLERHAFT
        u_begrenzt_aktuell = -RR*ysim + LL*(ynum-ysim);   //RICHTIG, liefert aber keine vernünftigen Erg., jedoch Euler implizit. s.u.

        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 12.7-1: simulation.sce - Das mit-integrierte Beobachtermodell wird hier so realisiert, wie das auch innerhalb eines Mikrocontrollerprogramms geschehen würde: Der reale Systemzustand wird numerisch rekonstruiert, die Modellintegration erfolgt sehr einfach mittels Euler-Integration.

Integration mit implizitem Euler-Verfahren

Integration with implicit Euler method

Integracja z niejawną metodą Eulera

008_beobachter_impl_euler.zip - Scilab-Skripte zu nachfolgender Darstellung.

$ \vec y_\left(k+1\right) = \left(E-A \cdot \Delta t\right)^\left(-1\right) \cdot \left( \vec y_k+B \cdot \vec u_k \cdot \Delta t\right) $

Formel 12.7-1: Implizites Eulerverfahren bei bekannter Systemmatrix \left(vergl. Herleitung in übergeordnetem Kapitel\right).


Simulationsergebnis bei Verwendung des impliziten Eulerverfahrens statt des expliziten.

Bild 12.7-4: Simulationsergebnis bei Verwendung des impliziten Eulerverfahrens statt des expliziten.

Nach Korrektur des Skripts für Euler Vorwärts ist nun deutlich die Verbesserung mit dem impliziten Eulerverfahren zu sehen: Beim Euler-Vorwärts regelt das System bei dieser Schrittweite gar nicht aus.
After correcting the script for Euler Vorwärts, the improvement with the implicit Euler method can now clearly be seen: With Euler forward, the system does not manage at this step size.
Po skorygowaniu skryptu dla Eulera Vorwärtsa można teraz wyraźnie dostrzec poprawę dzięki niejawnej metodzie Eulera: w przypadku Eulera do przodu system nie radzi sobie z tym rozmiarem.
function ygir_sim=simulation(x,y0,t)
    RR = [x(1),x(2),x(3),x(4)];

    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;
    omega_alt     = 0.0;

    s_int=0.0;
    s_phi=0.0;
    s_ome=0.0;
    s_alf=0.0;

    //Vorbereitung für das implizite Eulerverfahren:
    // yk+1 = inv(E-A*dt)*(yk+B*uk*dt)
    // yk+1 =          AI*(yk+B*uk*dt)
    AI = inv(eye(4,4)-Agii*dt);
    ysim = [0;0;0;0];

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

        phi_alt = phi;
        omega_alt = omega;

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

        //Numerisch rekonstruierter Zustand:
        ynum = [phi_integ;phi;omega;alfa];

        //weiteren Zustand durch Simulation rekonstruieren:
        ymodell = ysim;

        //implizites Euler-Verfahren:
        ysim = AI*(ymodell+Bgii*u_begrenzt_aktuell*dt);        

        //Korrekturfaktor, um simuliertes y nahe an das reale zu holen:
        LL = [1.0,100.0,1.0,0.1]; //phi am stärksten gewichten

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

        yalt=yneu;

        //Erst danach das Stellsignal aktualisieren:

        u_begrenzt_aktuell = -RR*ynum + LL*(ynum-ysim);

        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 12.7-2: simulation.sce - Das mit-integrierte Beobachtermodell wird hier so realisiert, wie das auch innerhalb eines Mikrocontrollerprogramms geschehen würde: Der reale Systemzustand wird numerisch rekonstruiert, die Modellintegration erfolgt mittels impliziter Euler-Integration.