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:




Verknüpfung des Antriebs mit einem Fuzzy-Regler und Simulation.

Nun soll der Antrieb aus Kapitel 6.1 mit einem passenden Fuzzy-Regler versehen werden. Zunächst werden Modell und Simulator ohne Regler bereitgestellt:

Bereitstellen von Antriebs-Modell und Simulator ohne Regler:

  • Eine passende Simulation steht bereit in Form des Programms TestAntrieb.java, bzw. Antrieb.java im Package opti.
  • Mit dem Skript starten.bat kann das Programm kompiliert, gestartet und das Ergebnis in Scilab angeschaut werden.
  • Nachfolgend kann dieses Beispiel heruntergeladen werden:
antrieb2.zip - Stellt u.a. ein noch ungeregeltes Simulationsmodell für den Antrieb bereit.
package opti;
import java.awt.*;
public class Antrieb extends Simulationsmodell
{
    /**
    Die folgenden Variablen sind die Modellparameter, die später
    optimiert werden können.
    Als Startwert sind die zu erwartenden Extremwerte eingestellt, damit
    später automatisiert GUI-Elemente erzeugt werden können.
    Da positive Extremwerte vorgegeben sind, ist damit festgelegt, dass
    alle Modell-Parameter nicht negativ werden dürfen.
    */
//ACHTUNG: K und L sind gegenüber Scilab-Musterlösung vertauscht!
    public double K = 100000.0;
    public double L = 100000.0;
    public double M = 100000.0;
    public double pwm = -1023.0;
    public Antrieb()
    {
        super(2); //Zwei Simulationsgleichungen
    }
    public double[] berechneRechteSeite(double[] yalt, double t)
    {
        /**Eigentliche Bestimmung der rechten Seite (Steigungsvektor)*/
        f[0] = yalt[1];
        f[1] = - K*yalt[1] - L*yalt[0] + M*pwm;
        return f;
    } 
    /** paint(..) wird bei der Konsolenanwendung nicht verwendet.*/
    public void paint(Graphics2D g)
    {
    }
}

Code 0-1: Klasse Antrieb

package opti;
public class TestAntrieb
{
    public static void main(String[] args)
    {
        Antrieb antrieb = new Antrieb();
        RungeKuttaIntegrator rungekuttaintegrator = new RungeKuttaIntegrator();
        rungekuttaintegrator.add(antrieb);
//ACHTUNG: K und L sind gegenüber der Scilab-Musterlösung in Kaptiel 5.6 vertauscht!
        antrieb.K=1576.1789;
        antrieb.L=11542.314;
        antrieb.M=372.33722;
        antrieb.pwm = 1023.0;
        double dt = 0.001;
        double  t = 0.0;
        double[] y;
        double[] yalt = {0.0,0.0};
        for(int i=0;i<473;i++)
        {
            System.out.println(t+" "+yalt[0]);
            y = rungekuttaintegrator.zeitschritt(yalt,t,dt);
            yalt[0] = y[0];
            yalt[1] = y[1];
            t+=dt;
        }
    }
}

Code 0-2: Klasse TestAntrieb

Entwurf des Fuzzy-Reglers

  • An der Simulation der Sprungantwort ist zu sehen, dass maximal 30 erreicht wird (Einheit Omega/4).
  • Also wird als Sollwert 20 vorgegeben.
  • Der Fuzzy-Regler soll einfach aufgebaut werden:
  • Eingangsgröße soll nur die Regelabweichung e sein, Ausgangsgröße das PWM-Signal.
  • Die Fuzzy-Sets werden folgendermaßen entworfen:
  • Fuzzy-Eingangsgröße: E mit den Ausprägungen:
  • ENG - Regeldifferenz negativ groß
  • ENK - Regeldifferenz negativ klein
  • ENN - Regeldifferenz quasi Null
  • EPK - Regeldifferenz positiv klein
  • EPG - Regeldifferenz positiv groß
  • Fuzzy-Ausgangsgröße: P mit den Ausprägungen:
  • PNG - PWM negativ groß
  • PNK - PWM negativ klein
  • PNN - PWM quasi Null
  • PPK - PWM positiv klein
  • PPG - PWM positiv groß
  • E wird zunächst im Intervall +/-10 gleichverteilt.
  • P wird zunächst im Intervall +/-1023 gleichverteilt.
  • Intuitiv erstellte Fuzzy-Regeln:
  • WENN ENG DANN PNG
  • WENN ENK DANN PNK
  • WENN ENN DANN PNN
  • WENN EPK DANN PPK
  • WENN EPG DANN PPG
  • Um die Programmstruktur möglichst unverändert zu lassen, wird die Klasse Antrieb direkt mit dem Fuzzy-Regler versehen.
  • Die Klassen der Fuzzy-Regelung werden noch vorher in ein Package mit Namen fuzzy gelegt (s. antrieb3.zip).
package opti;
import java.awt.*;
import fuzzy.*; //Fuzzy-Package importieren.
public class Antrieb extends Simulationsmodell
{
    public double K = 100000.0;
    public double L = 100000.0;
    public double M = 100000.0;
    public double pwm = -1023.0;
//Fuzzy-Regler einfügen:
    FuzzyRegler fuzzyregler = null;
    private double[] e_aktuell = new double[1];
    public Antrieb()
    {
        super(2); //Zwei Simulationsgleichungen
        //Fuzzy-Regler initialisieren:
        //1. Fuzzy-Regler erstellen:
        fuzzyregler = new FuzzyRegler(); 
        //2. Fuzzy-Eingangs-Sets erstellen:
        FuzzyEingangsSet[] fes = new FuzzyEingangsSet[1];
        FuzzyEingangsSet   regeldifferenz   = new FuzzyEingangsSet();
        regeldifferenz.erzeugeFuzzyGroessen(5);
        regeldifferenz.verteileFuzzyGroessenGleichmaessig(-10.0,10.0);
        fes[0] = regeldifferenz;        
        fuzzyregler.setFuzzyEingangsSet(fes);
        //3. Fuzzy-Ausgangs-Set erstellen:
        FuzzyAusgangsSet fas = new FuzzyAusgangsSet();
        fas.erzeugeFuzzyGroessen(5+2); //Fünf Fuzzygrößen und Minimum und Maximum
        fas.verteileFuzzyGroessenGleichmaessig(-1023.0,1023.0);
        fuzzyregler.setFuzzyAusgangsSet(fas);
        //4. Fuzzy-Regeln hinzufügen:
        int[][] regeln = new int[5][];
        regeln[0] = new int[] {0, 0,0};//WENN ENG DANN PNG
        regeln[1] = new int[] {1, 0,1};//WENN ENK DANN PNK
        regeln[2] = new int[] {2, 0,2};//WENN ENN DANN PNN
        regeln[3] = new int[] {3, 0,3};//WENN EPK DANN PPK
        regeln[4] = new int[] {4, 0,4};//WENN EPG DANN PPG
        fuzzyregler.setFuzzyRegeln(regeln);
    }
    public double[] berechneRechteSeite(double[] yalt, double t)
    {
        /**Eigentliche Bestimmung der rechten Seite (Steigungsvektor)*/
        e_aktuell[0] = 20.0 - yalt[0];
        pwm = fuzzyregler.berechneAusgang(e_aktuell);
        f[0] = yalt[1];
        f[1] = - K*yalt[1] - L*yalt[0] + M*pwm;
        return f;
    } 
    /** paint(..) wird bei der Konsolenanwendung nicht verwendet.*/
    public void paint(Graphics2D g)
    {
    }
}

Code 0-3: Modifizierte Klasse Antrieb mit Fuzzy-Regler.

  • Bei den anfänglichen Einstellungen ergibt sich folgender Verlauf:
Verlauf bei den intuitiv gewählten Fuzzy-Regeln.

Bild 0-1: Verlauf bei den intuitiv gewählten Fuzzy-Regeln.

antrieb3.zip - Antrieb mit Fuzzy-Regler.