22
Unterprogramme: Formalargumente und Übergabeargumente SUBROUTINE name(var1,var2,var3) Deklarationen ausführbare Anweisungen name= END SUBROUTINE name Der Aufruf des Unterprogramms: CALL name(a,b,c) Formalargumente Übergabeargumente Wichtig: Formalargumente und Übergabeargumente müssen in der Anzahl, Art(Datentyp) und Reihenfolge übereinstimmen! Dienstag, 25. Juni 13

Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

  • Upload
    dangbao

  • View
    219

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Unterprogramme: Formalargumente und Übergabeargumente

SUBROUTINE name(var1,var2,var3)Deklarationenausführbare Anweisungenname=END SUBROUTINE name

Der Aufruf des Unterprogramms:

CALL name(a,b,c)

Formalargumente

Übergabeargumente

Wichtig:

Formalargumente und Übergabeargumente müssen in der Anzahl, Art(Datentyp) und Reihenfolge übereinstimmen!

Dienstag, 25. Juni 13

Page 2: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Interne Unterprogramme

Da der Bisektionsalgorithmus etwas ist was wir immer wieder verwenden möchten, bietet es sich an ein Unterprogramm dafür zu implementieren. Wir zeigen zunächst wie man interne Unterprogramme implementieren

kann:

Aufruf des Unterprogramms bisection

Implementierung des Unterprogramms bisection

Dienstag, 25. Juni 13

Page 3: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Dieses Unterprogramm ist als „intern“ implementiert. Das Unterprogramm ist nur in dem Programm finitewell sichtbar.

Damit ist die Wiederverwendbarkeit eingeschränkt.

Aufruf des Unterprogramms bisection

Implementierung des Unterprogramms bisection

Interne Unterprogramme

Dienstag, 25. Juni 13

Page 4: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Das Programm besteht nun aus einem Hauptprogramm (main.f90), einer externen Funktion(func.f90) und einem externen Unterprogramm( bisection.f90):

main.f90func.f90

bisection.f90WICHTIG: Die Funktion func

muss überall wo sie aufgerufen wird als EXTERNAL deklariert werden

Externe Unterprogramme

Dienstag, 25. Juni 13

Page 5: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Unterprogramme und Funktionen können in Module zusammengefasst werden.

Syntax der Definition eines Moduls:

Module

MODULE nameDeklarationenFunktionenUnterprogrammeEND MODULE name

Ein Modul kann in einem Programm durch:

USE MODULE name verwendet werden.

Dies muss die erste Anweisung nach PROGRAM oder SUBROUTINE sein!

Dienstag, 25. Juni 13

Page 6: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

In unserem Beispiel bietet es sich an, den Bisektionsalgorithmus innerhalb eines Moduls zur Bestimmung der Nullstellen zu implementieren.

Diesem Modul können später weitere Algorithmen hinzugefügt werden!

Module

rootsolver.f90

Damit der Algorithmus für jede beliebige Funktion verwendet werden kann übergeben wir den Funktionsnamen als Parameter an das Unterprogramm bisection.

Dienstag, 25. Juni 13

Page 7: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

In unserem Beispiel bietet es sich an, den Bisektionsalgorithmus innerhalb eines Moduls zur Bestimmung der Nullstellen zu implementieren.

Diesem Modul können später weitere Algorithmen hinzugefügt werden!

rootsolver.f90 main.f90

Module

Dienstag, 25. Juni 13

Page 8: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Konvergenz des Bisektionsalgorithmus

Wir untersuchen nun, wieviele Iterationen unser Algorithmus braucht um eine gegebene Genauigkeit zu erreichen:

Dienstag, 25. Juni 13

Page 9: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Konvergenz des Bisektionsalgorithmus

main.f90

Wenn die Nullstelle bei der n-ten Iteration in einem Intervall der Breite εn war, wird sie bei der (n+1)-ten Iteration in einem halb so breiten Intervall sein:

Die für eine gewünschte Toleranz nötige Anzahl der Iterationen ist:

lineare Konvergenz!

Dienstag, 25. Juni 13

Page 10: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Newton-Raphson Algorithmus

Der Newton-Raphson Algorithmus beruht auf der lokalen Näherung der Funktion durch eine Tangente.

xixi+1

Dienstag, 25. Juni 13

Page 11: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Newton-Raphson Algorithmus

Algorithmus:

1.Rate einen Startpunkt xi

2.Berechne f(x) und f‘(x).

3.Approximiere die Funktion lokal durch die Tangente und bestimme die Nullstelle der Tangente:

5.Wenn die Schrittweite abs(xi+1 − xi) oder der Funktionswert f(xi+1) kleiner ist als eine Toleranzgrenze, stop.

6.Sonst i←i+1

7.Gehe zu (2).

Dienstag, 25. Juni 13

Page 12: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Newton-Raphson Algorithmus

Wir betrachten das Konvergenzverhalten des Newton-Raphson Verfahrens am Beispiel der Gleichung:

Dabei ist z eine komplexe Zahl. Die Lösungen dieser Gleichung sind:

Wir lösen die obere Gleichung durch Newton-Raphson-Iterationen:

Wir untersuchen systematisch zu welcher Lösung das Newton-Raphson Verfahren konvergiert, in Abhängigkeit vom Anfangspunkt für die

Iterationen.

Dienstag, 25. Juni 13

Page 13: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Komplexe Zahlen und Funktionen in FORTRAN

Wir definieren f(z) und f‘(z) innerhalb des Moduls „functions“::

COMPLEX(KIND=8) :: z

Deklaration des komplexen Datentyps:

Dienstag, 25. Juni 13

Page 14: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Komplexe Zahlen und Funktionen in FORTRAN

Da wir nun mit komplexen Funktionen arbeiten, müssen wir innerhalb des Moduls „rootsolver“ auch eine komplexe Version des Newton-Raphson

Algorithmus implementieren:

Dienstag, 25. Juni 13

Page 15: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Newton-Raphson Algorithmus und Fraktale

Das Konvergenzverhalten des Newton-Raphson-Verfahrens wird in einem quadratischen Bereich in der komplexen Ebene untersucht:

x=Re(z)

y=Re(z)

xmin xmax

ymin

ymax

Dienstag, 25. Juni 13

Page 16: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Das Hauptprogramm:

x=Re(z)

y=Re(z)

xmin xmax

ymin

ymax

Anzahl der Punkte in x- und y-Richtung

komplexe Lösungen der Gleichung:

Newton-Raphson Algorithmus und Fraktale

Dienstag, 25. Juni 13

Page 17: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Wir verwenden jeden Punkt aus dem Bereich [xmin, xmax]x[ymin, ymax] als Anfangspunkt für NR-Iterationen und ermitteln zu welcher der drei Lösungen (r1,r2,r3) der Algorithmus konvergiert. Der Wert wird in einem 2D-Feld values gespeichert (z.B. 0.0 für r1, 1.0 für r2 und -1.0 für r3).

x=Re(z)

y=Re(z)

xmin xmax

ymin

ymax

Eine komplexe Zahl a mit dem Real-Teil x und

Imaginär-Teil y.

Newton-Raphson Algorithmus und Fraktale

Dienstag, 25. Juni 13

Page 18: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Das Feld values wird in eine Datei „values.dat“ geschrieben und graphisch dargestellt.

Newton-Raphson Algorithmus und Fraktale

Dienstag, 25. Juni 13

Page 19: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Graphische Darstellung von Daten in FORTRAN

Alternativ können wir die Daten direkt aus dem FORTRAN-Programm graphisch darstellen. Wir verwenden dafür die Programmbibliothek DISLIN, die von der folgenden Seite heruntergeladen werden kann:

http://www.dislin.de

Dienstag, 25. Juni 13

Page 20: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Um die Ergebnisse direkt aus dem FORTRAN-Programm graphisch darzustellen, schreiben wir ein Unterprogramm plotfractal. Dieses Unterprogramm verwendet die Funktionen aus der Dislin-Bibliothek und stellt das Feld values graphisch dar.

Art der Ausgabe (z. B. XWIN, PNG, PDF, EPS, usw...)sorgt für den weißen Hintergrund

Initialisierung

Ende von Dislin

graphische Darstellung der Daten

Position und Länge der Achsen

Graphische Darstellung von Daten in FORTRAN

Dienstag, 25. Juni 13

Page 21: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Newton-Fraktal

DISLIN Ausgabe:

Dienstag, 25. Juni 13

Page 22: Unterprogramme: Formalargumente und Übergabeargumente · Alternativ können wir das Unterprogramm bisection und die Funktion als func „extern“, in separaten Datein, implementieren:

Newton-Fraktal

Das Ergebnis ist ein Fraktal (Newton-Fraktal)!

x

y

Dienstag, 25. Juni 13