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
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
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
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
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
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
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
Konvergenz des Bisektionsalgorithmus
Wir untersuchen nun, wieviele Iterationen unser Algorithmus braucht um eine gegebene Genauigkeit zu erreichen:
Dienstag, 25. Juni 13
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
Newton-Raphson Algorithmus
Der Newton-Raphson Algorithmus beruht auf der lokalen Näherung der Funktion durch eine Tangente.
xixi+1
Dienstag, 25. Juni 13
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
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
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
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
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
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
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
Das Feld values wird in eine Datei „values.dat“ geschrieben und graphisch dargestellt.
Newton-Raphson Algorithmus und Fraktale
Dienstag, 25. Juni 13
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
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
Newton-Fraktal
DISLIN Ausgabe:
Dienstag, 25. Juni 13
Newton-Fraktal
Das Ergebnis ist ein Fraktal (Newton-Fraktal)!
x
y
Dienstag, 25. Juni 13
Top Related