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:




Erstellen des Integrators als Runge-Kutta-Integrator

  • Die Implementierung eines Runge-Kutta-Integrators in C++ wurde bereits in Simulationstechnik und Informatik3 behandelt.
  • Die nachfolgende Umsetzung in Java unterscheidet sich kaum davon.
  • Im Hinblick auf eine Umsetzung als Java-Bean ist unbedingt ein leerer Konstruktor erforderlich. Dies gilt auch für alle anderen Klassen, die als Java-Bean umgesetzt werden sollen.
  • Außerdem gibt es eine Methode add(..), die es ermöglicht ein zu simulierendes Modell als Objekt-Referenz zu speichern. Diese Registrierung soll bei der Oberflächen-basierten Variante automatisiert werden.
  • Wieder gibt es eine vorgeschaltete Basisklasse (Integrator):
  • Erst nach der Registrierung des Modells ist der Integrator funktionstüchtig.
  • Beachten Sie auch die Kommentare in den Quellcodes.
package opti;
import java.awt.*; //package awt für die paint()-Methode nötig.
public class Integrator
{
    protected Simulationsmodell simulationsmodell = null;
    protected double[] yneu = null;
    /**
    Mit add(..) wird eine Referenz auf das zu integrierende Modell im 
    Integrator-Objekt gespeichert.
    */
    public void add(Simulationsmodell simulationsmodell)
    {
        this.simulationsmodell = simulationsmodell;
        yneu  = new double[simulationsmodell.getAnzahlGleichungen()];
    }
    /**
    Die Objekt-Methode zeitschritt(..) muss von erbenden Integrator-Klassen überschrieben werden.
    */
    double[] zeitschritt(double[] yalt,double t,double dt)
    {
        if(simulationsmodell==null)
            return null;
        return yneu;
    }
    /** Ein Integrator kann durch Überschreiben der Methode paint() in die Lage
    versetzt werden, seinen aktuellen Zustand grafisch darzustellen.<br/>
    Die Methode wird von der paint-Methode eines Canvas-Objekts her aufgerufen.
    */
    public void paint(Graphics2D g)
    {
    }     
}

Code 0-1: Basisklasse Integrator.java

package opti;
import java.awt.*; //package awt für die paint()-Methode nötig.
public class RungeKuttaIntegrator extends Integrator
{
    private double[] yhilf = null;
    private double[] k1=null,k2=null,k3=null,k4=null;
    private double[] k; //Hilfsreferenz, um Berechnungsergebnisse vom Modell zu speichern.
    public void add(Simulationsmodell simulationsmodell)
    {
        this.simulationsmodell = simulationsmodell;
        yneu  = new double[simulationsmodell.getAnzahlGleichungen()];
        yhilf = new double[simulationsmodell.getAnzahlGleichungen()];
        k1 = new double[simulationsmodell.getAnzahlGleichungen()]; 
        k2 = new double[simulationsmodell.getAnzahlGleichungen()]; 
        k3 = new double[simulationsmodell.getAnzahlGleichungen()]; 
        k4 = new double[simulationsmodell.getAnzahlGleichungen()];     
    }
    public double[] zeitschritt(double[] yalt,double t,double dt)
    {
        /**
        Erst nach der Registrierung des Modells mit add(..) ist der Integrator funktionstüchtig.
        */
        if(simulationsmodell==null)
            return null;
        k = simulationsmodell.berechneRechteSeite(yalt,t);
        for(int i=0;i<simulationsmodell.getAnzahlGleichungen();i++)
        {
            k1[i] = k[i];
            yhilf[i] = yalt[i] + 0.5*dt*k1[i];
        }                
        k = simulationsmodell.berechneRechteSeite(yhilf,t);
        for(int i=0;i<simulationsmodell.getAnzahlGleichungen();i++)
        {
            k2[i] = k[i];
            yhilf[i] = yalt[i] + 0.5*dt*k2[i];
        }                
        k = simulationsmodell.berechneRechteSeite(yhilf,t);
        for(int i=0;i<simulationsmodell.getAnzahlGleichungen();i++)
        {
            k3[i] = k[i];
            yhilf[i] = yalt[i] + dt*k3[i];
        }                
        k = simulationsmodell.berechneRechteSeite(yhilf,t);
        for(int i=0;i<simulationsmodell.getAnzahlGleichungen();i++)
        {
            k4[i] = k[i];
        }                
        for(int i=0;i<simulationsmodell.getAnzahlGleichungen();i++)
        {
            yneu[i] = yalt[i] + (dt/6.0)*(k1[i]+2.0*k2[i]+2.0*k3[i]+k4[i]);
        }                
        return yneu;
    }     
    /** paint(..) wird bei der Konsolenanwendung nicht verwendet.*/
    public void paint(Graphics2D g)
    {
    }
}

Code 0-2: Runge-Kutta-Integrator RungeKuttaIntegrator.java

  • Mit Hilfe der Klassen LinearerSchwinger und TestRungeKuttaIntegrator ist ein einfacher Test des Runge-Kutta-Integrators möglich.
  • Entpacken Sie das nachfolgende .zip-File.
  • Gehen Sie über die Konsole in den Ordner ruku.
  • Kompilieren Sie die Klassen mit javac opti/*.java
  • Starten Sie das Testprogramm mit java opti/TestRungeKuttaIntegrator
ruku.zip - Testen des Runge-Kutta-Integrators
  • Mit Hilfe der Klassen Antrieb und TestAntrieb kann die Regelstrecke getestet werden.
  • Benutzung wie oben.
antrieb.zip - Test der Regelstrecke Antrieb