kramann.info
© Guido Kramann

Login: Passwort:










2.6 Übung 2

Aufgabe 1

Postscript ist eine Skriptsprache, die von Druckern verarbeitet werden kann. Schon die Kenntnis weniger Befehle reicht aus, um damit Vektorgrafiken zu generieren. Typischerweise kommen in einer Befehlszeile erst ein paar Parameter und dann ein Schlüsselwort. Der Koordinatenursprung ist auf einem Blatt unten links. Die typische Dateiendung ist .ps, Beispiele:

Schlüsselwort Bedeutung Beispiels-Befehlszeile Erläuterung
setregcolor Stiftfarbe setzen 1.0 0.0 0.0 setrgbcolor Stiftfarbe auf rot
newpath Beginn eines neuen Linienzugs newpath -
moveto Stift ohne zu zeichnen zu Koordinate bewegen 200 100 moveto zu Position x=200, y=100 bewegen
lineto Gerade zu neuer Position ziehen 200 300 lineto Gerade zu x=200 y=300
stroke Linienzug ausführen stroke erst jetzt wird gezeichnet
fill Umschlossene Fläche füllen fill -

Tabelle 2.6-1: Elementare Befehle in Postskript.

%!PS-Adobe-3.0
0.0 1.0 0.0 setrgbcolor
newpath
100 100 moveto
200 100 lineto
200 200 lineto
100 200 lineto
100 100 lineto
fill
1.0 0.0 0.0 setrgbcolor
newpath
100 100 moveto
200 100 lineto
200 200 lineto
100 200 lineto
100 100 lineto
stroke
showpage

Code 2.6-1: Skriptbeispiel mit Postscript, Datei beispiel.ps

Sicht auf das Resultat von beispiel.ps (z.B. mit Ghostview geöffnet).

Bild 2.6-1: Sicht auf das Resultat von beispiel.ps (z.B. mit Ghostview geöffnet).

Das folgende Programm erzeugt ein Postscriptfile mit farbigen Dreiecken, wenn man es folgendermassen aufruft: postscript > datei.ps, oder unter Linux: ./postscript > datei.ps Ergänzen Sie eine Klasse Dreieck, mit der sich farbige gleichschenklige Dreiecke erzeugen lassen, die die gleiche Basisbreite haben wie die Quarate halb so hoch sind und versehen Sie im Ausgabe dokument alle Quadrate mit einem farbigen "Dach".

#include<iostream>

using namespace std;

class Quadrat
{
    public:
        double rot, gruen, blau;
        void setzeFarbe(double r, double g, double b)
        {
             rot   = r;
             gruen = g;
             blau  = b;
        }
        void lieferQuadrat(double x_pos, double y_pos) 
        {
             cout<<rot<<" "<<gruen<<" "<<blau<<" setrgbcolor"<<endl;
             cout<<"newpath"<<endl;
             cout<<100.0+x_pos<<" "<<100.0+y_pos<<" moveto"<<endl;
             cout<<200.0+x_pos<<" "<<100.0+y_pos<<" lineto"<<endl;
             cout<<200.0+x_pos<<" "<<200.0+y_pos<<" lineto"<<endl;
             cout<<100.0+x_pos<<" "<<200.0+y_pos<<" lineto"<<endl;
             cout<<100.0+x_pos<<" "<<100.0+y_pos<<" lineto"<<endl;
             cout<<"fill"<<endl;
        }
};

int main()
{
    Quadrat quadrat[4];
    quadrat[0].setzeFarbe(1.0,0.0,0.0);
    quadrat[1].setzeFarbe(0.0,1.0,0.0);
    quadrat[2].setzeFarbe(0.0,0.0,1.0);
    quadrat[3].setzeFarbe(0.2,0.2,0.2);

    cout<<"%!PS-Adobe-3.0"<<endl;

    quadrat[0].lieferQuadrat(10.0,10.0);
    quadrat[1].lieferQuadrat(210.0,10.0);
    quadrat[1].lieferQuadrat(210.0,210.0);
    quadrat[2].lieferQuadrat(410.0,210.0);
    quadrat[2].lieferQuadrat(410.0,410.0);
    quadrat[3].lieferQuadrat(10.0,410.0);

    cout<<"showpage"<<endl;
}

Code 2.6-2: Programm postscript.cpp zur Generierung folgenden Bildes:

Grafische Ausgabe der Datei datei.ps

Bild 2.6-2: Grafische Ausgabe der Datei datei.ps

Aufgabe 2

In der letzten Vorlesung wurde dargestellt, wie man eine Differentialgleichung der Form dA/dt = k*A numerisch integrieren kann. Das entsprechende Programm sieht folgendermaßen aus:

#include<iostream>

using namespace std;

int main()
{
    double k = 1.0/872542.0;
    double t = 0.0;
    double dt = 60.0;  //Variieren der Zeitschrittweite
//    double dt = 300.0;
//    double dt = 3000.0;

    double Anull = 20.0;

    double sekunden_tag = 60.0*60.0*24.0;
    double t_max = 30.0*sekunden_tag;

    int schritte = (int)(0.5 + t_max / dt);

    int schritte_pro_tag = (int)(0.5 + sekunden_tag/dt);
    int tag=0;
    double Aalt, Aneu;

    Aalt = Anull;

    for(int i=0;i<schritte;i++)
    {
        if(i%schritte_pro_tag==0)
        {
//            cout<<t<<" "<<Aalt<<endl;
            cout<<tag<<" "<<Aalt<<endl;
            tag++;
        }

        Aneu = Aalt + k*Aalt*dt;

        Aalt = Aneu;
        t    = t + dt;
    }

    return 0;
}

Code 2.6-3: see.cpp - Numerische Integration einer einfachen Differentialgleichung (Seerosenteich).

  • Schreiben Sie dieses Programm so um, dass folgendes Differentialgleichungssystem integriert wird:
dx/dt = v
dv/dt = -(C/m)*x

Code 2.6-4: Differentialgleichungssystem eines einfachen Schwingers.

  • Zu verwendende Parameter:
  • C=1N/m
  • m=1kg
  • Anfangsbedingungen:
  • x(t=0s)=1m
  • v(t=0s)=0m/s
  • Integrationszeitschrittweite:
  • dt=0.1s

Aufgabe 3

In folgender Programmvariante ist die Modellgleichung in einer Klasse beschrieben. Die aktuelle Steigung wird bei der Eulerintegration aus einem davon generierten Objekt ausgelesen.

#include<iostream>

using namespace std;

class Modell
{
  public:
    double k;
    double berechneF(double Aalt)
    {
        return k*Aalt;
    }
};

int main()
{
    Modell seerosen;

    seerosen.k = 1.0/872542.0;

//--------------------------------------------------------
    double t = 0.0;
    double dt = 60.0;  //Variieren der Zeitschrittweite
//    double dt = 300.0;
//    double dt = 3000.0;

    double Anull = 20.0;

    double sekunden_tag = 60.0*60.0*24.0;
    double t_max = 30.0*sekunden_tag;

    int schritte = (int)(0.5 + t_max / dt);

    int schritte_pro_tag = (int)(0.5 + sekunden_tag/dt);
    int tag=0;
    double Aalt, Aneu;

    Aalt = Anull;

    for(int i=0;i<schritte;i++)
    {
        if(i%schritte_pro_tag==0)
        {
//            cout<<t<<" "<<Aalt<<endl;
            cout<<tag<<" "<<Aalt<<endl;
            tag++;
        }

//        Aneu = Aalt + k*Aalt*dt;
        Aneu = Aalt + seerosen.berechneF(Aalt)*dt;

        Aalt = Aneu;
        t    = t + dt;
    }

    return 0;
}

Code 2.6-5: seeklasse.cpp - Objektorientierte Variante der numerischen Integration des Seerosenteich-Modells.

Ergänzen Sie in dem folgenden Programm die main-Methode so, dass nun auch für obiges Schwinger-Modell eine Klasse benutzt wird und dessen Objekt für die Integration benutzt wird:

class Modell
{
    public:
        double C,m;
        double berechneF(int zeile, double* y)
        {
            //y ist ein Array, das als erstes Element 
            //die alte Auslenkung x_alt enthält und
            //als zweites die alte Geschwindigkeit v_alt.
          
            //zeile gibt an, welche der beiden Modellgleichungen
            //jetzt berechnet werden sollen.

            //f0(y) = y(1)
            //f1(y) = -(C/m)*y(0)
            //y(0) == x_alt
            //y(1) == v_alt

            switch(zeile)
            {
                case 0:
                   return y[1];
                break;
                case 1:
                   return -(C/m)*y[0];
                break;
                default:
                   return 0.0;
                break;
            }
        }
};

Code 2.6-6: masseschwinger.cpp - mit main-Methode zu ergänzendes Programm.