Informatik und Numerik - Fachhochschule Bingen

Informatik und Numerik
Wintersemester
2015/16
3. März 2016
Bachelorstudiengang
Maschinenbau
Softwaretechnik
Top-Down-Entwicklung, Sprachkonstrukte,
Datenstrukturen, MatLab
Numerische Verfahren
Nullstellen, Integration,
Differenzialgleichungen, Lineare Algebra
Statistik
Stichprobe, Vertrauensintervall,
Prof. Dr. Dieter Kilsch
Fachbereich 2
Informatik, Technik und Wirtschaft
Weibull-Verteilungen
Inhaltsverzeichnis
Symbolverzeichnis
v
Einleitung
Kapitel I
§1
§2
§3
§4
§5
§6
vi
Softwareentwicklung
1
Phasen der Softwarekonstruktion
1.A
1.B
1.C
1.D
.
.
.
Anforderungen an die Softwarekonstruktion
Die Definitionsphase
.
.
.
.
Die Entwicklungsphase .
.
.
.
Die Betreuungsphase (Wartung)
.
.
Strukturierung und Sprachkonstrukte
2.A
2.B
2.C
2.D
2.E
2.F
2.G
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Kommunikation
.
.
.
.
.
.
Algorithmen
.
.
.
.
.
.
Wohlstrukturierte Programmierung
.
.
.
Darstellung der Sprachkonstrukte durch Flussdiagramme
Darstellung der Sprachkonstrukte durch Struktogramme
Darstellung der Sprachkonstrukte in einer Metasprache
Implementieren der Sprachkonstrukte in MatLab
.
Datentypen und einfache Datenstrukturen
.
.
.
.
.
.
.
.
.
.
1
1
3
4
5
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
7
7
10
12
15
17
20
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
23
23
23
28
30
.
.
.
.
.
.
.
.
Array)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
34
34
38
39
40
45
Formatieren, Dateiein- und -ausgabe
.
5.A
5.B
5.C
5.D
5.E
5.F
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
48
48
51
53
55
56
56
.
.
.
.
.
.
.
.
.
58
58
59
3.A
3.B
3.C
3.D
Speicherplatzgrößen
.
.
Festkommazahlen (INTEGER)
Gleitkommazahlen (REAL)
.
Einfache Datentypen
.
.
Datenstrukturen
4.A
4.B
4.C
4.D
4.E
.
.
.
.
Numerische Felder
.
.
Mengen
.
.
.
.
Verbund (Records, Structures)
Geschachtelte Felder (Nested Array,
Darstellung von Funktionen
.
.
.
.
.
Cell
.
.
.
.
.
Formatieren numerischer Werte (Kodieren, Verschlüsseln)
Lesen numerischer Werte (Dekodieren, Entschlüsseln)
Lesen von Textdateien .
.
.
.
.
.
Lesen geöffneter Dateien
.
.
.
.
.
Schreiben in Textdateien
.
.
.
.
.
Lesen und Schreiben in Excel-Dateien
.
.
.
Programmstrukturen
6.A
6.B
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Entstehung eines lauffähigen Programms
Bestandteile eines Programms
.
.
ii
.
.
.
.
.
.
Inhaltsverzeichnis
6.C
6.D
6.E
6.F
6.G
Kapitel II
§7
§8
§9
iii
Parameterübergabe bei Prozeduraufruf
Globale und lokale Daten
.
.
Speicherorganisation der Daten
.
Rekursiver Prozeduraufruf
.
.
Datenkapseln
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
71
71
73
74
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
76
76
79
80
.
.
.
.
.
.
Bisherige Verfahren als Iterationsverfahren
.
.
Kontrahierende Funktionen und Fixpunktsatz .
.
Das Newton-Verfahren als sukzessive Approximation
.
.
.
.
.
.
.
.
.
.
.
.
83
83
84
87
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
89
89
91
93
.
.
.
.
.
.
.
.
.
.
.
.
96
96
97
98
99
100
.
.
.
.
.
.
101
101
103
.
.
.
.
.
.
.
Das Newton-Verfahren .
.
.
Der Algorithmus von Steffensen (1933)
Nullstellen von Polynomen
.
.
Trapezregel .
.
Simpson-Regel
.
Romberg-Integration
.
.
.
.
.
.
.
.
Eulersches Streckenzugverfahren
Das Verfahren von Runge-Kutta
Modifizierte Euler-Verfahren .
Das Schießverfahren
.
.
Das Differenzenverfahren
.
§ 12 Solving Optimization Problems
12.A
12.B
.
.
.
.
.
.
.
.
.
.
.
.
Zeros of a function
Minimal Points
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Chapter III Numerical Methods in Linear Algebra
106
§ 13 Numerical Solution of a System of Linear Equations
13.A
13.B
13.C
13.D
13.E
Triangular Decomposition
Iterative Solutions of Systems
Orthogonalization
.
Tridiagonalization
.
Eigenvalues of a Matrix
.
.
.
.
of Linear Equations
.
.
.
.
.
.
.
.
.
.
.
.
§ 14 Ausgleichsrechnung, Links- und Pseudoinverse
14.A
14.B
14.C
14.D
14.E
14.F
Kapitel IV
61
63
64
65
67
.
.
.
.
§ 11 Numerische Verfahren für explizite Differenzialgleichung
11.A
11.B
11.C
11.D
11.E
.
.
.
.
.
.
.
.
.
§ 10 Numerische Integration
10.A
10.B
10.C
.
.
.
.
.
71
Sukzessive Approximation
9.A
9.B
9.C
.
.
.
.
.
.
.
.
.
Ein einführendes Beispiel
Das Bisektionsverfahren
Regula Falsi
.
.
.
.
.
.
Das Newton-Verfahren
8.A
8.B
8.C
.
.
.
.
.
Numerische Verfahren der Analysis
Bisektionsverfahren und Regula falsi
7.A
7.B
7.C
.
.
.
.
.
Problemstellung und Grundlagen
.
Algebraisch-geometrische Lösung
.
Analytische Lösung
.
.
.
Hauptachsen symmetrischer Matrizen
Singulärwertzerlegung einer Matrix
Ausgleichen von Messreihen
.
.
Statistik
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
106
106
108
111
112
114
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
117
117
118
121
123
126
127
131
iv
Inhaltsverzeichnis
§ 15 Grundlagen der Wahrscheinlichkeitsrechnung
15.A
15.B
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
131
131
133
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
137
137
138
.
.
.
.
.
.
.
.
Definition
.
.
.
.
.
.
.
.
.
Momente
.
.
.
.
.
.
.
.
.
Approximation einer Messreihe durch Weibull-Verteilungen
.
.
.
.
.
.
.
.
140
140
141
142
Grundlagen .
Zufallsvariable
§ 16 Grundlagen der Statistik
16.A
16.B
.
.
.
.
.
.
.
.
.
Schätzfunktionen für statistische Größen
Vertrauensintervall für Mittelwert
.
§ 17 Weibull-Verteilung
17.A
17.B
17.C
.
.
.
.
.
.
Literaturverzeichnis
149
Abbildungsverzeichnis
152
Tabellenverzeichnis
154
Algorithmenverzeichnis
155
Stichwortverzeichnis
156
Symbolverzeichnis
∁Ω A
Komplementärmenge von A in Ω
∃
N0
es gibt“, Existenzquantor, s. Mathematik 1
”
für alle“, Existenzquantor, s. Mathematik 1
”
gehört zu“, Element einer Menge, s. Mathematik 1
”
nicht-negative ganze Zahlen, vorzeichenlose ganze Zahlen
A
Komplementärmenge von A
131
P (A|B)
bedingte Wahrscheinlichkeit
132
%2$d
Formatangabe mit Reihenfolge
50
%5.2d
Dezimalzahl
49
%5.2E
Formatangabe Deziamlzahl Exponentialformat
49
%5.2e
Formatangabe Deziamlzahl Exponentialformat
49
%5.2f
Formatangabe Deziamlzahl
49
%5.2g
Formatangabe Deziamlzahl kompakt
49
%5.2G
Formatangabe Deziamlzahl kompakt
49
%5.2o
Formatangabe Oktalzahl
49
%5.2u
Formatangabe Dezimalzahl, positive ganze Zahlen ohne Dezimalteil
49
%5i
Formatangabe ganze Zahl
49
%x
Formatangabe Hexadezimalzahl
49
%X
Formatangabe Hexadezimalzahl
49
cellfun
Funktion auf Zellen anwenden
42
whos
von Variablen belegter Speicherplatz
40
∀
∈
131
v
73
73
19
23
Einleitung
Vom nicht-formalen Problem zum formalen Programm
Nicht-formales Problem der realen Umwelt
Intuitive
Abstraktion
beschreibend
Überprüfung,
Bestätigung
Spezifikation:
Lastenheft • Grobentwurf • Feinentwurf
Konstruktion
vorschreibend
Nachweis
(Beweis)
Formales Programm
Abb. 1: Nicht-formales Problem – formales Programm
Die Software-Technik befasst sich mit dem gesamten Prozess vom Erfassen eines nicht-formalen
Problems der Umwelt bis zu einem fertig erstellten, auf einem Rechner lauffähigen, formalen Programm. Sie entwickelt systematischen Methoden, Techniken und Hilfsmittel, die diesen Prozess
strukturieren und übersichtlicher gestalten. Besonders wichtig ist die Aufteilung der Gesamtentwicklung in verschiedene Phasen, deren Realisierung einen Vergleich mit den vorgesehenen Planungszeiten ermöglichen und so frühzeitig Planungsfehler in Bezug auf Projektdauer und -kosten
offenlegen.
Die Bedeutung der Software-Technik wird hervorgehoben durch folgende Fakten [43, S. 268ff]:
• Der Kostenanteil der Softwareentwicklung und -wartung an einem Gesamtprojekt stieg von
weniger als 20% (1955) auf über 85% (1985).
• Der Anteil der Wartungskosten an den Gesamt-Softwarekosten stieg auf 67% (1985).
• Der tatsächliche Zeitbedarf für ein Softwareprojekt übersteigt die geplante Projektzeit um
vi
vii
53% (Hardware: 17%), die tatsächlichen Kosten die geplanten Kosten um 72% (Hardware:
15%).
• Der Einsatz moderner Softwaretechniken verdoppelt fast die Produktivität in der SoftwareErstellung (10 - 15 Zeilen pro Tag auf 20 - 25 Zeilen pro Tag) und reduziert die Wartungskosten
um 10 - 20%.
Erwartungen an das fertige Programm
Was erwarten wir von einem Programm, genauer vom Rechner, auf dem das Programm läuft [29,
S. 45]:
(a) Ausführungsaspekt:
• korrekt:
– Das Programm macht, was programmiert ist.
– Das Programm macht, was spezifiziert ist.
– Das Programm macht, was der Anwender will. (s. §1)
• benutzbar: Das Programm kann vom Benutzer bedient werden.
• robust: Das Programm überlebt eine falsche Bedienung.
• effizient: In Bezug auf Speicherplatz und Laufzeit!
(b) Dokumentationsaspekt:
• lesbar: Das Programm ist gut kommentiert und auf verständliche Weise aus verständ”
lichen Teilen aufgebaut“ [46, S. 84].
• änderungsfreundlich: z.B.: zentrale Datenhaltung, . . .
• klar dokumentiert: Das Programm mit seiner Dokumentation dient der Kommunikation
des Entwicklers mit dem Wartungspersonal. 2/3 der Arbeit mit einem Programm ist
Wartung und Änderung.
(c) portabel: Auf andere Rechner übertragbar.
(d) billig in der Herstellung und Wartung.
Programmiersprachen müssen alle Aspekte unterstützen, zwischen den einzelnen Aspekten Es
gibt jedoch Konflikte. Sehr wichtig ist jedoch, dass Fehler in frühen Phasen riesige Kosten verursachen!
Ein Beispiel für das Problem der Korrektheit
Für Beispiele werden im wesentlichen die Sprachen APL, Fortran und Pascal herangezogen, ferner
wird eine Metasprache mit den einzuführenden Sprachkonstrukten benutzt. Das erste Beispiel ist
in Pascal notiert.
Die Fakultätsfunktion n! kann rekursiv programmiert werden:
Fak(n) := IF(n=0) THEN 1 ELSE n·Fak(n-1);
Ausgehend von der Definition der Fakultätsfunktion erscheint diese Anweisung logisch korrekt.
Was passiert beim Aufruf Fak(-5), oder gar Fak(.5)?
Das Programm rechnet ewig weiter!
viii
Einleitung
Kapitel I
Softwareentwicklung
§ 1 Phasen der Softwarekonstruktion
Literatur: Rembold [43, S.267 ff], Pomberger [40, S.6 ff], Meyer [31, S. 1 ff]
Die Definition und Entwicklung von Software wird heute nach der Methode der stufenweisen
Verfeinerung (Top Down Methode) durchgeführt. Sie läuft also in verschiedenen Phasen und Abschnitten ab.
Jeder Entwicklungsabschnitt verfeinert die Festlegungen des vorhergehenden Abschnitts. Er
besteht aus Tätigkeiten und einer Dokumentation der Tätigkeiten und Ergebnisse. Am Ende jedes
Abschnitts erfolgt eine kritische Überprüfung der Ergebnisse und Entscheidungen.
Beim Erkennen von Fehlern muss ein Abschnitt und eventuell frühere Abschnitte revidiert, also
wiederholt werden. Dies ist auch der Fall bei Änderungen der Aufgabenstellung.
Der Übergang zwischen den einzelnen Abschnitten ist fließend. Sie müssen für logisch unabhängig Teile eines Projekts nicht synchron durchlaufen werden, wobei die Gefahr einer umfangreicheren
Revision jedoch nicht unterschätzt werden darf.
Der gesamte Software-Lebenszyklus (Software Life Cycle) beinhaltet außer Definitions- und Enwicklungsphase noch die Betreuungsphase, die sich an die Auslieferung der Software an den Kunden
anschließt.
Die Entwicklung von Phasenmodellen ist sehr stark geprägt von der Notwendigkeit, den Zeitbedarf und die Kosten der Softwareentwicklung vorherzusagen und zu kontrollieren. Ein Auseinanderlaufen der geplanten und tatsächlichen Entwicklungszeit muss vermieden werden. Die Entwicklung
eines Programmpakets wird heute oft anhand eines Netzplans organisiert und kontrolliert.
Es existiert kein einheitliches Schema nach dem die Entstehung von Software vollzogen wird.
Es wird hier ein Modell mit 8 Abschnitten besprochen. Zunächst werden jedoch die Anforderungen
an das Endprodukt genannt.
1.A
Anforderungen an die Softwarekonstruktion
Die üblichen Qualitätsmerkmale einer Ware wie Beschaffenheit, Brauchbarkeit, Haltbarkeit oder
Fähigkeit müssen an die Besonderheiten des Produkts Software angepasst werden.
Im Vordergrund stehen zunächst die Funktion und die Bedienung. Im Unterschiede zu harten“
”
Waren kann Software leicht“ nachträglich geändert werden, wobei jedoch strenge Organisations”
und Kontrollmechanismen berücksichtigt werden müssen.
Der Wartungsanteil am Leben eines Softwareprodukts ist im Vergleich zu herkömmlichen Waren also wesentlich größer ([43, S.268]: 67%), es kommen damit noch weitere Qualitätsmerkmale
entscheidend hinzu.
1
2
I Softwareentwicklung
1.A.1
Definitionsphase
Korrektheit: Ein Programm ist korrekt, wenn es die Aufgabenstellung laut Spezifikation korrekt
ausführt. Die Korrektheit eines Programms kann nicht bewiesen werden, ein Programm kann
lediglich getestet werden.
Korrektheit sagt nichts über die Benutzbarkeit aus.
Korrektheit setzt eine korrekte Aufgabenstellung voraus. Sie muss konsistent (widerspruchsfrei)
und nach innen und außen vollständig sein. Eine korrekte Aufgabenstellung beinhaltet Aussagen über den regulären und den irregulären Ablauf (Fehler des Bedieners und Fehler in der
Umgebung).
Es existieren Werkzeuge zur Überprüfung der inneren Konsistenz und Vollständigkeit, nicht
jedoch der äußeren. Diese kann nur getestet werden.
Robustheit: Das Programm arbeitet auch unter außergewöhnlichen, nicht durch die Spezifikation
erfassten, Situationen gut.
Bedienungskomfort (Benutzerfreundlichkeit): Der Benutzer will einfach und effizient arbeiten und das Bedienen des Programms erlernen. Das erfordert eine gute Dialogführung für den
ungeübten und den routinierten Benutzer im regulären und irregulären Betrieb. Es muss also
auch robust sein.
Effizienz: Das Programm muss alle Ressourcen optimal nutzen: (Speicherplatz, Übertragungskanäle, Peripherie, Rechen-, Lauf-, Bediener-, Vorbereitungszeit, ... ).
1.A.2
Wirtschaftlichkeitsaspekt
Kompatibilität (Verträglichkeit): Das Programm kann mit anderen Programmen verbunden
werden, es kann mit anderen kommunizieren. Standardisierte Dateiformate und Datenstrukturen
sind für eine gute Kompatibilität erforderlich.
Wartbarkeit: Das Beheben von Fehlern und Anpassen an eine geänderte Systemumgebung in
hardwarenaher Software ist (einfach) durchführbar. Dies erfordert eine genaue und ausführliche
Dokumentation.
Adaptierbarkeit (Erweiterbarkeit): Die Software lässt sich leicht an eine geänderte Aufgabenstellung anpassen. Die Anpassung beschränkt sich dann in der Regel auf wenige Module.
Wiederverwendbarkeit: Die Software kann einfach an neue Bedingungen angepasst und für
neue Anwendungen verwendet werden.
Portabilität: Wie leicht kann das Programm auf verschieden Hard- und Software-Umgebungen
übertragen werden? Sind die Kosten der Übertragung der Software auf eine neue Rechnerkonfiguration höher als eine Neuentwicklung, so ist Portabilität nicht gegeben. Wichtig für die
Portabilität ist die Zentralisierung der Schnittstellen.
1.A.3
Wartbarkeitsaspekt
Lesbarkeit: Die Dokumentation von Software besteht aus Programmbeschreibung und Programmlisten. Letztere beinhalten die Realisierung des Produkts. Beide zusammen haben großen
Einfluss auf die Änderbarkeit und die Wiederverwendung der Software.
Die direkte Dokumentation in den Programmlisten muss um so detaillierter sein, je weniger
lesbar der Programmkode ist (Assembler, APL, Basic).
1 Phasen der Softwarekonstruktion
3
Strukturierung: Unter strukturierter Programmierung versteht man Methoden, die einen überschaubaren und leicht verständlichen Programmentwurf erzwingen. Wichtige Forderungen sind
die GOTO-freie Programmierung und das Verwenden von Schleifen und Alternativen.
Modularisierung: Ein Modul ist ein Programmteil, das getrennt entworfen, implementiert und
getestet wird. Wichtige, zu beschreibende Bestandteile sind seine äußeren Datenschnittstellen,
Datenobjekte und Prozeduren und ihre Effekte.
Verifizierbarkeit: Wie leicht können Abnahmeprozeduren, Testdaten, Prozeduren zur Fehlererkennung während der Garantie- und Betriebszeit erzeugt werden?
Integrität: Kann sich das Programmpaket gegen unberechtigten Zugriff auf seine Daten und
Programme oder deren Veränderungen schützen.
1.A.4
Hierarchie
Hierarchischer Entwurf: Planung, Entwurf und Dokumentation in mehreren Ebenen, entsprechend den Phasen der Softwarekonstruktion.
Hierarchischer Aufruf: Die Module sind in verschiedene Hierarchieebenen aufgeteilt. Es werden
3 Hierarchiearten unterschieden:
• allgemeine Hierarchie: Ein Modul ruft nur Module darunter liegender Schichten auf.
• strenge Hierarchie: Ein Modul ruft nur Module der nächstniedrigeren Schicht auf.
• baumartige strenge Hierarchie: Ein Modul ruft als einziger die Module der ihm zugeordneten
nächstniedrigeren Schicht auf.
1.B
Die Definitionsphase
Die erste Phase eines Projekts, die Definitionsphase, beginnt mit der Angebotsaufforderung durch
einen Kunden. Sind die Angaben des Kunden nicht ausreichend zum Erarbeiten eines Angebots,
so kann zunächst ein Angebot zu einer Studie unterbreitet werden.
In der Definitionsphase findet die Systemanalyse und -spezifikation statt. Es muss explizit festgelegt werden, was das zukünftige System leisten soll. Fehler in diesen Phasen beeinträchtigen
den späteren Projektablauf erheblich. Frühzeitig müssen die späteren Abschnitte der Tests
und der Abnahme vorbereitet und mit dem Kunden abgestimmt werden.
Die Definitionsphase besteht aus 2 Abschnitten, in denen festgelegt und beschrieben wird, was
realisiert werden soll:
(a) Analyse des Ist- und Soll-Zustands (Anforderungsanalyse):
Das Ziel dieses Abschnitts ist das Erstellen des Lastenhefts. Es ist kundenorientiert und
wird in enger Zusammenarbeit mit dem Kunden oder auch vom Kunden selbst erstellt. Das
Lastenheft enthält
(a1) die Zielsetzung.
(a2) die Beschreibung des zukünftigen Systems mit einer Unterscheidung in sofort zu realisierende Komponenten und später zu realisierende Komponenten.
(a3) die Beschreibung der Schnittstelle zwischen Rechnersystem und Umwelt (regulärer und
irregulärer Betrieb).
(a4) organisatorische, personelle und gesetzliche Randbedingungen; z.B.: Arbeitsbedingungen
beim Kunden für Entwicklung, Implementierung und Betreuung.
(b) Definition der Aufgaben (Spezifikation): Das Ziel dieses Abschnitts ist das Erstellen des Pflichtenhefts und das Unterzeichnen eines Vertrags. Das Pflichtenheft beschreibt die Aufgaben
rechnerorientiert. Es enthält
4
I Softwareentwicklung
(b1) eine Überprüfung der Vollständigkeit und Widerspruchsfreiheit der Aufgabenstellung.
Hierzu werden in verstärktem Umfang formale Hilfsmittel herangezogen (Spezifikationssprachen, Entwicklungswerkzeuge).
(b2) eine detaillierte Planung des Entwicklungsumfangs bezüglich Zeitdauer, Kosten, Personal
und Material.
Die Spezifikationen im Pflichtenheft erlauben ein Aufteilen der Aufgaben in Teilaufgaben, die
von den einzelnen Mitglieder der Projektgruppe selbständig gelöst werden können.
1.C
Die Entwicklungsphase
In der Entwicklungsphase wird festgelegt, wie das zukünftige System realisiert werden soll. Auch
werden Festlegungen zur Implementierung und zum Testen getroffen.
(c) Der Grobentwurf ist der erste Schritt im Festlegen der Realisierung des zukünftigen Systems.
Die Beschreibung kann noch auf einem abstrakten Niveau, ohne Einzelheiten des Systems
festzulegen, durchgeführt werden. Benutzt werden Methoden des hierarchischen und des modularen Entwurfs.
Es werden verschiedene Lösungsalternativen erarbeitet und untersucht. Hierzu zählen die
Möglichkeiten, existierende Software einzusetzen oder Neuentwicklungen durchzuführen. Die
Auswahl wird anhand akzeptierter Entscheidungskriterien getroffen.
Für die einzelnen Module wird die Aufgabenstellung definiert und die Testumgebung festgelegt. Die Schnittstellen zwischen verschiedenen Prozessen werden festgeschrieben.
Die Dokumentation des Grobentwurfs kann gegliedert sein in:
1. Zielsetzung des Automatisierungssystems
2. Aufgabenstellung
2.1 Beschreibung des Ist-Zustands
2.1.1 Beschreibung des regulären Betriebs
2.1.2 Beschreibung des irregulären Betriebs
2.2 Automatisierungs- und Aufgabenstellung
2.2.1 Forderungen bezüglich des Gesamtsystems
2.2.2 Forderungen bezüglich der Teilprozesse
2.2.3 Forderungen an die Schnittstellen
2.2.4 Zeitliche Forderungen
2.2.5 Aufgabenstellung bei Ausfällen und Fehlbedienungen
3. Erweiterungsmöglichkeiten
4. Spezifikation der Testdaten und -ergebnisse (Testplan)
In 2.2.2 ist insbesondere auf Alternativen und das gewähltes Lösungsverfahren einzugehen.
Inhaltlich müssen die Themen
• Hardwarekonfiguration,
• Software-Konzept einschließlich der Gliederung in Funktionseinheiten,
• externer und interner Speicherbedarf und
• Bedienungsvorschriften
behandelt werden.
1 Phasen der Softwarekonstruktion
5
(d) Der Feinentwurf: Mit den Methoden der modularen und strukturierten Programmierung werden die (Modul)entwürfe verfeinert. Die dynamischen Verbindungen (Schnittstellen) zwischen
den Moduln werden festgelegt. Ablaufpläne, Schnittstellenbeschreibungen, Aufstellpläne, Kabelpläne, . . . sind Bestandteile der Dokumentation.
Aufbauend auf der Gliederung des Grobentwurfs kann das Dokument folgende Aufteilung zur
Detaillierung von 2.2.2 des Grobentwurfs haben:
n. Teillösung
n.1 Beschreibung der gewählten Alternative
n.2 Zusätzliche Forderungen aufgrund der gewählten Lösung
n.3 Beschreibung der Lösungskomponenten
n.4 Beschreibung der Bedienungsfunktionen
n.5 Beschreibung des Datenmodells
n.6 Spezifikation der Kodeprüfung (Prozedur- und Modultests)
(e) Kodierung und Modultests: In diesem Abschnitt wird die Beschreibung im Feinentwurf umgesetzt in Prozeduren und Moduln. Bei der geforderten Detaillierung des Feinentwurfs ist dies
ein trivialer Schritt.
Die kodierten Prozeduren und Moduln werden entsprechend den Spezifikationen im Feinentwurf getestet, die Testergebnisse im Testbericht erfasst.
(f) Integration und Integrationstests: Nach der Integration des Gesamtsystems muss die Kor”
rektheit“ der Anlage nachgewiesen“ werden. Diese Korrektheit kann nicht bewiesen werden.
”
Die Zuverlässigkeit des Systems kann lediglich durch Tests, die nachweisen, dass die Anforderungen des Pflichtenhefts erfüllt werden, demonstriert werden. Während Prozedur- und
Modultests vom einzelnen Programmierer durchgeführt werden, erfordern Integrationstests
die Mitarbeit der gesamten Entwicklungsgruppe oder mehrerer Mitglieder.
Beim Testen von Software sind zu beachten:
(f1) Jede Programmzeile muss bei mindestens einem Test durchlaufen werden. Speziell ist
also auch die implementierte Fehlerbehandlung zu testen.
(f2) Es muss mit repräsentativen Daten und mit Daten im oberen und unteren Gültigkeitsbereich getestet werden.
(f3) Es muss mit ungültigen Daten im repräsentativen Bereich und im oberen und unteren
Bereich getestet werden.
(f4) Es müssen Belastungstest gefahren werden.
Im Verlauf der Integration und der Integrationstests muss die gesamte Dokumentation überarbeitet werden. Im Anschluss an die Integrationstests findet die Abnahme des Gesamtsystems
durch den Auftraggeber nach einem vereinbarten Ablaufplan statt.
1.D
Die Betreuungsphase (Wartung)
Diese Phase der Behebung von Fehlern und der Erweiterungen wird üblicherweise nicht durch die
Projektgruppe durchgeführt. Das Betreuungspersonal ist daher abhängig von der
• guten Dokumentation des Projekts, vor allem des Fein- und Grobentwurfs.
• Dokumentation der Änderungen.
• guten Konfigurationskontrolle und -dokumentation.
• Änderung der Dokumentationen aller Phasen, falls erforderlich.
(g) Gewährleistung: Dieser Abschnitt dauert in vielen Fällen 1 Jahr. Das Produkt muss in dieser
Zeit einer strengen Konfigurationskontrolle unterliegen. Der Kunde darf nicht unberechtigt in
die Software eingreifen, er muss Störungen schriftlich melden.
6
I Softwareentwicklung
(h) Softwarepflege: Der Kunde erhält Informationen über Neu- und Weiterentwicklungen der gelieferten Komponenten.
Fehlerbehebungen und Weiterentwicklungen werden innerhalb eines Rahmen- oder Einzelvertrags durchgeführt. Diese Verträge regeln auch die Konfigurationskontrolle der Anlage.
2 Strukturierung und Sprachkonstrukte
7
§ 2 Strukturierung und Sprachkonstrukte
Literatur: Ludewig [29], Schauer/Barta [46]
2.A
Kommunikation
I Know
You Believe You
Understand What You
Think I Said,
But I Am Not Sure,
You Realise, That
What You Heard,
Is Not What I Meant.
MDCCCCLXXV Jack Dusty
Die menschliche Sprache dient der Kommunikation mit anderen Menschen. Sie bedient sich
der Worte, die durch Klang, Betonung und Gestik eine genauere oder abgewandelte Bedeutung
erlangen. Diese Bedeutung beruht auf der bisherigen Erfahrung der an der Kommunikation beteiligten Menschen. Da diese Erfahrung im Allgemeinen nicht identisch ist, treten immer wieder
Missverständnissen auf.
Eine andere Quelle von Missverständnissen ist oft die Unzulänglichkeit, genau das auszudrücken,
was man meint (s.o.). Und diese Art von Missverständnissen kann man auch beim Umgang mit
einem Computer erleben. Die Kommunikation mit einem Rechner wird durch eine formale Programmiersprache ermöglicht, von der man annehmen kann, dass der Rechner sie beherrscht.
Kommunikationsfehler mit dem Rechner werden dadurch verursacht, dass der Programmierer
seine Gedanken und Ideen nicht korrekt in der Programmiersprache wiedergibt. Sie müssen durch
Tests offen gelegt werden und nach einer Fehlersuche und -analyse behoben werden. Die Fehleranalyse hat zu klären, ob der Programmierfehler in der Tat das beobachtete Fehlverhalten verursacht
hat.
2.B
Algorithmen
Ein Algorithmus ist eine Vorschrift, die genau angibt, wie ein Prozess oder ein Vorgang auszuführen
ist.
Vorschriften dieser Art finden wir überall im täglichen Leben:
• Multiplizieren zweier mehrstelliger Zahlen,
• Bedienen einer Kaffeemaschine,
• Fahren mit dem Auto,
• ...
Das Ziel des Programmierens ist es, einen vorgegebenen Prozess auf dem Rechner ablaufen zu
lassen. Wir müssen also einen Algorithmus, nach dem der Prozess ablaufen soll, festlegen und auf
den Rechner übertragen. Das Festlegen des Algorithmus ist Bestandteil des Feinentwurfs, in der
Kodierungsphase wird er auf den Rechner übertragen: er wird in einer (vorgegebenen) Programmiersprache kodiert.
Der Algorithmus muss in der Feinentwurfphase (s. Abb. 2.1) dokumentiert und später kodiert
werden. Welche Anforderungen werden an die Darstellung des Algorithmus gestellt?
Der Algorithmus soll
• aus einfachen Konstrukten aufgebaut sein.
8
I Softwareentwicklung
Grobentwurf
(Programmebene)
detaillierend
Feinentwurf
(Modulebene)
Modulbeschreibung
Algorithmus-Darstellung
Was leistet der Modul?
Wie arbeitet der Modul?
vorschreibend
Programmkode
Abb. 2.1: Feinentwurf
• leicht korrigierbar sein.
• wohlstrukturiert sein: Jeder Anweisungsblock hat einen Eingang und einen Ausgang.
Die Darstellung des Algorithmus soll
• lesbar und verständlich sein:
Für das Entwicklungsteam, die Qualitätskontrolle und das Wartungspersonal.
• aus einfachen Konstruktionen aufgebaut sein.
• leicht korrigierbar sein.
• eine gute Grundlage für die Kodierung sein.
• soll rechnergestützt sein.
Der Programmkode des Algorithmus soll
• logisch zu verstehen sein.
Versuchen Sie, den Algorithmus in der Pascal-Prozedur in Alg. 2.1 zu verstehen! Writeln
schreibt den eingeklammerten Text auf den Bildschirm, [29, S. 93]. Die Tatsache, dass der Kode
verständlich ist, liegt nicht allein an der Programmiersprache, sondern an der Art, wie man in der
gewählten Sprache programmiert. Das zeigt das gleiche Beispiel in Fortran in Alg. 2.2, wobei hier
die Funktion zum Schreiben auf den Bildschirm Write(5, ) heißt. Die Routine Pruefprim wurde
hier in einer Fortran-Version notiert, die jedoch gegenüber Pascal noch Einschränkungen in der
Länge der Namen der Variablen und Prozedurnamen hat.
2 Strukturierung und Sprachkonstrukte
PROCEDURE Pruefprim (n : INTEGER;
VAR prim : BOOLEAN;
VAR teiler: INTEGER);
CONSTANT kleinsteprim = 2;
BEGIN
IF n < kleinsteprim
THEN BEGIN
Writeln(’Falscher Parameter ’,n,’ für Pruefprim’);
teiler := 0;
prim := FALSE;
END
ELSE
BEGIN
teiler := kleinsteprim;
WHILE (teiler < n) AND (n mod teiler <> 0) DO
teiler := teiler + 1;
prim := (teiler = n);
IF prim
THEN Writeln (n, ’ ist Primzahl’)
ELSE Writeln (n, ’ hat den Teiler ’), teiler;
END
END;
Alg. 2.1 : Die wohlstrukturierte Prozedur Pruefprim (Pascal)
SUBROUTINE Pruefprim (n, prim, teiler)
IMPLICIT NONE
INTEGER n, teiler
LOGICAL prim
PARAMETER (kleiprim = 2)
IF (n .LT. kleiprim) THEN
Write(5,’(’’Falscher Parameter’’,I4,’’ für Pruefprim’’)’) n
teiler = 0
prim = .FALSE.
ELSE
teiler = kleiprim
WHILE ((teiler .LT. n) .AND. (n .EQ. (teiler*(n/teiler)))) DO
teiler = teiler + 1
ENDDO
prim = (teiler .EQ. n)
IF prim THEN
Write(5,’(I4, ’’ ist Primzahl’’)’) n
ELSE
Write(5,’(I4, ’’ hat den Teiler ’’,I4)’) n,teiler
ENDIF
ENDIF
RETURN
Alg. 2.2 : Die wohlstrukturierte Prozedur Pruefprim (Fortran 77)
9
10
I Softwareentwicklung
Vergleichen Sie hiermit die Fortran-Routine in Alg. 2.3. Die Ursache der Unlesbarkeit ist nicht
die zu benutzende ältere Fortran-Version, sondern die Art der Programmierung [29, S. 91].
10
11
20
30
40
42
70
72
80
SUBROUTINE Pruefpr0 (n, prim, nteiler)
LOGICAL prim
IF (n-2) 10, 40, 20
Write (6, 11) n
FORMAT (’falscher Parameter’, I6, ’für Pruefprim’)
nteiler = 0
GOTO 80
DO 30 nteiler = 2, n-1
IF (n - nteiler * (n/nteiler)) 30, 70, 30
CONTINUE
Write (6, 42) n
FORMAT (I6, ’ ist Primzahl’)
nteiler = n
prim = .TRUE.
RETURN
Write (6, 72) n, nteiler
FORMAT (I6, ’ hat Teiler ’, I4)
prim = .FALSE.
RETURN
END
Alg. 2.3 : Die Prozedur Pruefpr0 (Fortran)
Dieses Unterprogramm ist nicht lesbar, die Ursachen hierfür sind:
(a) keine Deklaration der Variablen (implizite Vereinbarung)
(b) arithmetisches IF
(c) 2 Ausgänge aus der Schleife (30, 70)
(d) 2 Ausgänge (RETURN)
(e) 2 Wege zu derselben Stelle ( zu Marke 40 und Marke 80)
(f) GOTO
Er ist nicht wohlstrukturiert, denn er hat mehrere Ausgänge, mehrere Ausgänge aus einer Schleife
und mehrere Wege zu einer Stelle.
2.C
Wohlstrukturierte Programmierung
Ein Modul besteht aus einem Modulkopf, einem Deklarationsteil und einem Anweisungsteil. Der
Modulkopf besteht aus der Aufrufzeile und der Beschreibung des Moduls nach außen. Der Deklarationsteil beinhaltet die Vereinbarung aller Variablen und Parameter, die in diesem Modul benutzt
werden. Im Anweisungsteil ist der Algorithmus, der in diesem Modul realisiert werden soll, kodiert.
Regeln für diese Kodierung werden hier behandelt.
Festlegung 2.1 Wohlstrukturierte Module und Modulteile (Anweisungsblöcke) besitzen einen Eingang und einen Ausgang. Zu jeder Stelle eines Blocks gibt es nur einen Weg. Wohlstrukturierte
Module verzichten auf GOTO. Sie bestehen aus vorgegebenen Sprachkonstrukten.
2 Strukturierung und Sprachkonstrukte
2.C.1
11
Sprachkonstrukte eines wohlstrukturierten Moduls
In der folgenden Liste sind die erlaubten Sprachelemente aufgeführt. Ein wohlstrukturierter Modul enthält die eingeklammerten Anweisungstypen nicht. Sie werden jedoch bei der Kodierung
in Programmiersprachen, die die wohlstrukturierten Konstrukte nicht besitzen, zum Nachbauen
(Emulation) dieser Konstrukte benutzt.
(a) Eine Anweisung in einem Programm ist
(a1) eine Wertzuweisungen,
(a2) eine bedingte Wertzuweisungen oder
(a3) ein Block (siehe unten).
(b) Der Anweisungsteil eines Programms besteht aus:
(b1) einer Sequenz (Folge) von Anweisungen,
(b2) parallele Anweisungen,
(b3) Iteration (Schleife):
i. abweisende Schleife, Schleife mit vorausgehender Prüfung (WHILE):
Die Bedingung, ob die Anweisungen der Schleife bearbeitet werden sollen, wird am
Anfang jedes Schleifendurchlaufs überprüft.
ii. nicht abweisende Schleife, Schleife mit nachfolgender Prüfung (UNTIL): Die Bedingung, ob die Anweisungen der Schleife bearbeitet werden sollen, wird am Ende
jedes Schleifendurchlaufs überprüft.
iii. Mengenschleife (FOR): Die Anweisungen der Schleife werden für jedes Element der
Menge (logisch parallel) bearbeitet.
iv. Zählschleife (FOR): Zählschleifen sind logisch Schleifen mit vorausgehender Prüfung
und auf diese Art in den meisten Programmiersprachen implementiert. Fortran77
bildet eine Ausnahme. Die Zählschleife ist in einigen Implementierungen abweisend,
in anderen nicht abweisend.
(b4) Alternative:
i. bedingte Verarbeitung: IF .. THEN .. ENDIF;
ii. einfache Alternative: IF .. THEN .. ELSE .. ENDIF;
iii. mehrfache Alternative:
• CASE
• IF .. THEN .. ELSEIF .. ELSEIF .. ELSE .. ENDIF;
(b5) Block: bestehend aus hier genannten Anweisungstypen
(b6) Prozeduraufruf
2.C.2
Weitere Sprachkonstrukte
Fehlende Sprachelemente einer Programmiersprache erzwingen hierzu eventuell Ausnahmen:
(a) allgemeine Schleife mit Abbruchkriterium
(b) Sprunganweisung:
• GOTO
• NEXT
• UNDO
• RETURN
Schauer und Barta [46, S. 85] unterscheiden daher drei Arten von Sprunganweisungen:
12
I Softwareentwicklung
(a) Notwendig sind Sprunganweisungen zur Realisierung von Kontrollstrukturen, die in der benutzten Programmiersprache nicht vorhanden sind.
(b) In gewissem Umfang vertretbar sind Sprunganweisungen zur Optimierung von Kode und
Laufzeit, zum Beispiel zum Verlassen von Strukturen im Fehlerfall.
(c) Sprunganweisungen zum Betreten von Strukturen sind zu vermeiden.
2.D
Darstellung der Sprachkonstrukte durch Flussdiagramme
Wichtig für die Dokumentation ist eine gutes Veranschaulichen des gewählten Algorithmus und
seiner Kodierung. Hierfür können benutzt werden:
(a) Flussdiagramm
(b) Struktogramm
(c) Pseudokode (Metasprache)
Die Konstruktionsteile der Flussdiagramme sind in Abb. 2.2 dargestellt, vgl. [29, S. 94f]. Schleife ohne Prüfung (j) und Abbruchanweisung (k) sind nicht Teil eines wohlstrukturierten Flussdiagramms.
Als Beispiel folgt das Flussdiagramm zur Routine Pruefpr0, wie sie in Abb. 2.3 programmiert
ist, vgl. [29, S. 92]. Sehr deutlich erkennt man, dass diese Routine nicht wohlstrukturiert ist. Die
Unterpunkte beziehen sich auf die eingekreisten Stellen:
(a) Eine Schleife wird irregulär verlassen.
(b) Zwei unterschiedliche Wege führen zu dieser Stelle. Sie ist nicht das strukturelle Ende einer
Schleife.
(c) Mehrere Ausgänge aus der Routine.
2 Strukturierung und Sprachkonstrukte
(a) Anweisung, Verarbeitung:
S
13
(f) Parallelverarbeitung:
S1
S2
S3
(b) Sequenz (Folge):
(g) Block:
S1
Block
S2
(h) Schleife mit vorausgehender Prüfung:
S3
✟❍
❍❍
❍❍ C ✟✟
❍✟
F ✟✟
(c) bedingte Verarbeitung:
T
✟❍❍
C ❍
❍
✟
❍❍✟✟
F ✟✟
T
S
(i) Schleife mit nachfolgender Prüfung:
(d) einfache Alternative:
✟❍❍
F
C ❍
❍
✟
❍❍✟✟
T ✟✟
S1
✟❍
✟✟ C ❍❍ T
❍❍
✟✟
❍✟
F
S2
(j) Schleife ohne Prüfung:
(e) mehrfache Alternative:
✟❍
✟✟ C1 ❍❍ F
❍❍
✟✟
❍✟ ✟✟❍❍
F
T
✟
❍ C2 ❍
✟
❍❍✟✟
T
S1
S2
S3
(k) Abbruchanweisung: Linie (zum Programmende), kein spezielle Symbol
Abb. 2.2: Elemente eines Flussdiagramms
14
I Softwareentwicklung
Pruefprim(n,prim,nteiler)
<0
n-2
=0
>0
Write(!falscher
Parameter ...!)
nteiler=2
nteiler=0
=0
a
n-nteiler
(n/nteiler)
Write(!... hat Teiler!)
6= 0
b
nteiler=nteiler+1
prim=.FALSE.
c
nteiler>n-1
RETURN
b
F
T
Write(!... ist Primzahl!)
prim=.TRUE.
c
RETURN
Alg. 2.4 : Flussdiagramm der Routine Pruefpr0
2 Strukturierung und Sprachkonstrukte
2.E
15
Darstellung der Sprachkonstrukte durch Struktogramme
Die Konstruktionsteile eines Struktogramms nach Nassi-Shniderman werden in Abb. 2.3 vorgestellt, vgl. [29, S. 94f]. Schleife ohne Prüfung (j) und Abbruchanweisung (k) sind nicht Teil eines
wohlstrukturierten Struktogramms.
(a) Verarbeitung:
(f) Parallelverarbeitung:
S
S1
S2
S3
S4
S5
(b) Folge:
S1
S2
S3
(g) Block, Prozeduraufruf:
P
(c) Bedingte Verarbeitung:
C
(h) Schleife mit vorausgeh. Prüfung:
WAHR
C
S
S
(i) Schleife mit nachfolgender Prüfung:
(d) Einfache Alternative:
S
C
WAHR
S1
C
FALSCH
S2
(j) Schleife ohne Prüfung:
(e) Mehrfache Alternative:
C1
S1
C2
S2
C3
S3
S
Cn
Sn
(k) Abbruchanweisung:
X
Abb. 2.3: Elemente eines Struktogramms
Zähl- und Mengenschleifen werden als Schleifen mit vorausgehender Prüfung dargestellt.
Als Beispiel folgt das Struktogramm der Routine Pruefprim in Alg. 2.5, vgl. [29, S. 97]. Hier
und in Alg. 2.6 wird der Operator /“ für die ganzzahlige Division benutzt. Ein korrekter MatLab”
Auddruck hierfür ist floor(n/teiler)
Man kann natürlich auch die unverständliche Routine Pruefpr0 aus Abb. 2.3 in dieser Form darstellten, daraus entsteht aber kein Struktogramm, denn die Darstellung ist nicht aus den erlaubten
Bestandteilen zusammengebaut [29, S. 97]. Dies ist in Alg. 2.6 dargestellt.
Kritikpunkte an diesen Beispielen:
16
I Softwareentwicklung
Pruefprim(n,prim,teiler):
Eingaben:
n
Ausgaben:
prim
teiler
{S natürliche Zahl}
{L Ist n eine Primzahl?}
{S kleinster Teiler größer 1
}
0: falsche Eingabe
n
WAHR
prim:=FALSCH
<
2
FALSCH
Writeln (‘Falscher
Parameter ‘,n,‘ für
Pruefprim‘);
teiler:=2
n 6= teiler · (n/teiler )
teiler:= teiler+1
prim:=(teiler=n)
prim
WAHR
teiler:=0
Writeln (n,‘
Primzahl‘);
FALSCH
ist
Writeln (n,‘ hat den
Teiler ‘,teiler‘);
Alg. 2.5 : Struktogramm der Routine Pruefprim
Pruefpr0(n,prim,teiler):
Eingaben:
n
Ausgaben:
prim
teiler
=2
{S natürliche Zahl}
{L Ist n eine Primzahl?}
{S kleinster Teiler größer 1
}
0: falsche Eingabe
n
>2
teiler = 2, n − 1
n = teiler ·
(n/teiler )
teiler:=0
WAHR
FALSCH
∅
Write(I6,‘ ist Primzahl‘) n
prim:= .TRUE.
UNDO
Write(I6,‘
hat Teiler ‘,
I6)n,teiler
Write(I4,‘Falscher
Parameter ‘) n
prim:= .FALSE.
Alg. 2.6 : Kein Struktogramm der Routine Pruefpr0
(a) Die Ausgabe enthält redundante Daten:
• n ist Primzahl ⇐⇒ teiler = n ∧ n ≥ 2
<2
2 Strukturierung und Sprachkonstrukte
17
• n ist falsche Eingabe ⇐⇒ teiler = 0
(b) Die Modularität eines Programms wird erhöht, falls die Berechnung von der Bildschirm-Ein/Ausgabe getrennt wird.
√
(c) Ist n = a · b, so ist einer der Faktoren höchstens gleich n. Daher reicht es vollkommen aus,
√
Teiler von n zwischen 2 und [ n] (Gaußklammer) zu suchen. Dies reduziert die Laufzeit für
Primzahlen n erheblich.
Das Struktogramm einer verbesserten Version steht in Alg. 2.7.
Pruefprim(n,prim,teiler):
Eingaben:
n
Ausgaben:
prim
teiler
{S natürliche Zahl}
{L Ist n eine Primzahl?}
{S kleinster Teiler größer 1
}
0: falsche Eingabe
n
WAHR
teiler:=0
<
2
FALSCH
teiler:=2
√
(teiler < n) ∧ (n 6= teiler · (n/teiler ))
teiler:= teiler+1
∅
teiler
=0
Writeln (‘Falscher
Parameter ‘,n,‘ für
Pruefprim‘);
>
√
n
Writeln (n,‘
Primzahl‘);
2 ≤ teiler ≤
ist
√
n
Writeln (n,‘ hat den
Teiler ‘,teiler‘);
Alg. 2.7 : Struktogramm der verbesserten Routine Pruefprim
2.F
Darstellung der Sprachkonstrukte in einer Metasprache
Die Darstellung eines Algorithmus soll
(a) lesbar und verständlich für Projektteam, Qualitätskontrolle und Wartungsteam,
(b) leicht korrigierbar,
(c) eine gute Vorlage für die Kodierung und
(d) rechnerunterstützt sein.
Das Erstellen und Ändern von Struktogrammen und Flussdiagrammen wird heute bereits durch
spezielle Softwarepakete rechnerunterstützt. Eine einfachere Art der rechnerunterstützten Darstellung bieten jedoch Metasprachen. Dies sind Sprachen, die, wie Programmiersprachen, eine fest
definierte Syntax besitzen, jedoch nicht direkt übersetzbar sein müssen. Zum Teil können jedoch
Software-Prototypen automatisch erstellt werden oder Teile des Kodes (halb-)automatisch erstellt
werden.
Hier wird eine Metasprache vorgestellt, die
(a) die oben definierten wohlstrukturierten Sprachkonstrukte in algolähnlichen Sprachelementen
enthält,
(b) mathematisch bekannte Zeichen und Ausdrücke benutzt,
18
I Softwareentwicklung
(c) nur Zeichen aus dem Zeichenvorrat des Rechners benutzt,
(d) aus dem Quellkode reproduzierbar ist oder im Quellkode als Kommentar enthalten sein kann,
(e) im Einzelfall erweiterbar ist.
2.F.1
Allgemeine Regeln
::=
dcl( .... );
;
,
2.F.2
beendet die Kopfzeile eines (Unter-)programms oder einer Funktion.
beinhaltet alle Vereinbarungen des (Unter-)programms oder der Funktion. Dieses
Sprachkonstrukt steht direkt unter der Kopfzeile. Die Vereinbarungen werden in
den folgenden Paragrafen über Datentypen und Datenstrukturen behandelt.
beendet ein Sprachkonstrukt. Die restlichen Zeichen einer Zeile sind Kommentar.
beendet ein Sprachkonstrukt, das mit dem folgenden Sprachkonstrukt parallel
verarbeitet werden kann. Die restlichen Zeichen einer Zeile sind Kommentar.
Namensvereinbarung
Erstes Zeichen
Kleinbuchstabe
weitere Zeichen
Kleinbuchstabe, Ziffer
Modul, Programm, Unterprogramm, Funktion
Großbuchstabe
Kleinbuchstabe, Ziffer
Begriff der Metasprache
Großbuchstabe
Großbuchstabe (Ziffer)
oder
Kleinbuchstabe, (Ziffer)
Variable, Parameter
Kleinbuchstabe
2.F.3
Ausdruck, bedingter und alternativer Ausdruck
Ein Ausdruck ist ein sinnvolles Gebilde aus Variablen, Parametern und Konstanten verkettet mit erlaubten Operatoren. Ein
Ausdruck kann auch alternativ sein:
Einfache alternative Ausdrücke haben keinen elseif -Teil, bedingte Ausdrücke weder einen elseif - noch einen else-Teil.
2.F.4
if log. Ausdruck then
Ausdruck;
elseif log. Ausdruck then
Ausdruck;
elseif log. Ausdruck then
Ausdruck;
else
Ausdruck;
endif
Einfache Anweisung
Einfache Anweisungen können sein:
(a) Wertzuweisungen:
Wertzuweisung:
bedingte Wertzuweisung:
alternative Wertzuweisung:
Variable := Ausdruck;
Variable := bedingter Ausdruck;
Variable := alternativer Ausdruck;
(b) Prozeduraufruf: Aufruf eines Unterprogramms oder einer Funktion. Diese werden später intensiver behandelt.
2 Strukturierung und Sprachkonstrukte
(c) Sprungbefehl:
goto marke;
..
.
19
marke hat den Typ SWITCH.1
marke: Anweisung
next;
Beendet Schleifendurchlauf
undo;
Beendet Schleifenbearbeitung
(d) Block: Zusammenfassung von einfachen Anweisungen, Alternativen, Iterationen, Prozeduraufrufen und Sprüngen.
2.F.5
Alternative
Einfache Alternativen haben keinen elseif -Teil, bedingte Alternativen weder einen elseif - noch einen else-Teil.
2.F.6
if log. Ausdruck then
Anweisung;
elseif log. Ausdruck then
Anweisung;
elseif log. Ausdruck then
Anweisung;
else
Anweisung;
endif
Iteration
(a) Schleife mit vorausgehender Prüfung:
Die Schleife wird durchlaufen, solange der logische Ausdruck
bei Beginn eines Schleifendurchlaufs wahr ist. Ist dieser logische Ausdruck bei Beginn des ersten Schleifendurchlaufs
falsch, so wird die Schleife überhaupt nicht durchlaufen.
while log. Ausdruck do
Anweisungen;
end
(b) Schleife mit nachfolgender Prüfung:
Die Schleife wird solange durchlaufen, bis der logische Ausdruck am Schleifenende wahr ist. Sie wird mindestens durchlaufen.
repeat
Anweisungen;
until log. Ausdruck ;
(c) Zählschleife:
i, anf, step und end sind gleichen Typs. Die Schleife wird in der angegebenen Reihenfolge
durchlaufen, im Falle
• step ≥ 0 für i ∈ {anf + n ·step | n ∈ N0 ∧ anf + n ·step ≤ end}
• step ≤ 0 für i ∈ {anf + n ·step | n ∈ N0 ∧ anf + n ·step ≥ end}
Ist diese Menge leer, so wird die Schleife nicht
durchlaufen. Vorsicht: Es gibt Sprachimplementiefor i=anf step step until end do
Anweisungen;
rungen, bei denen die Zählschleife mindesten einmal
end
durchlaufen wird. Viele Fortran-Compiler übersetzen nach diesem Prinzip.
(d) Mengenschleife:
i und menge müssen typgleich, menge Mengentyp sein (s. 4.B).
Die Schleife wird für jedes Element der Menge menge durchlaufen. Das Ergebnis der Schleifenbearbeitung darf nicht von der
Reihenfolge der Bearbeitung abhängen, die einzelnen Schleifendurchläufe dürfen also parallel verarbeitet werden.
1
for i ∈ menge do
Anweisungen;
end
Entsprechend früheren Ausführungen darf ein Sprungbefehl i.A. nur in der Fehlerbehandlung benutzt werden.
20
I Softwareentwicklung
Es folgen drei Beispiele. Die I/O-Routinen werden in der Fortran-Syntax in die Metasprache
aufgenommen.
(a) Im ersten Beispiel (Alg. 2.8) werden alle Zahlen, die in einer Datei stehen, aufsummiert. Jeder
Satz der Datei enthält eine Zahl.
Summe(sum) ::=
dcl(
i
type INTEGER*4;
eingelesene Zahl
sum
type INTEGER*4;
Summe der eingelesenen Zahlen
eof
type LOGICAL;
Dateiende ?
);
sum := 0;
repeat
Read(6,END=eof) i;
Datei-Ende: eof ist wahr
IF(not eof) sum := sum + i;
until eof ;
return;
Alg. 2.8 : Addition von Zahlen aus einer Datei
(b) Im zweiten Beispiel wird eine Meldung auf alle angemeldeten Bildschirme geschickt, s. Alg. 2.9.
Messag(text,tmenge) ::=
dcl( text
type CHARACTER*80;
tmenge
type SET INTEGER*4;
i type INTEGER*4;
);
for i ∈ tmenge do
Assign(5,’TT’,i);
Write(5) text;
end
return;
auszugebender Text
Menge der Nummern offener Bildsch.
Nummer eines offenen Bildschirme
Alg. 2.9 : Meldung auf alle angemeldeten Bildschirme
(c) Das dritte Beispiel in Alg. 2.10, 21 notiert die verbesserte Routine Pruefprim in der Metasprache. Im Gegensatz zum Struktogramm wird hier eine Rückgabe definiert.
2.G
Implementieren der Sprachkonstrukte in MatLab
Die Übertragung der Sprachkonstrukte in einer Programmiersprache, die diese Konstrukte nicht
kennt, erfordert ein einheitliches Emulieren dieser Konstrukte.
2 Strukturierung und Sprachkonstrukte
21
Pruefprim(n, r) ::=
dcl(
n
type INTEGER*4;
zu testende Zahl
r
type INTEGER*4;
0: Eingabefehler
;
1: n ist Primzahl
;
>1: kleinster Teiler
teiler
type INTEGER*4;
möglicher Teiler von n
kleinsteprim
type INTEGER*4;
kleinste Primzahl
kleinsteprim
:== 2; Parameter:
kleinste Primzahl
);
if n < kleinsteprim then
r := 0;
else
teiler := kleinsteprim;
√
while teiler ≤ n ∧ n mod teiler 6= 0 do
teiler := teiler+1
end
√
r := if teiler ≤ n then teiler else 1 endif
endif
if r=0 then
Write(5) ’Falsche Eingabe ’,n;
elseif r=1 then
Write(5) n, ’ ist Primzahl’;
else
Write(5) n, ’ hat den Teiler ’, r;
endif
Alg. 2.10 : Die verbesserten Routine Pruefprim in der Metasprache
2.G.1
Alternativer Ausdruck
MatLab kennt keine alternative Ausdrücke. Diese müssen als Alternativen implementiert werden
a := if l1 then
ausdr1
elseif l2 then
ausdr2
else
ausdr3
endif
if l1
a=ausdr1;
elseif l2
a=ausdr2;
else
a=ausdr3;
end
Am Ende jeder Zeile darf ein Semikolon oder Komma stehen. Werden die Zeilen zusammengezogen, so ist eines der beiden Zeichen erforderlich.
2.G.2
Alternative Anweisung
if l1 then
anweis1
elseif l2 then
anweis2
else
anweis3
endif
if l1
anweis1;
elseif l2
anweis2;
else
anweis3;
end
22
I Softwareentwicklung
oder
switch ausdruck
case wert1; anweis1;
case wert2; anweis2;
otherwise ; anweis3;
end
In der if-then-else-Konstruktion können mehrere logische Ausdrücke wahr sein, ausgeführt
wird der Ausdruck hinter dem ersten wahren logischen Ausdruck.
In der switch-case-Konstruktion darf bei jedem Durchlauf nur ein Fall zutreffen.
2.G.3
Iteration
(a) Schleife mit vorausgehender Prüfung:
while lwei do
anweis
end
while lwei
anweis;
end
(b) Schleife mit nachfolgender Prüfung:
repeat
anweis1
labr=ausdruck
anweis2
until labr ;
labr=0;
while ∼labr
anweis1;
labr= ausdruck;
anweis2;
end
Die Anweisungen bestehen aus den Anweisungen anweis1, einer Neuberechnung des logischen
Werts labr ( Wird abgebrochen?“) und den Anweisungen anweis2.
”
(c) Zählschleife:
for i=anf step step until end do
anweis
end
for i=anf:step:end
anweis;
end
Für step=1 kann :step“ entfallen.
”
(d) Mengenschleife:
for i ∈ menge do
anweis
end
for i=menge
anweis;
end
3 Datentypen und einfache Datenstrukturen
23
§ 3 Datentypen und einfache Datenstrukturen
Literatur: Rembold[43]
3.A
Speicherplatzgrößen
Wie werden Zahlen im Rechner gespeichert? Aufgrund der Organisation des Rechnerspeichers stehen für die Speicherung eine bestimmte Anzahl von SZellenßur Verfügung. Diese Anzahl kann bis
zu einer Obergrenze während der Programmierung oder des Programmlaufs gewählt werden:
Bit: kleinste, atomare Speichereinheit: Das Bit kann zwei Speicherzustände annehmen, die
durch 0 und 1 symbolisiert werden. Diese Einheit wird von manchen Sprachen (z.B: APL)
zur Speicherung logischer Größen benutzt.
Byte: Ein Byte sind 8 Bit. Diese Einheit wird von allen Sprachen für das Speichern eines Textzeichens benutzt2 . Ferner werden vorzeichenlose, ganze Zahlen in dieser Einheit gespeichert,
also die Menge [0, 255] ∩ N0 .
In dieser Einheit wird in vielen Programmiersprachen Speichergröße für die vereinbarten
Variablen festgelegt.
Wort: Ein Wort kann die Anzahl der Bit sein, die ein Prozessor verarbeitet oder auch die Anzahl
der Bit, die im Speicher mit einer Adresse angesprochen werden.
Tab. 3.1: Wortgrößen der Prozessoren
Wortgröße in Bits
8
16
32
64
80
Prozessor
8088
80286
80386
Rechnertype
PC
AT
PS
80.87
alle
Ab dem Pentium-Prozessor ist der mathematische Koprozessor im Hauptprozessor integriert.
3.B
3.B.1
Festkommazahlen (INTEGER)
Darstellung nicht-negativer Festkommazahlen
Festkommazahlen haben das Komma an einer fest vereinbarten Stelle, in der Regel meint man ganze
Zahlen.
Für die Speicherung von Festkommazahlen werden in der Regel 1, 2 oder 4 Byte benutzt. Es
stehen also 8, 16 oder 32 Bit zur Verfügung. Diese Anzahl wird mit t bezeichnet, die Bits werden
mit 0 beginnend nummeriert, also von 0 bis t − 1, s. Abb. 3.1. Das Bit t − 1 wird zur Speicherung
des Vorzeichens benutzt, die restlichen Bits 0, . . . , t − 2 sind Datenbits. Jedes Bit mit der Nummer
i enthält die Information ai ∈ {0, 1}. Damit kann eine Bitbelegung (0, at−2 , at−3 , ...a1 , a0 ) als Zahl
im Dualsystem interpretiert werden:
2
Im neuen Unicode-Format werden zwei Byte benutzt.
24
I Softwareentwicklung
...
at−1 at−2
t-1
t-2
a9
a8
a7
a6
a5
a4
a3
a2
a1
a0
9
8
7
6
5
4
3
2
1
0
Abb. 3.1: Nummerierung der Bits
Satz 3.1 (Speicherung nicht-negativer Festkommazahlen)
t−2
X
Die Zahl z =
ai 2i wird durch D (z ) = (0, at−2 , at−3 , . . . , a1 , a0 ) dargestellt.
i=0
Die kleinste so darstellbare Zahl ist (0, . . . , 0), also z = 0; die größte (0, 1, . . . , 1), also
zmax =
t−2
X
i=0
2i =
2t−1 − 1
= 2t−1 − 1 .
2−1
Damit können bei einer Darstellung mit t Bit unter Berücksichtigung eines Vorzeichenbits die
ganzen Zahlen im Bereich [0, 2t−1 − 1] dargestellt werden. Dies ist in Tab. 3.2 dargestellt. (zmin
wird erst weiter unten hergeleitet.)
Tab. 3.2: Darstellungsbereich der Festkommazahlen
Bezeichnung
Integer*2
Integer*4
(T10)
Anzahl
Byte
2
4
(10)
t
16
32
53
Anzahl
Datenbits
15
31
53
zmin = −2t−1
zmax = 2t−1 − 1
−32768
−2147483648
≈ −9·1015
32767
2147483647
≈ 9·1015
Bemerkung 3.2 (Überlauf ) Das theoretische Erscheinen von Stellen as = 1 (s ≥ t) in einem
Rechenergebnis bezeichnet man als Überlauf. Dieses Ergebnis ist im Rechner (üblicherweise) nicht
mehr darstellbar. Je nach Sprache und ihrer Implementierung verhält sich der Rechner unterschiedlich:
• Algol meldet einen Fehler.
• Fortran unterschlägt diese Stellen und arbeitet weiter.
• MatLab und APL wechseln zu dem Datenformat für Gleitkommazahlen (REAL).
3.B.2
Basiskomplementärdarstellung negativer Festkommazahlen
Am einfachsten“ werden negative Zahlen durch Setzen des Vorzeichenbits und der Darstellung
”
ihres Betrags im Datenteil dargestellt. Diese Methode bildet aber die Null als nicht-negative und
als nicht-positive Zahl auf (0, 0, . . . , 0) und (1, 0, . . . , 0) ab. Daher wird eine andere Methode
gesucht, die außerdem noch Berechnungsvorteile aufweist.
Bekannt ist diese Methode aus der Bezeichnung der Winkel. So werden Winkel im Bereich
[180◦ , 360◦ ) und negative Winkel [−180◦ , 0◦ ) identifiziert und beim Berechnen von Summen und
Differenzen werden am Ende die Reste modulo 360◦ betrachtet; ein 420◦ -Winkel wird mit 60◦
bezeichnet.
3 Datentypen und einfache Datenstrukturen
25
Definition 3.3 (Basiskomplementärdarstellung) Die Basiskomplementärdarstellung negativer
Zahlen bezogen auf die Basis b bei s Stellen wird angeben durch die Abbildung:


Ks,b (n) := 
[−b s , −1] → [b s , 2 b s − 1]
n
7→
2 bs + n


.

Beispiel 3.4


[−16, −1] → [16, 31]
K4,2 (n) := 
n
7
→
32 + n
hender Tabelle ab.


bildet entsprechend nebenste-

Worin liegt der Vorteil dieser Methode? Dies soll anhand des Zehnersystems mit zwei Stellen, also b = 10 und s = 2 untersucht werden. Nebenstehend ist die Addition der beiden Zahlen 31 und −26 dargestellt. Bei
normaler Addition in der rechten Spalte, also in der Basiskomplementärdarstellung, erhält man einen Wert über 200. Da das endgültige Ergebnis
auf nur zwei Stellen beschränkt ist, muss 200 subtrahiert werden und wir
erhalten das korrekte Ergebnis.
n
−1
−2
..
.
K4,2 (n)
31
30
..
.
−15
−16
17
16
Wert
31
+
−26
5
→
→
←
K2,10
31
+
174
205
Das Ergebnis kann auch anders gedeutet werden: Die Hunderterstelle arbeitet als Vorzeichenstelle: Ist sie ungerade, so ist die Zahl negative, ist sie gerade, so ist die Zahl nicht-negativ. Der
Vorteil dieser Methode besteht also im einfachen Addieren negativer und positiver Zahlen.
Was passiert bei Überlauf? Wir berechnen 31 + 72 im nebenstehenden
Schema.
Das Rechnen in der Basiskomplementärdarstellung entspricht also dem
Rechnen mit Resten modulo 2 · b s Also im ring Z/n Z. Wir stellen die
Reste dar im Bereich [−b s , b s − 1].
3.B.3
Wert
31
+
72
→
−97
←
→
K2,10
31
+
72
103
Duale Komplementärdarstellung negativer Festkommazahlen
Die Darstellung einer Zahl im Rechner benutzt t −1 Datenbits, also benutzen wir für die Darstellung
negativer Zahlen die Abbildung


Kt−1,2 (n) := 
[−2t−1 , −1] → [2t−1 , 2t − 1]
n
7
→
2t + n


.

Hieraus folgt sofort:
Verfahren 3.5 (Duale Darstellung von Festkommazahlen) Die Abbildung




Dt−1,2 (n) := 


[−2t−1 , 2t−1 − 1] →
[0, 2t − 1]
n
7→ n
n ∈ [0, 2t−1 − 1]
t
n
7→ 2 + n n ∈ [−2t−1 , −1]







bildet alle ganzen Zahlen aus dem Intervall [−2t−1 , 2t−1 − 1] injektiv, also umkehrbar, auf das
Intervall [0, 2t ] im Rechner ab und wir rechnen modulo 2t . Die kleinste darstellbare Zahl ist damit
zmin = −2t−1 , die größte ist zmax = 2t−1 − 1.
26
I Softwareentwicklung
Beispiel 3.6 Ist t = 4, so benutzen wir 3 Datenbits. Darstellbar sind die Zahlen [−8, 7] (im
Rechner: [0, 15]). Wir rechnen also modulo 16 und es gilt
−2 + −3 ≡ 14 + 13 = 27 ≡ −5
−5 + −6 ≡ 11 + 10 = 21 ≡ 5
(Überlauf)
5 + 4 ≡ 9 ≡ −7
(Überlauf)
Damit ist die Addition nicht-negativer und negativer Zahlen zurückgeführt auf die Addition
nicht-negativer Zahlen, die im Rechner als Addition von Dualzahlen einfach zu implementieren ist.
Als nächstes betrachten wir die Implementierung der Negation einer Zahl und damit der Subtraktion:
3.B.4
Duales Stellenkomplement einer Festkommazahl
Definition 3.7 (Stellenkomplement) Das Stellenkomplement zur Basis b berechnet zu einer
Zahl in jeder Stelle der Darstellung, einschließlich führender Nullen, die Differenz zu b − 1:
!
t−1
t−1
X
X
i
St,b
ai b :=
(b − 1 − ai )b i .
i=0
i=0
Folgerungen 3.8
t−1
X
n + St,b (n) =
i=0
t−1
X
=
i=0
=⇒
t−1
t−1
X
X
i
ai b +
(b − 1 − ai )b =
(ai + b − 1 − ai )b i
i
i=0
i=0
(b − 1)b i =
− n = St,b (n) + 1 − b
t
t−1
X
i=0
b i+1 − b i = b t − 1
Bei der Berechnung des Stellenkomplements müssen alle t Bit (Vorzeichenbit und Datenbits)
berücksichtigt werden. Mit s = t und b = 2 folgt für das duale Stellenkomplement
!
t−1
t−1
X
X
i
St,2
ai 2 :=
(1 − ai )2i .
(3.1)
i=0
i=0
und
−n = St,2 + 1 − 2t .
(3.2)
Da das Stellenkomplement bei b = 2 das Ändern des Bitwerts ist, kann man das Negative mit
Hilfe des Stellenkomplements einfach berechnen:
Verfahren 3.9 (Negative einer Zahl) Das Negative einer Zahl erhält man bei einer t-Bit-Darstellung durch Addition einer Eins zum Stellenkomplement
!!
!
t−1
t−1
X
X
−n = 1 + St,2
ai 2i
− 2t ≡ 1 + St,2
ai 2i
i=0
i=0
Beispiel 3.10 Das Negative der Zahl 103 bei einer 8-Bit-Darstellung (mit Vorzeichen) wird damit
berechnet nach
−103 = −(64 + 32 + 4 + 2 + 1) = −011001112 ≡ 1 + 100110002 ≡ 100110012 (256) .
Zur Kontrolle berechne ich
100110012 = 128 + 16 + 8 + 1 = 153 .
⋄
3 Datentypen und einfache Datenstrukturen
3.B.5
27
Umrechnung in ein anderes Zahlensystem
Wie lautet die Zahl 109 im Dualsystem, im Oktal- oder Hexadezimalsystem, also bezogen auf die
Basis 2, 8 oder 16? Im Hexadezimalsystem benutzen wir neben den Ziffern 0,1, ..., 9 noch die Ziffern
A, B, C, D, E und F mit den Werten 10, 11, 12, 13, 14 und 15. Gesucht ist also eine Darstellung
der Zahl 109 z.B. im Oktalsystem, also in der Form
109 = a2 · 82 + a1 · 8 + a0 = (a2 a1 a0 )8
oder allgemein die Darstellung der Zahl z zur Basis b
z =
s
X
ai b i = (as as−1 ...a1 a0 )b .
i=0
Dividieren wir z =
s
X
ai b i mit Rest durch b, so erhalten wir
i=0
z =
s
X
ai b
i−1
i=1
!
b + ao = r1 b + ao
mit
r1 =
s−1
X
ai+1 b i .
i=0
Wiederholen wir diesen Algorithmus, benannt nach Euklid3 , so erhalten wir:
Verfahren 3.11 (Euklidischer Algorithmus) Mit z = r0 berechnen wir nacheinander:
r0 = r1 b + a0
r1 = r2 b + a1
r2 = r3 b + a2
..
.
rs
= 0·b + as
Beispiel 3.12 Die Zahl 109 wird im Dual-, Oktal- und Hexadezimalsystem dargestellt:
109 = 54 · 2 + 1
109 = 13 · 8 + 5
27 = 13 · 2 + 1
1 = 0·8+1
54 = 27 · 2 + 0
13 = 6 · 2 + 1
13 = 1 · 8 + 5
109 = 6 · 16 + 13
6 = 0 · 16 + 6
6 = 3·2+0
3 = 1·2+1
1 = 0·2+1
Damit gilt 10910 = 11011012 = 1558 = 6D16 . Zur Probe berechnen wir:
• 11011012 = 26 + 25 + 23 + 22 + 20 = 64 + 32 + 8 + 4 + 1 = 109 ,
• 1558 = 1 · 82 + 5 · 81 + 5 · 80 = 64 + 40 + 5 = 109 ,
• 6D16 = 6 · 162 + 13 · 160 = 96 + 13 = 109 .
Der Übergang von der Dualdarstellung zur Oktal- oder Hexadezimaldarstellung kann vereinfacht
geführt werden. Jeweils 3 (bzw. 4) Stellen, beginnend mit der Einerstelle, werden zusammengefasst
und umgerechnet:
11011012 = (12 )(1012 )(1012 )8 = 1558 ,
11011012 = (1102 )(11012 )16 = 6D16 .
3
⋄
Euklid von Alexandria, gr. Mathematiker, ca. 365 - ca. 300 v. Chr.
28
I Softwareentwicklung
3.C
Gleitkommazahlen (REAL)
Der übliche Speicherplatzbedarf einer Gleitkommazahl ist 4 Byte (REAL*4), für die doppeltgenaue
Darstellung werden 8 Byte (REAL*8) benötigt. Pascal benutzt noch das Format REAL*6. Die Darstellungen der Gleitkommazahlen sind in den einzelnen Rechnern sehr unterschiedlich. Wir gehen
lediglich auf das Standardformat von IEEE4 ein (vgl. [20]), das vom mathematischen Koprozessor
unterstützt und von APL und MatLab benutzt wird.
3.C.1
Das IEEE-Gleitkommaformat
Definition 3.13 Eine gespeicherte Zahl x hat im IEEE-Gleitkommaformat die Darstellung
x = s(x ) · m(x ) · 2e(x ) .
Dabei sind:
• s(x ) = ± das Vorzeichen, es benötigt 1 Bit.
• m(x ) =
t−1
X
mi 2−i die Mantisse mit t logischen Bits.
i=0
Bei einer normalisierten Darstellung der Mantisse wird m0 = 1 verlangt. Die Mantisse hat
also die Gestalt m(x ) = 1. . . .. Stellt ein Rechner nur normalisierte Mantissen dar, so wird
die führende 1 oft nicht gespeichert. Dies ist beim Prozessor 80.87 bei den Formaten SHORT
REAL (REAL*4) und LONG REAL (REAL*8) der Fall.
• e(x ) =
n−1
X
i=0
ei 2i − bias der Exponent mit n Bits.
bias wird gewählt, um negative und positive Exponenten darstellen zu können. In der Regel
wird
bias = 2n−1 − 1
gewählt.
Oft wird der kleinste Exponent (−bias) und der größte Exponent ( 2n−1 − bias) nicht genutzt.
Diese können dann zur Charakterisierung nicht-normalisierter Zahlen, Unterlauf und Überlauf
herangezogen werden.
Als Beispiele betrachten wir die Standard-Formate des mathematischen Koprozessors 80.87:
SHORT REAL (Real*4), LONG REAL (Real*8) und T10 (Real*10). Die Anzahl der zur Speicherung benutzten Bits ist durch den Angabe der Bytes geklärt. Interessant bleiben Fragen nach der
Anzahl der logischen Bit, minimalem und maximalem Exponenten, dem darstellbaren Zahlbereich
und der Darstellung nicht-normalisierter Zahlen.
Festlegung 3.14 (Gleitkommaformate des mathematischen Koprozessors)
und der größte Exponent werden nicht genutzt. In allen Formaten gelten also
Der kleinste
• bias = 2n−1 − 1 ,
• emin = 1 − bias = 1 − 2n−1 + 1 = 2 − 2n−1 und
• emax = 2n − 2 − bias = 2n − 2 − 2n−1 + 1 = 2n−1 − 1 = bias .
SHORT REAL und LONG REAL erlauben nur normalisierte Mantissen und haben damit ein
logisches Bit weniger Speicherbedarf.
Folgerungen 3.15
(a) Die größte darstellbare positive Zahl ist
!
t−1
X
2−t − 1 emax
zmax =
1 · 2−i · 2emax = 1
·2
= (1 − 2−t ) 21+emax ≈ 21+emax
/2 − 1
i=0
log10 (zmax ) ≈ log10 (2) · (1 + emax ) = log10 (2) · 2n−1 ≈ 0.301 · 2n−1 .
4
Institute of Electrical and Electronic Engineers, Normen 754 und 854
3 Datentypen und einfache Datenstrukturen
29
(b) Für die kleinste normalisierte positive Zahl gilt
log10 (zmin ) = log10 1 · 20 · 2emin ≈ log10 (2) · emin ≈ 0.301 · 2 − 2n−1 .
(c) Die kleinste nicht-normalisierte positive Zahl ist
log10 (zn,min ) = log10 1 · 2−(t−1) · 2emin ≈ log10 (2) · (emin + 1 − t)
≈ 0.301 · 3 − 2n−1 − t .
Dies ist der kleinste Abstand zwischen Maschinenzahlen.
(d) Die Maschinengenauigkeit wird oft als ε angegeben, wenn z1 := 1 + ε die kleinste Maschinenzahl größer 1 ist. In der Mantisse von 1 + ε ist das erste und letzte Bit gesetzt, der Exponent
null:
z1 = (20 + 21−t ) · 20 = 1 + 21−t .
Tab. 3.3 gibt einen Überblick über die Zahlenformate.
MatLab enthält die Konstanten eps, realmin und realmax für die Maschinengenauigkeit, die im
LONG-Format kleinste und größte darstellbare Zahl, s. Tab. 3.5.
Tab. 3.3: Gleitkommaformate des math. Koprozessors
Format
SHORT
LONG
T10
3.C.2
log. Stellen
Mant. Exp.
t
n
24
53
64
8
11
15
Speicherplatz
Mant. Exp.
23
52
64
8
11
15
bias
=
emax
emin
127
1023
16383
−126
−1022
−16382
log10
(zmax ) (zmin )
38
308
4932
−37
−307
−4932
nur
normal.
ja
ja
nein
ε
≈
10−6.9
10−15.6
10−19.0
Gebrochene Dualzahlen und Darstellungsfehler
Wie werden rationale Zahlen in gebrochene Dualzahlen konvertiert? Der ganze Teil wird nach dem
euklidischen Algorithmus, s. 3.11, berechnet. Der echte Restbruch wird, wie beim berechnen der
Dezimalstellen, durch Division des Zählers durch den Nenner und Multiplikation des Rests mit der
Basis gewandelt. Dies wird an einem Beispiel erläutert:
Beispiel 3.16 (Umrechnung von Brüchen in Dualpunktdarstellung)
(a) Nach der Abtrennung des ganzen Anteils
7
1
1
= 210 +
= 102 +
3 10
3 10
3 10
1
muss jetzt noch
als Dualpunktzahl geschrieben werden. In
3
jedem Schritt wird der Rest, im ersten der vorhandene Zähler,
zunächst mit 2 multipliziert. Nach zwei Schritten beginnt die
Periode,
wir
erhalten als Ergebnis
1
7
= 0.012 und
= 10.012 = 1.0012 · 21 .
3 10
3 10
1 : 3 = 0 Rest 1
(1 · 2) : 3 = 0 Rest 2
(2 · 2) : 3 = 1 Rest 1
(1 · 2) : 3 = 0 Rest 2
Ihre normalisierte Darstellung im SHORT-Format lautet demnach 1.001010101..01 · 21 . Die
Mantisse besitzt 23 Nachkommastellen, die Zahl wird abgerundet dargestellt. Ihre normalisierte Darstellung im LONG-Format lautet 1.001010101....010 · 21 . Die Mantisse besitzt 52
Nachkommastellen, die Zahl wird aufgerundet dargestellt.
30
I Softwareentwicklung
(b) Analog ergibt sich
1
= 0.000112 = 1.10012 · 2−4 .
10 10
Die 53. Nachkommastelle ist eine Eins, also wird auch 1/10 in der Darstellung als LONG-Zahl
aufgerundet.
⋄
Beispiel 3.17 (Darstellungsfehler)
7
(a) Die Zahl
= 1.0012 · 21 wird bei der Darstellung im SHORT-Format mit 24 Bits nach
3 10
unter gerundet, denn die 24. Nachkommastelle der Mantisse ist 0. Der Fehler ist hierbei
1
1
e = (0 − .01)2 · 2−23 · 21 = · 2−22 =
· 2−20 ≈ 0.08 · 10−6 ≈ 8 · 10−8 .
3
12
Sie wird bei der Darstellung im LONG-Format mit 53 Bits nach oben gerundet, denn die 53.
Nachkommastelle der Mantisse ist 1. Der Fehler ist hierbei
2
1
−52
1
e = 1 − .10 2 · 2
·2 = 1−
· 2−51 = · 2−50 ≈ .17 · 10−15 ≈ 2 · 10−16 .
3 10
6
1
= 1.10012 · 2−4 wird bei der Darstellung im SHORT-Format mit 24 Bits
(b) Die Zahl
10 10
nach oben gerundet, denn die 24. Nachkommastelle der Mantisse ist 1. Der Fehler ist hierbei
12
1
−23
−4
e = 1 − .1100 2 · 2
·2 = 1−
· 2−27 = · 8 · 2−30 ≈ 1.6 · 10−9 .
15 10
5
Sie wird bei der Darstellung im LONG-Format mit 53 Bits nach oben gerundet, denn die 53.
Nachkommastelle der Mantisse ist 1. Der Fehler ist hierbei
9
2
−52
−4
·2 = 1−
· 2−56 = · 16 · 2−60 ≈ 6 · 10−18 = 10−17 .
e = 1 − .1001 2 · 2
15 10
5
3.D
Einfache Datentypen
Definition 3.18 (Einfache Datentypen) Der Datentyp legt die zu speichernde Datenart fest.
Die üblichen einfachen Datentypen sind in Tab. 3.4 gelistet.
Tab. 3.4: Einfache Datentypen
Name
Bedeutung
INTEGER
REAL
COMPLEX
LOGICAL
CHARACTER
Festkommazahlen
Gleitkommazahlen
komplexe Gleitkommazahlen
logische Größen
Texte
Standardgröße in Byte
APL
MatLab
8
16
1/8
1
8
16
1
1
Bemerkung 3.19 (Numerische Datentypen) Standardmäßig speichern MatLab und APL numerische Daten im doppelt-genauen LONG-Format (REAL*8). MatLab stellt Konvertierungsroutinen zum Erzeugen der Formate
• einfach-genau: short,
• ganzzahlig: intn mit n = 8, 16, 32, 64 Bits.
• vorzeichenlos ganzzahlig: uintn mit n = 8, 16, 32, 64 Bits.
3 Datentypen und einfache Datenstrukturen
31
• komplex: complex(a,b) liefert a+bi, also a + j b; complex(a) a + j 0.
MatLab bezeichnet den Speicherplatzbedarf und die Routinen bei der Konvertierung in Festkommazahlen nicht die Anzahl der Bytes sondern die Anzahl der Bits. Die Konvertierungsroutinen zum
Erzeugen ganzzahliger Zahlen runden zur nächsten ganzen Zahl. 0.5 wird zum größeren Betrag hin
gerundet.
MatLab kennt aber keine Festkommaarithmetik. Bei jeder numerischen Operation werden die
Operanden zunächst in Gleitkommazahlen konvertiert, dann die Operation ausgeführt und, falls
eine der Zahlen eine Festkommazahl ist, das Ergebnis wieder in dasselbe Festkommaformat gewandelt: int8(pi)+4.9 ergibt den Wert 8!
Andere Rundungsroutinen sind floor und ceil (ceiling), die ab, bzw. aufrunden. Diese sind in
MatLab und APL (Ä, Ó) vorhanden.
MatLab kennt noch die Rundungsroutinen round (rundet zur nächstgelegenen ganzen Zahl, bei
.5 zur betragsgrößeren) fix (rundet zur nächstgelegenen betragskleineren ganzen Zahl, also immer
in Richtung Null).
Frage 3.20 Interessant erscheinen generell folgende Fragen, die letzten drei habe ich bereits besprochen, die ersten drei werden im weiteren Verlauf behandelt.
(a) Wie unterscheiden sich einfach und mehrfach belegbare Datenspeicherplätze?
(b) Wie müssen die Datentypen vereinbart werden?
(c) Welche Operationen sind für die einzelnen Datentypen erlaubt?
(d) Wie werden die Zahlen physikalisch dargestellt?
(e) Welcher Zahlbereich kann dargestellt werden?
(f) Wie ist der Überlauf organisiert?
3.D.1
Einfach und mehrfach belegbare Größen und ihre Datentypvereinbarung
Wir beginnen mit den ersten beiden Punkten aus 3.20, die in MatLab und APL keine wirklich Rolle
spielen aber in vielen anderen Sprachen wichtig sind. Ihre inhaltliche Bedeutung ist jedoch auch in
diesen Sprache wichtig.
Definition 3.21 (Variable, Parameter, Konstanten) Es gibt verschiedene logische Speicherungsarten für Daten, die sich in der Wertbelegung und den Benutzungsmöglichkeiten unterscheiden:
Variable: Speicherplatzhalter mit Namen, dem immer wieder neu ein Wert zugewiesen werden kann.
Konstante: Speicherplatzhalter ohne Namen mit einmal festgelegtem Wert.
Parameter: Speicherplatzhalter mit Namen mit einmal festgelegtem Wert.
Tab. 3.5 enthält die wichtigsten MatLab-Konstanten, die aber nicht konstant sind. MatLab speichert sie als Variable! Die Syntax vieler Programmiersprachen (Fortran, Algol, Pascal, Java,
. . .) verlangt an bestimmten Stellen (z. B. Dimensionsvereinbarungen für Felder, s.u.) Konstanten
oder Parameter, sie erlaubt an diesen Stellen keine Variablen. Diese Problem tritt weder bei MatLab
noch bei APL auf, da es keine statische Dimensionsvereinbarungen gibt. Diese Programmiersprachen kennen den Typ Parameter nicht.
Bemerkung 3.22 (Datentypvereinbarung) Viele Programmiersprachen (Algol, Pascal, C, Java . . .) verlangen, dass vor dem Benutzen einer Größe diese mit der Angabe der zu benutzenden
Bytes zu deklarieren. INTEGER*4“ legt eine Festkommazahl mit 4 Bytes fest, REAL*8“ eine Gleit”
”
kommazahl mit 8 Bytes fest. Damit liegt die Speicherplatzbelegung und der Wertebereich der Variablen fest. Bei MatLab und APL wird durch eine Zuweisung (Wertbelegung) der Typ festgelegt
oder geändert. Der Standardtyp für numerische Daten ist doppelt-genau.
32
I Softwareentwicklung
Tab. 3.5: Variable“ Konstanten in MatLab
”
3.D.2
MatLab
Bedeutung
pi
i
j
eps
realmin
realmax
Inf
NaN
π(Kreiszahl)
j (imaginäre Einheit)
j (imaginäre Einheit)
relative Maschinengenauigkeit für Gleitkommazahlen ε = 2−52
kleinste positive Gleitkommazahl: 2−1022
größte Gleitkommazahl: (2 − ε)21022
unendlich
Keine-Zahl (Not-a-Number)
Operationen auf den Datentypen
Die Operationen und das Erzeugen von Konstanten sind in Tab. 3.6 zusammengefasst.
Tab. 3.6: Einfache Datentypen in MatLab und erlaubte Operationen
Typ
DOUBLE
INTEGER*n
(n ∈ {1, 2, 4, 8, 16})
COMPLEX
CHAR
LOGICAL
innere
Operationen
Vergleichsoperationen
Konstanten
+ - * / ^
< <= == >= > ∼=
1 3.57 15.4E+23
int8(12) int8(-2)
+ - * / ^
== ∼= (< <= >= >)
< <= == >= > ∼=
< <= == >= > ∼=
3.57E+14+1.5i
’a’ ’*’
0 1
& | ∼ xor any all
Bemerkung 3.23 (Zusätzliche Funktionen für komplexen Zahlen) Für reelle Zahlen a und
b oder eine komplexe Zahl z = a + j b berechnen
(a) complex(a,b) die komplexe Zahl z = a + b j,
√
(b) abs(z) den Betrag |z | = a 2 + b 2 ,
(c) angle(z) den Argumentwinkel anglearg(z)∈ [−π, π],
(d) real(z) den Realteil Re(z ) = a,
(e) imag(z) den Imaginärteil Im(z ) = b,
(f) conj(z) die komplex konjugierte Zahl z̄ = a − j b.
Der Befehl compass(z) stellt die komplexe Zahl z als Zeiger“ grafisch dar.
”
Die MatLab-Implementierung der komplexen Zahlen beinhaltet folgende Eigenschaften:
Bemerkung 3.24
(a) Der MatLab-Typ einer komplexen Zahl ist double.
(b) Die Vergleiche < <= >= > beziehen sich bei komplexen Zahlen ausschließlich auf den Realteil.
Der logische Ausdruck complex(3,4)<complex(3,5) hat den Wert falsch.
Auf einige MatLab-Besonderheiten sei hingewiesen:
3 Datentypen und einfache Datenstrukturen
33
Bemerkung 3.25 (MatLab-Besonderheiten)
(a) MatLab rechnet grundsätzlich im Format REAL. Sind die Operanden beide Festkommazahlen,
so wird das Ergebnis wieder in dieses Format gewandelt, also zur nächstgelegenen ganzen
Zahl gerundet.
(b) class(a) gibt den Typ der Variablen a an.
(c) isreal(a), islogical(a) gibt an, ob die Variable a den gewünschten Typ hat.
(d) Die Funktionen true und false erzeugen die Werte 0 und 1.
(e) Der kleiner-gleich“-Vergleich (a <= b) bei logischen Größen ist genau dann wahr, wenn a
”
falsch oder b wahr ist. Er ist damit eine Ersatzfunktion für die logische Implikation a⇒b.
(f) Die üblichen numerischen Operationen können auch auf CHAR-Größen angewandt werden.
Vor der Ausführung dieser Operation wird das Zeichen in seinen ASCII-Kode gewandelt. Die
Funktion char wandelt den ASCII-Kode in das Zeichen. Damit liefert char(’a’+5) das fünfte
Zeichen nach a“.
”
34
I Softwareentwicklung
§ 4 Datenstrukturen
4.A
Numerische Felder
MatLab kennt weder Skalare noch Vektoren. Das Standardformat sind zweidimensionale Felder
(Matrizen). Skalare Größen werden als (1, 1)-Matrizen, Vektoren als einzeilige Matrizen gespeichert.
Allgemein beendet ; einen zu berechnenden Ausdruck, ohne dass das berechnete Ergebnis am
Bildschirm ausgegeben wird. Soll das Ergebnis am Bildschirm sichtbar werden, muss , den Ausdruck
abschließen. Fehlen diese Zeichen am ende einer Zeile, so wird das berechnete Ergebnis ausgegeben.
4.A.1
Verknüpfungen auf numerischen Felder
Festlegung 4.1 (Erzeugen von Feldern, Auswahl von Komponenten)

(a) m = [1 2 3 4;5 6 7 8] oder m = [1:4;5:8] erzeugt die Matrix m = 
1 2 3 4
5 6 7 8


.
(b) m(2,3) liefert 7, m(:,1:3) die ersten drei Spalten, m(:,end-2:end) die letzten drei und
m(:,1:2:4) die erste und dritte Spalte.


0 0
0


 1
1
1




 2
4
8

.
(c) v = [0:5]’; w = [v v.^2 v.^3] erzeugt w = 

 3
9
27



 4 16
64 


5 25 125
(d) m(:) liefert die Komponenten der Matrix als Spaltenvektor, m(:)’ als Zeilenvektor.
(e) length(w) liefert 6, die Länge der längsten Achsen. Bei einem Vektor also seine Größe.
(f ) size(w) liefert 6 3, die Länge jeder Achse. size(w,1) die Länge der ersten, size(w,2) die
Länge der zweiten Achse. length(size(w)) die Anzahl der Achsen.
(g) MatLab speichert die Inhalte einer Matrix spaltenweise und erlaubt den Zugriff mit der Elementnummer: m(5) liefert damit das Element m(1,3), also 3.
(h) y = reshape(w,2,9) erzeugt eine (2,9)-Matrix aus den Daten von w, reshape(w,2,3,3)
ein dreiachsiges Feld.
 Hierbei muss beachtet werden,dass MatLab die Daten spaltenweise
0 2 4 0 4 16 0 8 64 
gilt.
speichert, also y = 
1 3 5 1 9 25 1 27 125
(i) y = repmat(m,3,4) erzeugt eine (6,16)-Matrix durch vervielfältigen der Matrix m, dreimal
in vertikaler, also erster Achsrichtung und viermal in Richtung der zweiten Achse:


1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4


 5 6 7 8 5 6 7 8 5 6 7 8 5 6 7 8 




 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 

y=


 5 6 7 8 5 6 7 8 5 6 7 8 5 6 7 8 


 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 


5 6 7 8 5 6 7 8 5 6 7 8 5 6 7 8
(j) zeros(n) erzeugt die Nullmatrix des Typs (n,n), zeros(n,m) erzeugt die Nullmatrix des Typs
(n,m).
(k) ones(n) erzeugt eine Matrix des Typs (n,n), ones(n,m) ein Matrix des Typs (n,m), die nur
aus Einsen besteht.
(l) eye(n) erzeugt die Einheitsmatrix des Typs (n,n), eye(n,m) eine Matrix des Typs (n,m) die
auf
 der links
 oben beginnenden Diagonalen Einsen und sonst nur Nullen hat. eye(2,3) liefert
1
0
0

.
0 1 0
4 Datenstrukturen
35

(m) diag([1 2 3 4]) erzeugt die Diagonalmatrix






1
0
0
0
0
2
0
0
0
0
3
0
0
0
0
4







.
(n) diag([1 2 3 4],1) erzeugt die Matrix, deren obere, diag([1 2 3 4],-2) deren zweite untere Nebendiagonale aus den angegebenen Zahlen besteht.
(o) Für eine mindestens zweispaltige oder zweizeilige Matrix liefert diag(m) die Diagonale als
Vektor, mit obigem Beispiel also [1, 6]. Entsprechend liefert diag(m,2) die zweite obere
Nebendiagonale, also [3, 8], und diag(m,-1) die (erste) untere Nebendiagonale, also [5].

1 0 0
(p) tril(m) erzeugt die untere Dreiecksmatrix von m: 
5 6 0

1 2
Dreiecksmatrix mit der ersten oberen Nebendiagonalen: 
5 6
untere Dreiecksmatrix ab der ersten unteren Nebendiagonalen

1
(q) triu(m) erzeugt die obere Dreiecksmatrix von m: 
0

0
ecksmatrix ab der ersten oberen Nebendiagonalen 
0
Dreiecksmatrix ab der ersten unteren Nebendiagonalen
2
6
2
0




0
0
0
7
0
5

,
tril(m,1) die untere

0
und tril(m,-1) die
0

0 0 0
.
0 0 0

3 4
, triu(m,1) die obere Drei7 8

3 4
und tril(m,-1) die obere
7 8

1 2 3 4
.
5 6 7 8
(r) magic(n) erzeugt eine (n,n)-Matrix mit gleicher Spalten- und Zeilensumme.
(s) rand(n) erzeugt gleichmäßig verteilte Zufallsmatrix des Typs (n,n).
(t) randn(n) erzeugt normal verteilte Zufallsmatrix des Typs (n,n).
Tab. 4.1: Numerische Verknüpfungen von Matrizen
Symbol
Bedeutung
+
Addition, auch (komponentenweise) Matrixaddition
-
Subtraktion, auch (komponentenweise) Matrixsubtraktion
*
Multiplikation, auch Matrixmultiplikation (nach dem Falk-Schema)
\
Linksdivision von Matrizen, s. 4.2
/
Rechtsdivision von Matrizen, s. 4.2
^
Potenzieren: Basis und Exponent müssen quadratisch sein, eine der
beiden skalar
’
komplex konjugieren und Transponieren
.*
komponentenweise Multiplikation
.\
komponentenweise Linksdivision
./
komponentenweise (Rechts-)Division
.^
komponentenweises Potenzieren
.’
Transponieren (ohne komplexe Konjugation)
36
I Softwareentwicklung
In MatLab sollen alle numerischen Verknüpfungen die in der Mathematik übliche Bedeutung
haben. So stehen +“ für die Matrixaddition und *“ für die Matrixmultiplikation, obwohl sie
”
”
grundsätzlich verschieden berechnet werden. Eine alternative Berechnungsvorschrift wird mit .*“
”
bezeichnet. Die numerischen Verknüpfungen sind in Tab. 4.1 gelistet.
Bemerkung 4.2 (Matrixdivision) Die Linksdivision A\B berechnet die Lösung des linearen Gleichungssystems A · X = B:
(a) Ist A invertierbar, so entspricht dies A−1 · B.
(b) Bei überbestimmten (größenmäßig gültigen) linearen Gleichungssystem A · X = B wird eine
Lösung im Sinne der linearen Ausgleichsrechnung berechnet, s. 14.8.
(c) Bei unterbestimmten (größenmäßig gültigen) linearen Gleichungssystem A · X = B wird eine
Lösung im Sinne der Pseudoinversen berechnet, s. 14.10.
Analog berechnet die Rechtsdivision B/A die exakte, ausgeglichene, oder pseudoinverse Lösung des
linearen Gleichungssystems X · A = B. Dies entspricht B · A−1 , falls A invertierbar ist.
Diese Definition muss man beachten, wenn einer der Faktoren ein Skalar (genauer eine 1-1Matrix) ist. Für einen Zeilenvektor v berechnet
• 5\v die Lösung der Gleichung 5 · ~x = ~v , und damit die komponentenweise Division, während
v\5 die pseudeo-inverse Lösung des linearen Gleichungssystems ~v · ~x = 5 ermittelt. ~x ist dann
ein Spaltenvektor gleicher Länge wie der Zeilenvektor ~v .
• berechnet v/5 die Lösung der Gleichung ~x · 5 = ~v , und damit die komponentenweise Division,
während 5/v zu einem Fehler führt, weil ~x · ~v = 5 kein gültiges lineares Gleichungssystem ist:
~x · ~v ist eine Matrix mit der gleichen Spaltenanzahl wie der Zeilenvektor ~v .
Sind ~v und w
~ Spaltenvektoren gleicher Länge, so berechnet v\w die ausgeglichene Lösung der
Gleichung ~v · x = w
~ und damit das Vielfache des Vektors ~v , das w
~ am nächsten liegt.
4.A.2
Numerische Funktionen auf Feldern
Die Vielzahl der Funktionen, die MatLab zu Verfügung stellt, kann hier nur angedeutet werden. Die
MatLab-Hilfe gibt einen Überblick.
Viele dieser Funktion arbeiten entlang einer Achse, die voreingestellt ist und durch Eingabe
festgelegt werden kann. Die Voreinstellung ist für echte Matrizen die erste Achse (vertikal). Da
Vektoren einzeilige Matrizen sind, gibt es hier ein Widerspruch zwischen struktureller und logischer
Voreinstellung, die MatLab im Sinne der logischen Voreinstellung löst. Dies kann zu Problemen
führen, wenn man außer Acht lässt, dass einzeilige Matrizen als Vektoren behandelt werden.
Bemerkung 4.3 (Weitere Operationen auf Vektoren) v, w bezeichnen Vektoren, also einzeilige oder einspaltige Matrizen, gleicher Länge. Es berechnen
(a) norm(v) den Betrag des Vektors v. Was berechnet abs(v)?
(b) dot(v,w) das Skalarprodukt und liefert damit für Vektoren als einzeilige Matrizen dasselbe
Ergebnis wie v*w’.
(c) cross(v,w) das Kreuz- oder Vektorprodukt der dreidimensionalen Vektoren v und w.
Bemerkung 4.4 (Weitere Operationen auf Matrizen) MatLab bietet Operationen zum Berechnen der Inversen und Determinante quadratischer Matrizen an. Diese Algorithmen sind aufwändigen, ihre Ergebnisse beinhalten zum Teil erhebliche Rundungsfehler.
(a) det(m) berechnet die Determinante und
(b) inv(m) die Inverse der Matrix m, falls ihre Determinante nicht null ist.
Zum Lösen von linearen Gleichungssystem ist das berechnen der Inversen zu aufwändig. Hier bietet die Linksmultiplikation nach Tab. 4.1 eine bessere Lösung. Die numerischen Methoden dieser
Algorithmen werden im Numerik-Teil dieses Skripts behandelt.
4 Datenstrukturen
37
Bemerkung 4.5 (Achsabhängig arbeitende Funktionen)
Tabelle arbeiten entlang der ersten (vertikalen) Achse.
Die Funktionen in der folgenden
Ist m ein (5,6)-Matrix, so berechnet mean(m) spaltenweise
den Mittelwert der in m gespeicherten Werte, liefert also
einen 6-elementigen Zeilenvektor. mean(m,1) liefert den Mittelwert entlang der ersten Achse, mean(m,2) den Mittelwert
entlang der zweiten Achse, also zeilenweise. Ist v ein Vektor,
also eine einzeilige Matrix, so liefert mean(v) den Mittelwert
des Vektors, mean(v,1) den Mittelwert entlang der ersten
Achse, also den Vektor v und mean(v,2) den Mittelwert der
Komponenten des Vektors.
Name
Bedeutung
mean
std
sum
prod
max
min
Durchschnitt
Standardabweichung
Summe
Produkt
Maximum
Minimum
std, sum und prod verhalten sich gleich. max und min dagegen sind anders festgelegt: Der Ausdruck max(m) liefert einen 6-elementigen Vektor mit den Maximalwerten jeder Spalte und max(v)
das Maximum der in v gespeicherten Werte. Allgemein liefert max(m1,m2) komponentenweise das
Maximum der Matrizen m1 und m2 gleicher Größe, wobei eine der beiden Variablen auch eine skalare
Größe sein darf. Ein mögliches drittes Argument bezeichnet die Achsrichtung. max(m,[],1) liefert
spaltenweise das Maximum, min(m,[],2) das zeilenweise Minimum.
Dieses Beispiel zeigt, dass das strukturelle Verhalten der Funktionen bei Achsangabe unterschiedlich ist. MatLab versucht die Eingaben auf ihren Sinn hin zu prüfen. Dies führt meiner Meinung nach eher zu Verwirrungen als zu Klarheit. Der Anwender muss auf jeden Fall gründlich in
der MatLab-Dokumentation lesen, um zu wissen, was diese Funktionen bei Matrizen und Vektoren
berechnen.
Bemerkung 4.6 (Skalare Operationen) Ist einer der beiden Operatoren eine skalare Größe, so
wird diese mit jeder Komponente verknüpft. Das entspricht bei * der Skalarmultiplikation. [1 2
3]*7 ergibt den Vektor (7, 14, 21).
4.A.3
Logische Indizierung
Für den Vektor v=[-1:5] liefert der logische Ausdruck v>1 das Ergebnis
0 0 0 1 1 1 1.
Die Funktion find(v>1) gibt für den logischen Vektor 0 0 0 1 1 1 1 die Indizes mit logischem
Wert wahr“ an:5
”
4 5 6 7
Der Ausdruck v(find(v>1)) schließlich gibt die Werte in v an, die größer 1 sind:
2 3 4 5
Dieser Ausdruck kann kürzer formuliert werden. v(v>1) liefert dasselbe Ergebnis.
Definition 4.7 (Logische Indizierung) Ist m eine mehrzeilige Matrix und l eine logische Matrix
gleicher Größe, so liefert m(l) einen Spaltenvektor der Komponenten, für die die zugehörige lKomponenten wahr ist.
Ist v eine einzeilige Matrix (also ein Vektor) und l eine logische Matrix gleicher Größe, so liefert
v(l) einen Zeilenvektor der Komponenten, für die die zugehörige l-Komponente wahr ist.
Diese logische Indizierung kann auch für Wertzuweisungen benutzt werden, eine effiziente Möglichkeit, umständliche Fallunterscheidungen und Schleifen zu vermeiden. Hierin sehe ich die Gründe
für die Leistungssteigerung bei feldorientierten Sprachen wie MatLab und APL .
Bemerkung 4.8 (Logische Indizierung bei Wertzuweisungen)
m=[’abcdefg’;’hijklma’] ändert der Ausdruck
5
Bei der (2,7)-Textmatrix
Allgemein gibt find(v) die Indizes der von null verschiedenen Komponenten von v an.
38
I Softwareentwicklung
m(m==’a’)=’A’
die beiden ’a’ zu ’A’:
Abcdefg
hijklmA
4.A.4
Numerische Felder mit drei und mehr Achsen
Durch m=[1 2 3;4 5 6;7 8 9] wird eine (3,3)-Matrix definiert. Der Ausdruck
m(:,:,2)=[11,12,13;14,15,16;17,18,19] definiert zusätzlich zu Zeilen und Spalten eine
dritte Achse. Diese wird in MatLab Seite“ genannt. Jetzt liefern m(3,2,1) die Zahl 8 und m(3,2,2)
”
die Zahl 18.
Beispiel 4.9 Alternativ kann die Funktion cat benutzt werden:
m= cat(3,[1 2 3;4 5 6;7 8 9],[11,12,13;14,15,16;17,18,19])
baut dieselbe drei-achsige Matrix auf, m=cat(3,m,reshape([-1:-1:-9],3,3)) fügt eine dritte Seite mit den negativen Zahlen von -1 bis -9 hinzu. s. Abb. 4.1
MatLab hält einige Überraschungen für Felder mit mehr als zwei Achsen bereit:
(a) Für m=[1 2 3;4 5 6] liefert n=reshape(m,[1,size(m)]) wie erwartet ein dreiachsiges Feld
it den Achslängen 1, 2 und 3. reshape(m,[size(m),1]) fügt keine Achse am Ende hinzu.
(b) Auch repmat fügt am Ende keine Achse der Länge 1 hinzu, aber am Anfang oder in der Mitte.
(c) Werden beim Zugriff auf Felder Achsen einelementig, so werden diese am Ende entfernt.
Einelementige Achsen am Anfang bleiben erhalten, s. Abb. 4.2
>> format compact
>> m=[1 2 3;4 5 6;7 8 9];
>> m=cat(3,m,reshape([11:19],3,3)’);
>> m=cat(3,m,reshape([-1:-1:-9],3,3))
m(:,:,1) =
1
2
3
4
5
6
7
8
9
m(:,:,2) =
11
12
13
14
15
16
17
18
19
m(:,:,3) =
-1
-4
-7
-2
-5
-8
-3
-6
-9
>> format compact
>> m=repmat(5,[3,3,1,3]);
>> size(m)
ans =
3
3
1
3
>> size(m(1,1,:,:))
ans =
1
1
1
3
>> size(m(:,:,:,1))
ans =
3
3
Abb. 4.2: Zugriff auf mehrachsige Felder
Abb. 4.1: cat-Funktion
4.B
Mengen
Mengen numerischer Werte werden als Vektoren, Zeichenmengen als Textvektoren und allgemeine
Mengen als geschachtelte Felder (s. 4.D) gespeichert. Beim Arbeiten mit Mengen muss man beachten, dass diese jedes Element nur einmal beinhalten dürfen. Hierfür gibt es MatLab die Funktion
unique, die aus einem Vektor alle Wiederholungen löscht. Die Enhaltenseinsfunktion und Weitere
Mengenverknüpfungen sind in Tab. 4.2 zusammengestellt, die numerische Mengen, Textmengen
und allgemeine Mengen arbeiten.
4 Datenstrukturen
39
Tab. 4.2: Funktionen zur Bearbeitung von Mengen
Funktion
Verknüpfung
math. Formel
ismember(a,b)
Enthaltensein
a ∈b
intersect(a,b)
Durchschnitt
a ∩b
Mengendifferenz
a\b
Vereinigung
a ∪b
setdiff(a,b)
union(a,b)
Mengenerzeugen
unique
Die Ergebismengen der Verknüpfungen sind aufsteigend geordnet. Die Verknüpfungsfunktionen
liefern im ersten Ergebnis die Resultate der angegebenen Verknüpfungen. Sie haben alle als weitere
Ergebniskomponenten die Positionsangaben, die verknüpfungsabhängig sind. So liefert
[c,ia,ib]=intersect(a,b) als zusätzlich Ergebnis Indexvektoren mit c=a(ia) und c=b(ib).
Beispiel 4.10 Mit a=2.*[1:50], den geraden natürlichen Zahlen bis 100 und b=5.*[1:20], den
durch fünf teilbaren natürlichen Zahlen bis 100 liefert intersect(a,b) die Menge aller durch 10
teilbaren Zahlen bis 100: (2N ∩ 5N = 10N).
4.C
Verbund (Records, Structures)
Literatur: Schauer [46, S. 40ff]
Während bei Feldern alle Komponenten gleichen Typs sein müssen, können die einzelnen Komponenten eines Verbunds verschiedenen sein in Datentyp und Struktur. Sie entsprechen dem Inhalt
eines Satzes einer Datei, anschaulich also einer Karteikarte.
4.C.1
Definition, Wertzuweisung und -abfrage
Als Beispiel wird eine Adressdatenbank betrachtet. Gespeichert werden Zu- und Vorname, sowie
die Adresse bestehend aus Postleitzahl, Ortsname und Straße mit Hausnummer, s. Abb. 4.3. Die
einzelnen Komponenten der Variablen tragen Namen, über die sie auch angesprochen werden.
Person
Adresse
Name
Ort
Straße
Zuname
Vorname
PLZ
Ortsname
Abb. 4.3: Einträge einer Adressdatenbank
Der Ausdruck
person=struct(’Name’,struct(’Zuname’,’Meyer’,’Vorname’,’Hans’),...
’Adresse’,struct(’Strasse’,’Marktplatz 5’,’Ort’,...
struct(’PLZ’,’02345’,’Ortsname’,’Großstadt’)))
definiert den Verbund in einem Zug. Dies kann natürlich auch Stück für Stück gemacht werden.
40
I Softwareentwicklung
>> person
person =
Name: [1x1 struct]
Adresse: [1x1 struct]
>> person.Name
ans =
Zuname: ’Meyer’
Vorname: ’Hans’
>> person.Adresse
ans =
Strasse: ’Marktplatz 5’
Ort: [1x1 struct]
>> person.Adresse.Ort
ans =
PLZ: ’02345’
Ortsname: ’Großstadt’
>>person.Adresse.Ort.PLZ
ans =
02345
Abb. 4.4: MatLab-Protokoll: Abfrage Verbund
Der Ausdruck person.Adresse.Ort greift auf die beiden Baumenden PLZ“ und Ortsname“
”
”
zu, person.Adresse.Ort.PLZ auf die Postleitzahl. Weitere Zugriffe sind in Abb. 4.4 zusammengefasst.
Verbundteile können geändert werden: person.Adresse.Strasse=’Hauptstraße 13’;“ doku”
mentiert einen Umzug innerhalb des Orts.
Verbundteile können auch wieder gelöscht werden: patient = rmfield(Person,’Name’);“
”
löscht den Name mit Nachname und Vorname im Verbund person.
4.C.2
Felder von Verbunden
Das Benutzen von Feldern von Verbunden ermöglicht, bildlich gesprochen, Personenkarteien zu
führen. Mit der Festlegung
person(2).Name=struct(’Name’,’Schmidt’,’Vorname’,’Hans’)
oder
person(2).Adresse.Ort.PLZ=’54411’
werden Teile der Karteikarte“ definiert. Die Weiteren Teil existieren strukturell, sind aber leer.
”
size(person) weist person als (1,2)-Matrix aus.
Der Systembefehl whos gibt eine Liste aller benutzten Variablen mit dem belegten Speicherplatz
aus.
4.D
4.D.1
Geschachtelte Felder (Nested Array, Cell Array)
Definition geschachtelter Felder
Dies ist der allgemeinste Datentyp. Geschachtelte Felder sind Felder, also Vektoren oder Matrizen,
deren Komponenten geschachtelte oder einfache Strukturen beliebigen Typs sein können.
Der Ausdruck
cell={[1 2 3;4 5 6;7 8 9], {’abcd’; [1 2 3 4]}; 3+4i, [-2 3;4 5];...
struct(’Na’,’alpha’,’Wert’,5),17}
erzeugt eine geschachtelte Matrix:
4 Datenstrukturen
41
cell =
[3 +
[3x3 double]
4i]
[1x1 struct]
{2x1 cell }
[2x2 double]
[
17]
4.11 (Zugriff und Zuweisung)
(a) Der Zugriff erfolgt über
• cell{1,1}:
ans =
1
2
4
5
7
8
• cell{1,1}(1,2):
ans =
2
• cell{3,1}.Na
ans =
alpha
abcd
other
structure
3
6
9
3+4i
sparse
char
17
double
Abb. 4.5: Darstellung des geschachtelten Felds mit
cellplot
(b) Analog können Zellen verändert werden: Mit cell{1,1}(1,2)=7
>>cell{1,1}
ans =
1
7
4
5
7
8
3
6
9
4.12 (Zusammenfassen von Variablen oder ihren Inhalten) Sind a und b Variable, so ist
(a) [a b], falls möglich, eine Zusammenfassung der Inhalt von a und b ohne Schachtelung,
(b) {a b} eine Zusammenfassung mit Schachtelung der Variablen a und b. Dies ist immer möglich.
4.D.2
Konvertierungen
4.13 (Konvertierung)
(a) Die Funktion num2cell wandelt einen numerischen Vektor in einen Zellenvektor:
>> x=num2cell([1 2 3 4 5])
x =
[1]
[2]
[3]
[4]
[5]
(b) Die Umkehrung wird von MatLab nicht zur Verfügung gestellt. Dies muss dann selbst programmiert werden. Die Funktion Cel2Num, s. Alg. 4.1, kehrt die Wirkung von num2cell
um:
>> Cel2Num(x)
ans =
1
2
3
4
5
(c) Als weiter Beispiele füge ich die Funktionen Mat2Cel, s. Alg. 4.2 und Cel2Mat, s. Alg. 4.3
an, die eine Matrix spalten- oder zeilenweise in Zellenvektoren wandeln und umgekehrt einen
Zellenvektor in eine Matrix wandeln.
42
I Softwareentwicklung
function r=Cel2Num(cells)
% V1.2 30.10.2013 Dieter Kilsch
(25.10.1999)
% Cel2Num converts numerical or character cells to a numerical vector
% cells AM cell matrix (matrix of cells)
% r
M resulting matrix
% local variables
% scells
V
size of cells
%-------------------------------------------------------------------scells = size(cells);
if length(scells)>1; cells=cells(:); end;
%2.1
r=[];
for i=1:length(cells)
if isa(cells{i},’double’); r=[r,cells{i}];
else
r=[r,str2num(cells{i})];
end
end
if length(scells)>1; r=reshape(r,scells); end
Alg. 4.1 : Die Funktion Cel2Num
function cells=Mat2Cel(mat,ax)
%Mat2Cel(mat,ax) puts the rows or columns of a matrix into cells.
% V1.1 16.07.1998 Dieter Kilsch
% mat
M
matrix to be nested
% ax
S
number of axis to be nested
[DEF.: 2]
% cells CV cells of vectors
%-------------------------------------------------------------------if nargin<2; ax=2; end;
if ax==1; for i=1:size(mat,2); cells{i}=mat(:,i); end;
elseif ax==2; for i=1:size(mat,1); cells{i}=mat(i,:); end;
else
error([’Wrong axis chosen: ’,num2str(ax)]);
end;
Alg. 4.2 : Die Funktion Mat2Cel
4.14 (Operation auf den Zellen) MatLab stellt für das Operieren auf den einzelnen Zellen die
Funktion
cellfun(func,cell,’UniformOutput’,log)
zur Verfügung. Hierbei sind
• func ein Funktionsgriff, siehe 4.E.2. Es können auch einige Textvariable eingegeben werden:
– ’isreal’: wahr für Zellen mit Gleitkommafeldern
– ’isempty’: wahr für Zellen mit leeren Feldern
– ’islogical’: wahr für Zellen mit logischen Feldern
– ’length’: Länge des Inhalts jeder Zelle
4 Datenstrukturen
43
function r=Cel2Mat(cellvec,cells,cellind)
% Cel2Mat returns a matrix whose columns are the vectors in a cell.
% V1.1 24.09.1999 Dieter Kilsch
% Cells and elments of each cell to be selected may be specified.
% Vectors in the cells with different length will be filled with 0.
% cellvec
C-V cell vector (vector of cells)
% cells
V
indices of cellvec to be taken.
[DEF.: all]
%
0: all
% cellind
V
indices in each cell to be taken.
[DEF.: all]
% r
M
resulting matrix
%-------------------------------------------------------------------if(nargin<2); cells=0; end;
if(nargin==3);
for i=1:length(cellvec); cellvec{i}=cellvec{i}(cellind);end;
end;
if(all(cells==0)); cells=[1:length(cellvec)]; end;
anzcells=length(cells);
%
%
maximal length of the cells’ content and initializing the result
rr=0; for i=1:anzcells; rr=max(rr,length(cellvec{cells(i)})); end;
if anzcells==0;
r=[];
else
if ischar(cellvec{cells(1)});
r=repmat(r,rr,anzcells);
r=’ ’; else r=0; end;
for i=1:anzcells;
rr=cellvec{cells(i)};
if iscell(rr) & length(rr)==1; rr=rr{1}; end;
r(1:length(rr),i)=rr’;
end;
end;
Alg. 4.3 : Die Funktion Cel2Mat
– ’ndims’: Anzahl der Achsen des Inhalts jeder Zelle
– ’prodofsize’: Anzahl der Elemente in jeder Zelle
• cell ein geschachteltes Feld
• log die logische Größe true oder false, die angibt, ob func nur eine skalare numerische
Ausgabe hat. Die Standardeinstellung ist true.
Dies wird an einigen Beispiele veranschaulicht:
>> cellfun(’isreal’,{[-1:10], [2 4 6], []})
ans =
1
1
1
>> cellfun(@mean,{[-1:10], [2 4 6], []})
ans =
4.5000
4.0000
NaN
44
I Softwareentwicklung
>> cellfun(@(x) sum(x.^2),{[-1:10] [2 4 6] []})
ans =
386
56
0
>> cellfun(@(x) x.^2,{[-1:10], [2 4 6], []},’UniformOutput’,false)
ans =
[1x12 double]
[1x3 double]
[]
>> cellfun(@num2str,{[-1:10], [2 4 6], []},’UniformOutput’,false)
ans =
[1x46 char]
’2 4 6’
’’
>> cellfun(@(x) x.^2,{[-1:10], [2 4 6], [2 3]})
??? Error using ==> cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set ’UniformOutput’ to false.
>> cellfun(@(x) x.^2,{[-1:10], [2 4 6], []},’UniformOutput’,true)
??? Error using ==> cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set ’UniformOutput’ to false.
Weitere Beispiele und Erweiterungen sind in der MatLab-Hilfe enthalten.
4.D.3
Mengen geschachtelter Felder
Alle in Tab. 4.2 gelisteten Funktionen können auch auf Mengen geschachtelter Felder angewandt
werden:
>> a={’alpha’ ’beta’ ’gamma’};
>> b={’gamma’ ’delta’};
>> c=union(a,b)
c =
’alpha’
’beta’
’delta’
>> ismember(’alpha’,a)
ans =
1
’gamma’
Damit steht eine gute Datenstruktur zum Verwalten und Verarbeiten von Mengen jeder Art zur
Verfügung. Auch hier kann die cellfun-Funktion wieder gut eingesetzt werden:
• cellfun(’length’,c) berechnet die Länge jedes Elements der Menge c,
• max(cellfun(’length’,c)) die Länge des größten Elements und
• sum(cellfun(’length’,c)) die Summe über alle Längen der Elemente in c.
Ich schließe zwei weitere Funktionen an, die beim Arbeiten mit geschachtelten Feldern helfen. Ich
habe sie von APL importiert, sie stehen auf meiner Internetseite zur Verfügung.6
• TakeInCel(c,2) nimmt die ersten beiden Elemente jedes Elements in c:
ans =
’al’
’be’
’de’
’ga’
• TakeInCel(c,-3) nimmt die letzten drei Elemente jedes Elements in c:
ans =
’pha’
’eta’
’lta’
’mma’
• DropInCel unterdrückt Werte am Anfang oder Ende einer Zelle:
6
Auch eine Implementierung der APL-Funktion Each, die vergleichbar zu cellfun arbeitet, ist
dort enthalten.
4 Datenstrukturen
45
>> DropInCel(c,2)
ans =
’pha’
’ta’
’lta’
’mma’
>> DropInCel(c,-3)
ans =
’al’
’b’
’de’
’ga’
function r=TakeInCel(cells,varargin)
%TakeInCel takes starting or trailing (vargin<0) elements in each cell.
% V1.1 02.11.2005 Dieter Kilsch
(DK051026)
% The elements in vargin are fifo-processed.
% cells
A. input cells
% vargargin V
>0 number of starting elements to be taken
%
<0 number of trailing elements to be taken
% r
A. resulting cell vector
% local variables
% i,j
S
Schleifenzähler
% ntr
S
neutral element
%-------------------------------------------------------------------------if length(varargin)==0 r=cells;
else
r=reshape(cells,1,prod(size(cells)));
for j=Cel2Num(varargin) for i=1:length(r);
if length(r{i})<abs(j)
if isnumeric(r{i}) ntr=0; else ntr=’ ’; end;
if j<0 r{i}=[repmat(ntr,1,-j-length(r{i})),r{i}];
else
r{i}=[r{i},repmat(ntr,1,j-length(r{i}))]; end
elseif j<0 r{i}=r{i}(end+j+1:end);
else r{i}=r{i}(1:j);
end;end;end;
r=reshape(r,size(cells));
end
Alg. 4.4 : Die Funktion TakeInCel
4.E
4.E.1
Darstellung von Funktionen
Polynome
Polynome werden durch ihre Koeffizienten dargestellt, die in einem Vektor aufsteigend oder absteigend gespeichert werden. Für die Manipulation von Polynomen stellt MatLab einige Funktionen
zur Verfügung. Hierbei sind die Koeffizienten absteigend zu speichern, pol=[1 7 -1] stellt also
p(x ) = x 2 + 7x − 1 dar. Enthalten die Vektoren pol und qol die Koeffizienten zweier Polynome p
und q, so berechnen
• polyval(pol,2) den Wert p(2),
• roots(pol) die Nullstellen von p(x ) näherungsweise,7
• conv(pol,qol) die Koeffizienten des Produkts p(x ) · q(x ),
• [s,r]=deconv(p,q) die Division mit Rest p(x ) = s(x ) · q(x ) + r (x ), wobei der Grad von r
kleiner als der Grad von q ist,
• polyder(pol) die Koeffizienten der Ableitung p ′ (x ),
7
In [42] ist eine Beispiel angegeben, das auf die Rundungsfehler dieser Berechnung ausdrückliche hinweist!
46
I Softwareentwicklung
function r=DropInCel(cells,varargin)
%DropInCel drops starting or trailing (vargin<0) elements in each cell.
% V1.1 02.11.2005 Dieter Kilsch
(DK051026)
% The elements in vargin are fifo-processed.
% cells
A. input cells
% vararggin V
>0 number of starting elements to be dropped
%
<0 number of trailing elements to be dropped
% r
A. resulting cell vector
% local variables
% i,j
S
Schleifenzähler
%-------------------------------------------------------------------------if length(varargin)==0 r=cells;
else
r=reshape(cells,1,prod(size(cells)));
for j=Cel2Num(varargin) for i=1:length(r);
if length(r{i})<abs(j) r{i}=r{i}(1:0);
elseif j<0 r{i}=r{i}(1:end+j);
else r{i}=r{i}(j+1:end);
end;end;end;
r=reshape(r,size(cells));
end
Alg. 4.5 : Die Funktion DropInCel
• polyint(pol) die Koeffizienten der Stammfunktion
R
p(x ) mit der Integrationskonstanten 0,
MatLab bietet auch eine Funktion polyfit, die für eine gegebene Stützstellenmenge {(xi , yi ) | i =
0, . . . , n} die Koeffizienten desjenigen Polynoms p des Grades n bestimmt, das an allen Stellen
p(xi ) = yi (i = 0, . . . , n) erfüllt.
4.E.2
Funktionsgriff (function handle)
Ein Funktionsgriff erlaubt, einer von MatLab bereitgestellten oder selbstdefinierten Funktion einen
Namen zu geben:
Beispiel 4.15 (Funktionsgriff )
(a) Mit dem Ausdruck p = @(x) polyval([3 2 1], x) wird der Funktionsgriff p der Funktion
p(x ) = 3x 2 + 2x + 1 vereinbart.
(b) Die in den Übungen besprochenen Funktion PolHor ist feld-fähig programmiert. Damit liefert die Definition p = @(x) PolHor([1 2 3], x) ebenfalls den Funktionsgriff p zur selben
Funktion.
Zu beachten ist, dass polyval die Koeffizienten des Polynoms absteigend benötigt, PolHor dagegen
aufsteigend.
Für beide Beispiele liefert der Aufruf p([-1 0 1]) die Werte des Polynoms p(x ) an den Stellen
−1, 0, 1, s. Abb. 4.6. Der Ausdruck fplot(p,[-5,5]) zeichnet diese Funktion über dem Intervall
[−5, 5], s. Abb. 4.7.
4.E.3
Einbinden von Grafiken in Textsystem
MatLab erlaubt das Speichern von Funktionsgrafen in verschiedenen Formaten, die je nach zu speicherndem Inhalt und verwendetem Textsatzsystem unterschiedlich gut eignen:
4 Datenstrukturen
47
90
>> p = @(x) PolHor([1 2 3], x)
p =
@(x)PolHor([1,2,3],x)
>> p(3)
ans =
34
>> p([-1 0 1])
ans =
2
1
6
>> fplot(p,[-5,5])
Abb. 4.6: MatLab-Protokoll: Funktionsgriff
80
70
60
50
40
30
20
10
0
−5
0
5
Abb. 4.7: Graf der Funktion p(x ) = 1 + 2x + 3x 2
• jpg ist hervorragend zum Speichern von Fotodateien geeignet, sie werden aber verlustbehaftet
komprimiert. Dieses Format ist nicht geeignet, Funktionsgrafen oder Text zu speichern, weil
die Kompression die Farbinformationen umgebungsabhängig speichert und damit streut. Die
Darstellung eines Funktionsgrafen wirkt dadurch unscharf und in seiner Umgebung körnig.
Dieses Format kann in MS-Word- und mit pdfLATEX-Dokumente eingebunden werden.
• emf (enhanced meta file) ist ein MS-Format, die Weiterentwicklung von wmf (Windows metafile). Es kann für Word genutzt werden, liefert aber nicht die besten Ergebnisse.
• png (portable network graphics file) ist ein Format mit verlustfreier Datenkompression, das
vom WWW-Konsortium anerkannt ist und von Webbrowsern unterstützt wird. Es liefert
besserer Ergebnisse und kann in MS-Word-, MS-Powerpoint und mit pdfLATEX eingebunden
werden.
• eps (encapsulated postscript) ist ein vektorfähiges Grafik-Format von Adobe, das mit LATEX
und MS-Word genutzt werden kann, es liefert hier die besten Ergebnisse. Die Darstellung in
MS-Powerpoint ist dagegen nicht gut. MatLab speichert die Achsbeschriftungen zum Teil nicht
vollständig. Mit ghostview (und ghostscript) können eps-Dateien in pdf- und png-Dateien
konvertiert werden.
• pdf (portable document format) ist ein Adobe-Format. Es kann in pdfLATEX eingebunden
werden und liefert Ergebnisse in gleicher Qualität wie eps.
In diesem Skript sind alle MatLab-Grafiken als eps-Dateien mit LATEX eingebunden.
MatLab-Sitzungen sollten nicht als Grafiken sondern als Text in eine Dokumentation übernommen werden. Dieser Test muss zu besseren Lesbarkeit in einem nicht-proportionalen Font (gleiche
Breite aller Zeichen) gesetzt werden.
48
I Softwareentwicklung
§ 5 Formatieren, Dateiein- und -ausgabe
Ich gehe auf Textdateien ein und die Methode, diese zu lesen und zu schreiben. Das Lesen und
Schreiben von Excel-Dateien ist in der MatLab-Hilfe beschrieben. Unter Formatieren versteht man
allgemein die Wandlung numerischer Werten in Textformat. Im ersten Teil werden wir aus numerischen Feldern Textfelder kreieren und umgekehrt.
Alle hier erwähnten Funktionen sind ausführlich in der MatLab-Dokumentation beschrieben.
5.A
Formatieren numerischer Werte (Kodieren, Verschlüsseln)
5.A.1
Kodierungsfunktionen
Festlegung 5.1 Zum Konvertieren stehen Funktionen zur Verfügung, die in Tab. 5.1 zusammengestellt sind.
Tab. 5.1: Konvertierungsroutinen (Kodierung)
Funktion
Konvertierung (Kodierung)
Definitionsbereich
char
nach unten gerundete pos. Zahlen zu ASCII-Zeichen
(sinnvoll im Bereich [0,255])
Zahlen zu Text des gerundeten ganzen Werts
Zahlen zu Text, ggf. mit Formatkontrolle
Zahlen zu MatLab-ausführbarem Ausdruck
doppeltgenaue zu einfach genauen Gleitkommazahlen
Nicht-negative Zahlen zu Hexadezimal-Format
Nicht-negative Zahlen zu Binärformat
Nicht-negative Zahlen zu angegebenem Format
[0, 65535]
int2str
num2str
mat2str
single
dec2hex
dec2bin
dec2base
[-realmax,
[-realmax,
[-realmax,
[-realmax,
[0, 252 − 1]
[0, 252 − 1]
[0, 252 − 1]
realmax]
realmax]
realmax]
realmax]
Beispiel 5.2
>> char(252)
ans =
ü
>> int2str(pi)
ans =
3
>> dec2bin(122)
ans =
1111010
5.A.2
>> dec2hex(127)
ans =
7F
>> dec2base(127,8) % Octalzahl
ans =
177
>> mat2str([1 2;3 4;5 6])
ans =
[1 2;3 4;5 6]
Formatkontrolliertes Kodieren
Festlegung 5.3 Die Art der Formatierung wird durch ein Formatierungszeichen (Spezifikator)
festgelegt, siehe Tab. 5.2. Die vollständige Festlegung der Formatierung gibt die Breite des Textfeldes
und eventuell die Anzahl der die Anzahl der Nachkommastellen an.
’%12.5f’ benutzt insgesamt 12 Zeichen, davon 5 nach dem Dezimalpunkt. Für den ganzen Anteil
bleiben wegen des Vorzeichens 5 Stellen. MatLab erhöht die Breite, wenn die gewählte Breite zu
klein ist. Für beides gelten Standardwerte, wenn sie nicht angegeben werden.
In der Formatangabe darf zusätzlich beliebiger Text angegeben werden, der in die Ausgabe übernommen wird.
5 Formatieren, Dateiein- und -ausgabe
49
Tab. 5.2: Formatierungszeichen
Spezifikator
c
d
e
E
f
g
G
i
o
s
u
x
X
Bedeutung
Textzeichen
ganze Zahl oder Dezimalzahl in Exponentialnotation (e)
Dezimalzahl in Exponentialnotation (e)
Dezimalzahl in Exponentialnotation (E)
Dezimalzahl mit Dezimalpunkt
Dezimalzahl, ohne überflüssige Nullen, Exponent (e)
Dezimalzahl, ohne überflüssige Nullen, Exponent (E)
ganze Zahl
vorzeichenlos Oktalzahl,
mit Breitenangabe aber wie g
Zeichenkette
Dezimalzahl in Exponentialnotation (e) nur bei Bedarf
Hexadezimalzahl mit Kleinbuchstaben: 0-9,a-f
Hexadezimalzahl mit Großbuchstaben: 0-9,A-F
Beispiel 5.4
(a) >> sprintf(’%d, %d, %e, %E, %f, %g, %o, %u’,[1.5,[11:17]])
ans =
1.500000e+000, 11, 1.200000e+001, 1.300000E+001, 14.000000, 15, 20, 17
(b) >> sprintf(’%5.2d, %5.2d, %5.2e, %5.2E, %5.2f, %5.2g, %5.2o, %5.2u’,-[1.5,[11:17]])
ans =
-1.50e+000,
-11, -1.20e+001, -1.30E+001, -14.00,
-15, -1.60e+001, -1.70e+001
(c) >> sprintf(’%o, %x, %X, ’,[11:18])
ans =
13, c, D, 16, f, 10, 21, 12,
Reichen die Formatangaben nicht aus, so werden sie zyklisch (von vorne) nochmals benutzt.
(d) >> sprintf(’Der Verlust am %d.%g.%i betrug %4.1f%%.’,[3 6 1998 11.3])
ans =
Der Verlust am 3.6.1998 betrug 11.3%.
Ganze Zahlen können mit den Spezifikatoren d, g oder i ausgegeben werden. Zur Änderung der
Füllzeichen und Ausgabe der Vorzeichen s. 5.7.
Festlegung 5.5 (Variable Formatlänge) * kennzeichnet eine variable Formatlänge. Sie kann
an jeder Stelle statt einer Zahlenangabe stehen. Festgelegt wird sie durch zusätzliche Variable in der
Ausgabeliste:
>> sprintf(’%*e, %*.*E, %*.*f’,10,1.5,5,2,4.7,5,2,5.7)
ans =
1.500000e+000, 4.70E+000, 5.70
Bemerkung 5.6
(a) Analog arbeiten die Funktionen
assert: Ausgabe einer Fehlermeldung abhängig von einer logischen Bedingung.
error: Ausgabe einer Fehlermeldung.
warning: Ausgabe einer Warnung.
Die genaue Arbeitsweise dieser Funktionen ist in der MatLab-Dokumentation angegeben.
50
I Softwareentwicklung
(b) Die Reihenfolge der Ausgabe kann mit Hilfe des $-Zeichens angegeben werden:
>> sprintf(’%2$d, %4$e, %1$E, %3$f, %5$g’,11,12,13,14,15)
ans =
12, 1.400000e+001, 1.100000E+001, 13.000000, 15
Hierbei muss jeder Ausgabewert in der Ausgabeliste stehen, Vektoren werden nicht aufgebrochen, sie sind nicht erlaubt.
Festlegung 5.7 (Zeilen- und Ausrichtungskontrolle)
(a) Tab. 5.3 enthält Kontrollzeichen, mit denen die schreibmaschinenüblichen Umbrüche und
Rückschritte ermöglicht werden, wobei vor allem \n von Bedeutung ist.
(b) Tab. 5.4 enthält Zeichen für die Kontrolle der Ausrichtung. Die Standardausrichtung ist
rechtsbündig, das Vorzeichen + entfällt.
>> sprintf(’Der Gewinn am %02d.%02g.%i \nbetrug %+4.1f%%.’,[3 6 1998 11.3])
ans =
Der Gewinn am 03.06.1998
betrug +11.3%.
Hierbei entsteht keine Textmatrix, sondern ein Textvektor, der bei der Ausgabe von \n am
Bildschirm einen Zeilenumbruch erzeugt.
\n und \r erzeugen am Bildschirm einen Zeilenumbruch und ein CARRIAGE RETURN. Das folgende Zeichen wird also am Anfang der nächsten Zeile ausgegeben.
Tab. 5.3: Spezielle Formatierungszeichen
Spezifikator
\b
\f
\n
\r
\t
\\
%%
5.A.3
Bedeutung
Tab. 5.4: Spezielle Formatierungszeichen
Spezifikator
BACKSPACE: Zurücksetzen
FORM FEED: Seitenumbruch
LINE FEED: Zeilenumbruch
CARRIAGE RETURN: Zeilenanfang
TAB: horizontaler Tabulator
\
%
+
0
Bedeutung
linksbündig
Vorzeichen immer ausgeben
führende Nullen ausgeben
Formatieren auf der MatLab-Oberfläche
Die Ausgabe auf der MatLab-Oberfläche wird durch den format-Befehl festgelegt:
(a) format short: Gleitkommazahlen mit 5 Ziffern
(b) format long : Einfach-genaue Gleitkommazahlen mit 5 Ziffern, doppelt-genaue mit 15 Ziffern
(c) format short e: Gleitkommazahlen mit 5 Ziffern im Exponentialformat
(d) format long e: Einfach-genaue Gleitkommazahlen 7 Ziffern, doppelt-genaue mit 15 Ziffern
im Exponentialformat
(e) format short g: Optimum der Ausgabe: Fest- oder Gleitkommazahl mit 5 Ziffern.
(f) format long g: Optimum der Ausgabe: Fest- oder Gleitkommazahl mit 5 (einfach-genau)
oder 15 Ziffern (doppelt-genau).
(g) format short eng: Ingenieur-Format: Gleitkommazahlen mit 4 Nachkommastellen, also mindestens 5 Ziffern, der Exponent ist ein Vielfaches von 3
5 Formatieren, Dateiein- und -ausgabe
51
(h) format long eng: Ingenieur-Format: Gleitkommazahlen mit 16 signifikanten Stellen, der Exponent ist ein Vielfaches von 3
(i) format hex: Ausgabe in Hexadezimalformat
(j) format compact: unterdrückt Leerzeilen nach Ergebnisausgabe
(k) format loose: erzeugt Leerzeilen nach Ergebnisausgabe
5.B
5.B.1
Lesen numerischer Werte (Dekodieren, Entschlüsseln)
Dekodierungsfunktionen
Festlegung 5.8 Zum Konvertieren stehen Funktionen zur Verfügung, die in Tab. 5.5 zusammengestellt sind.
Tab. 5.5: Konvertierungsfunktionen (Dekodierung)
Funktion
Konvertierung zu numerischen Werten von
uintn
str2num
str2double
hex2num
hex2dec
bin2dec
base2dec
Text
Text
Text
Text
Text
Text
Text
zu ASCII-Kode (n=8, 16, 32, 64)
zu Zahlen, keine geschachtelten Felder
zu Zahlen, auch geschachtelte Felder
mit 16 Hexadezimalziffern zu IEEE-Gleitkommazahl
mit Hexadezimalziffern zu nicht-negativer Dezimalzahl
mit Binärziffern zu nicht-negativer Dezimalzahl
mit Ziffern in angeg. Zahlensystem zu nicht-negativer Dezimalzahlen
Beispiel 5.9
>> uint8(’16’)
ans =
49
54
>> 16==str2num(’16’)
ans =
1
>> str2double({’16’ ’17’})
ans =
16
17
>> base2dec(’12’,3)
ans =
5
5.B.2
>> hex2num(’3FF0000000000000’)
ans =
1
>> hex2num(’BFF0000000000000’)
ans =
-1
>> hex2num(’FFFFFFFFFFFFFFFF’)
ans =
NaN
Formatkontrolliertes Dekodieren
Dies ist die Umkehrung der Kodierung, wie sie in 5.A.2 beschrieben ist. Die MatLab-Dekodierungsfunktion heißt sscanf. Eine vollständige Beschreibung dieser Funktion ist in der MatLabDokumentation enthalten, ich gehe nur auf die wichtigsten Punkte ein.
Festlegung 5.10 (Vollständiger Aufruf von sscanf) In [au,za,fe,ne]=sscanf(te,fo,gr)
bedeuten
te: zu dekodierender Text,
fo: Formatangabe nach 5.2. Es gelten:
(a) Bei Angabe einer Feldbreite wird diese Anzahl an Zeichen dekodiert.
52
I Softwareentwicklung
gr:
au:
za:
fe:
ne:
(b) Bei Fehlen einer Feldbreite wird bis zum nächsten Leerzeichen dekodiert.
(c) Bei Angabe eines * (variable Feldbreite) wird der Text bis zum nächsten Leerzeichen
übersprungen.
(optional) Anzahl der zu lesenden Zeichen. Dies kann eine positive Zahl, aber auch inf (Lese
bis zum Ende des Texts), und [m,n] (Lese m n) Zeichen und fülle ein Matrix mit bis zu m
Zeilen spaltenweise, n==inf ist erlaubt).
Der Standardwert ist inf
numerische Werte,
(optional) Anzahl dekodierter Werte,
(optional) Fehlertext im Fehlerfall,
(optional) Index des ersten nicht-gelesenen Zeichens in te.
Ist te eine Textmatrix, so wird diese spaltenweise gelesen und dekodiert:
Beispiel 5.11
>> format compact
A =
abc 46 6 ghi
def 7 89 jkl
>> sscanf(A, ’%*s %d %d %*s’)
ans =
476
869
Das Ergebnis ist ein Spaltenvektor. Der erste Versuch, durch Transponieren das gewünschte Ergebnis zu erhalten, scheitert:
>> sscanf(A’, ’%*s %d %d %*s’)
ans =
46
6
89
Zwischen dem Textende in der ersten Zeile und dem Textanfang der zweiten steht kein Leerzeichen. MatLab setzt die beiden Zeilen einfach hintereinander, so dass für den zweiten Textteil (%s)
’ghidef’ genommen wird. Die Formatangabe wird wieder von vorne begonnen und ’7’ ist der
nächste Text, der übersprungen wird.
Es muss als eine Spalte von Leerzeichen am Anfang oder Ende hinzugefügt werden:
>> sscanf([A,[’ ’]’]’, ’%*s %d %d %*s’)
ans =
46
6
7
89
Das sofortige Dekodieren in eine (2,2)-Matrix ist möglich mit einer Größenangabe:
>> sscanf([A,[’ ’]’]’, ’%*s %d %d %*s’,[2 inf])
ans =
46
7
6
89
5.B.3
Funktionen zum Bearbeiten von Textvektoren
Ich stelle wichtige Funktionen zusammen, die das Suchen und extrahieren in Textvektoren ermöglichen:
5 Formatieren, Dateiein- und -ausgabe
53
Tab. 5.6: Bearbeiten von Textvariablen
Funktion
Beschreibung
findstr
strmatch
strtok
strrep
Anfangsposition des
Anfangsposition des
Extrahiert den Text
Sucht einen Textteil
gesuchten Texts
gesuchten Texts, auch in geschachtelten Feldern
vor oder zwischen Trennzeichen (Leerzeichen)
und ersetzt ihn durch einen zweiten.
Beispiel 5.12 (strtok)
>> format compact
>> txr=’ aaa bbb ccc’
txr =
aaa bbb ccc
>> while (length(txr)>0); [tx,txr]=strtok(txr), end
tx =
aaa
txr =
bbb ccc
tx =
bbb
txr =
ccc
tx =
ccc
txr =
Empty string: 1-by-0
5.C
5.C.1
Lesen von Textdateien
Die Funktion textread
Eine erste Methode, Daten einzulesen, wird anhand einer Textdatei erläutert, die in der ersten Zeile
den Parameternamen, in der zweiten die Maßeinheit und in den weiteren die Messeinstellungen und
Messwerte enthält.
Beispiel 5.13 (Einlesen mit Leerzeichen als Trennsymbol)
file = textread(’d:\fachtext\math\math4\skrfeia1.dat’, ’%s’);
liest den Inhalt der Datei d:\fachtext\math\math4\skrfeia1.dat (s. Abb. 5.1) in den geschachtelten Spaltenvektor file. Als Trennsymbol wird das Leerzeichen genutzt, Leerzeichen am Anfang
einer Zeile werde unterdrückt. Die Größe des Ergebnisses:
>> format compact
>> size(file)
ans =
40
1
Bei sechs Zeilen und sieben Spalten werden eigentlich 42 Zellen erwartet, aber die zweite Zeile
enthält zwei Löcher“. Es ist sinnvoller, keine Eingabe“ durch ein Sonderzeichen zu markieren,
”
”
wie es in der Datei skrfeia2.dat durch Doppelhochkomma gemacht ist, s. Abb. 5.2. Das Ergebnis
enthält jetzt 42 Zellen:
>> format compact
>> file=textread(’d:\fachtext\math\math4\skrfeia2.dat’, ’%s’);
>> file=reshape(file,7,6)’
54
I Softwareentwicklung
mess
1
15
16
17
last
N
1
40
4
1
dros
%
0
0
9.523809524
9.523809524
lamb tkra
◦C
0.8
17
1.2
34
0.8
27
0.9
28
zund
◦
11.3
11.3
26.3
30.8
schl
%
36
67.5
46.5
46.5
Abb. 5.1: Die Datei skrfeia1.dat
mess
"
1
15
16
17
last
N
1
40
4
1
dros
%
0
0
9.523809524
9.523809524
lamb tkra
◦C
"
0.8
17
1.2
34
0.8
27
0.9
28
zund
◦
11.3
11.3
26.3
30.8
schl
%
36
67.5
46.5
46.5
Abb. 5.2: Die Datei skrfeia2.dat
file =
’mess’
’"’
’1’
’15’
’16’
’17’
Die Zeilen 3
’last’
’dros’
’lamb’
’tkra’
’N’
’%’
’"’
’◦ C’
’1’
’0’
’0.8’
’17’
’40’
’0’
’1.2’
’34’
’4’
’9.523809524’
’0.8’
’27’
’1’
’9.523809524’
’0.9’
’28’
bis 6 werden in numerische Werte gewandelt:
>> cellfun(@str2num,file(3:end,:))
ans =
1
1
0
0.8
17
15
40
0
1.2
34
16
4
9.5238
0.8
27
17
1
9.5238
0.9
28
>> file(3:end,:)=cellfun(@str2num,file(3:end,:),’UniformOutput’,0)
file =
’mess’
’last’
’dros’
’lamb’
’tkra’
’zund’
’schl’
’"’
’N’
’%’
’"’
’◦ C’
’◦ ’
’%’
[
1]
[
1]
[
0]
[ 0.8]
[ 17]
[11.3]
[ 36]
[ 15]
[ 40]
[
0]
[ 1.2]
[ 34]
[11.3]
[67.5]
[ 16]
[
4]
[9.5238]
[ 0.8]
[ 27]
[26.3]
[46.5]
[ 17]
[
1]
[9.5238]
[ 0.9]
[ 28]
[30.8]
[46.5]
’zund’
’◦ ’
’11.3’
’11.3’
’26.3’
’30.8’
11.3
11.3
26.3
30.8
’schl’
’%’
’36’
’67.5’
’46.5’
’46.5’
36
67.5
46.5
46.5
Alternativ können die Spalten durch ein Trennzeichen gekennzeichnet werden und dann mit
Angabe des Trennzeichens eingelesen werden. Die Datei skrfeia1.csv enthält ;“ als Trennzeichen,
”
s. Abb. 5.3. Das Ergebnis enthält jetzt 42 Zellen, die jedoch alle Leerzeichen am Anfang und Ende
enthalten können:
Beispiel 5.14 (Einlesen einer csv-Datei)
>> file = textread(’d:\fachtext\math\math4\skrfeia1.csv’, ’%s’,’delimiter’,’;’);
>> reshape(file,7,6)’
ans =
’mess ’
’last ’
’dros
’
’lamb ’
’tkra ’
’zund ’
’schl’
’’
’N
’
’%
’
’’
’◦ C
’
’◦
’
’%’
’1
’
’1
’
’0
’
’0.8 ’
’17
’
’11.3 ’
’36’
’15 ’
’40
’
’0
’
’1.2 ’
’34
’
’11.3 ’
’67.5’
’16 ’
’4
’
’9.523809524 ’
’0.8 ’
’27
’
’26.3 ’
’46.5’
’17 ’
’1
’
’9.523809524 ’
’0.9 ’
’28
’
’30.8 ’
’46.5’
Die Daten können auch zeilenweise eingelesen und dann weiter verarbeitet werden:
5 Formatieren, Dateiein- und -ausgabe
mess ;
;
1
;
15 ;
16 ;
17 ;
last
N
1
40
4
1
;
;
;
;
;
;
dros
%
0
0
9.523809524
9.523809524
55
;
;
;
;
;
;
lamb ;
;
0.8 ;
1.2 ;
0.8 ;
0.9 ;
tkra ;
;
17
;
34
;
27
;
28
;
◦C
zund ;
;
11.3 ;
11.3 ;
26.3 ;
30.8 ;
◦
schl
%
36
67.5
46.5
46.5
Abb. 5.3: Die Datei skrfeia1.csv
Beispiel 5.15 (Zeilenweises Einlesen)
>> file = textread(’d:\fachtext\math\math4\skrfeia1.dat’, ’%s’,’delimiter’,’\n’),
file =
’mess last
dros
lamb tkra
zund schl ’
◦
◦
’N
%
C
%’
’1
1
0
0.8
17
11.3 36’
’15
40
0
1.2
34
11.3 67.5’
’16
4
9.523809524 0.8
27
26.3 46.5’
’17
1
9.523809524 0.9
28
30.8 46.5’
5.D
Lesen geöffneter Dateien
Der Nachteil, die Anzahl der Spalten wissen zu müssen, kann aufgehoben werden, wenn zeilenweise
verarbeitet wird. Obwohl dies mit textread nach 5.15 möglich ist, will ich hier eine andere Methode
vorstellen. Zum Bearbeiten geöffneter Dateien gibt es weitere flexible Funktionen.
Verfahren 5.16 (Öffnen und Schließen von Dateien)
(a) fi=fopen(’d:\fachtext\math\math4\skrfeia2.dat’)
öffnet die Datei im Lesemodus: Schreiben ist nicht möglich, RO. Die positive Zahl fi ist
der Dateiidentifikator (Dateigriff). Gibt fopen eine negative Zahl zurück, so ist ein Fehler
aufgetreten, fi ist der Fehlerkode.
(b) fi=fopen(’d:\fachtext\math\math4\skrfeia2.dat’,n)
öffnet die Datei mit Angabe des Modus, s. Tab. 5.7
(c) fclose(fi) schließt die Datei.
(d) fgetl(fi) liest die nächste Zeile,
(e) fscanf(fi,fo) liest den Rest der Datei unter der Formatkontrolle von fo.
Tab. 5.7: Formatierungszeichen
Modus
Beschreibung
Abkürzung
’r’
’w’
’a’
Nur Lesen
Schreiben, ggf. erzeugen
am Ende ergänzen, ggf. neu erzeugen
RO
W
A
Beispiel 5.17 (Einlesen der Datei skrfeia2.dat)
>> format compact
>> fi = fopen(’d:\fachtext\math\math4\skrfeia2.dat’),
fi =
3
>> txr=fgetl(fi)
56
I Softwareentwicklung
txr =
mess last
dros
lamb tkra
zund schl
>> c=cell(0,0); while (length(setdiff(txr,’ ’))>0);[tx,txr]=strtok(txr); c=[c,{tx}];
>> txr=fgetl(fi)
txr =
◦
◦
"
N
%
"
C
%
>> d=cell(0,0); while (length(setdiff(txr,’ ’))>0);[tx,txr]=strtok(txr); d=[d,{tx}];
>> c=[c;d]
c =
’mess’
’last’
’dros’
’lamb’
’tkra’
’zund’
’schl’
’"’
’N’
’%’
’"’
’◦ C’
’◦ ’
’%’
>> d=fscanf(fi,’%f’);
>> fclose(fi)
ans =
0
>> d=reshape(d,size(c,2),(length(d)/size(c,2)));d=d’
d =
1
1
0
0.8
17
11.3
15
40
0
1.2
34
11.3
16
4
9.5238
0.8
27
26.3
17
1
9.5238
0.9
28
30.8
>> c=[c;num2cell(d)]
c =
’mess’
’last’
’dros’
’lamb’
’tkra’
’zund’
’schl’
’"’
’N’
’%’
’"’
’◦ C’
’◦ ’
’%’
[
1]
[
1]
[
0]
[ 0.8]
[ 17]
[11.3]
[ 36]
[ 15]
[ 40]
[
0]
[ 1.2]
[ 34]
[11.3]
[67.5]
[ 16]
[
4]
[9.5238]
[ 0.8]
[ 27]
[26.3]
[46.5]
[ 17]
[
1]
[9.5238]
[ 0.9]
[ 28]
[30.8]
[46.5]
5.E
end
end
36
67.5
46.5
46.5
Schreiben in Textdateien
Beim Schreiben in eine Datei muss die Datei zum Schreiben geöffnet werden:
fi = fopen(’d:\fachtext\math\math4\skrfeia3.dat’,’w’)
Geschrieben wird mit der Funktion fprintf, deren Syntax bis auf den Dateigriff der Syntax der
Funktion sprintf entspricht. Im folgenden Beispiel werden drei Spalten zeilenweise in die Datei
d:\fachtext\math\math4\skrfeia3.dat geschrieben:
Beispiel 5.18
>>
>>
>>
>>
fi = fopen(’d:\fachtext\math\math4\skrfeia3.dat’,’w’);
text={’Messnummer’ ’Belastung’ ’Drosselklappenöffnung’};
for i=1:length(text); fprintf(fi,’%25s (%4s) [%1s]: %5g %5g %5g %5g\n’,text{i},c{:,i});end
fclose(fi);
Das Ergebnis ist in Abb. 5.4 enthalten.
Messnummer (mess) ["]:
Belastung (last) [N]:
Drosselklappenöffnung (dros) [%]:
1
1
0
15
16
17
40
4
1
0 9.52381 9.52381
Abb. 5.4: Die Datei skrfeia3.dat
5.F
Lesen und Schreiben in Excel-Dateien
5.19 (Einlesen einer Excel-Datei) Der Ausdruck
[numdat,text,rohdat]=xlsread(datei,blatt,bereich)
liest Daten aus einer Excel-Datei ein. Dabei sind
5 Formatieren, Dateiein- und -ausgabe
•
•
•
•
•
•
57
numdat die eingelesenen numerischen Daten als numerisches Feld,
text die eingelesenen Textfelder als geschachteltes Feld,
rohdat alle Felder als geschachteltes Feld,
datei der Dateiname als Textvektor,
blatt der Name des Tabelle (Blatt) als Textvektor oder Nummer des Blatts als Zahl,
bereich der Bereich in Excel-Format, z.B.: ’a2:d5’.
blatt und bereich können im Aufruf fehlen. Die Standard-Werte sind 1 für blatt und alles“ für
”
bereich.
5.20 (Schreiben einer Excel-Datei) xlswrite schreibt numerische Felder oder geschachtelte
Felder in Excel. Der Ausdruck
[erfolg,meldung]=xlswrite(datei,feld,blatt,bereich)
schreibt Daten in die Excel-Datei datei. Dabei sind
•
•
•
•
erfolg gleich 1 bei erfolgreichem Schreiben, andernfalls 0,
meldung bei nicht erfolgreichem Schreiben die Fehlermeldung als Verbund,
feld die zu schreibenden Daten als geschachteltes Feld,
datei, blatt und bereich werden wie bei xlsread benutzt, einschließlich der Standardwerte.
Kann bei drei Eingabeparametern der dritte als Bereich interpretiert werden, so wird der Inhalt
von feld auf das erste Blatt (Standard für blatt) in den angegebenen Bereich geschrieben.
Ist der angegebene Bereich kleiner als die Größe des Felds, so wird nur der angegebene Bereich
gefüllt. Ist der angegebene Bereich größer als die Größe des Feldes, so wird bei Größe 1 des Feldes
feld jedes Feld des Bereichs mit diesem Wert gefüllt. Andernfalls werden die überzähligen Felder
mit #N/A“ gefüllt.
”
Beispiel 5.21
>> tt=[num2cell(reshape([1:10],5,2)’);{’alpha’ ’beta’ ’gamma’ ’delta’ ’epsilon’}]
tt =
[
1]
[
2]
[
3]
[
4]
[
5]
[
6]
[
7]
[
8]
[
9]
[
10]
’alpha’
’beta’
’gamma’
’delta’
’epsilon’
>> xlswrite(’c:\temp\beispiel.xlsx’,tt,’B1’,’a1:e3’)
>> x=xlsread(’c:\temp\beispiel.xlsx’,’B1’,’a1:d3’);
>> [x,y]=xlsread(’c:\temp\beispiel.xlsx’,’B1’,’a1:d3’);
>> x
x =
1
2
3
4
6
7
8
9
>> y
y =
’alpha’
’beta’
’gamma’
’delta’
>> [x,y,z]=xlsread(’c:\temp\beispiel.xlsx’,’B1’,’a1:e3’);
>> x
x =
1
2
3
4
5
6
7
8
9
10
>> y
y =
’alpha’
’beta’
’gamma’
’delta’
’epsilon’
>> z
z =
[
1]
[
2]
[
3]
[
4]
[
5]
[
6]
[
7]
[
8]
[
9]
[
10]
’alpha’
’beta’
’gamma’
’delta’
’epsilon’
58
I Softwareentwicklung
§ 6 Programmstrukturen
6.A
Entstehung eines lauffähigen Programms
Literatur: Rembold [43, S. 244ff]
Lauffähige Programme können in rechnerabhängiger Maschinen- oder Assemblersprache oder einer, größtenteils rechnerunabhängigen, höheren Programmiersprache geschrieben werden. Der vom
Assembler oder einem Übersetzer (Compiler) erzeugte Maschinenkode wird durch den Binder ausführbar gemacht, der Lader bringt das Programm zur Ausführung.
6.A.1
Maschinensprache und Assembler
Die heutigen Standardrechner haben eine von-Neumann-Architektur, deren wesentliches Merkmal
darin besteht, dass die Daten und das Programm im Speicher liegen. Damit werden Programme wie
Daten behandelt. Ein lauffähiges Programm besteht aus im Speicher abgelegtem Maschinenkode,
auch Objekt(kode) genannt. Ein einfacher Rechner besteht nach [29, S. 22ff] aus
(a) Rechnerkern mit Steuerwerk und Rechenwerk,
(b) Speichereinheit
(c) Ein/Ausgabe-Einheit (Verbindung zu Bildschirm, Maus, Tastatur, Drucker, ext. Speicher, . . .)
(d) Bedienkonsole (Knöpfe, Schalter, Anzeige).
Das Rechenwerk enthält die Register (auch Akkumulator), in denen Rechenoperationen durchgeführt werden können. Die Anzahl der Bits der Register ist eine wesentliche Architekturgröße des
Rechners.
In der Maschinensprache werden alle Operationen (Rechen-, Steuerbefehle, ..) und alle Operanden (Register-, Speicherinhalt, ...) durch Zahlen angegeben. Diese umständliche Art der Programmierung wurde früh durch die Assemblersprache vereinfacht, die die Operatoren nicht mehr durch
Zahlen sondern symbolisch notiert. Diese Sprache wird durch ein Programm, den Assembler, in
Maschinenkode übersetzt. Ein Beispiel hierzu steht in [29, S. 22ff].
6.A.2
Übersetzer (Compiler)
Das Programmieren in höheren Sprachen setzt keine Kenntnisse über den Maschinenkode des Rechners voraus, diese Arbeit ist damit zum großen Teil rechnerunabhängig. Der Sprachkode muss natürlich in Objekte (Maschinenkode) übersetzt werden, diese Aufgabe erfüllt der Übersetzer (Compiler).
Manche Programmiersprachen erlauben ein getrenntes Übersetzen einzelner Programmteile, die
dann später mit dem Binder zusammengefügt werden. Bei anderen Sprachen wird das gesamte
Programm auf einmal übersetzt und gebunden. Zur ersten Art gehören Fortran und Modula-2, zur
zweiten Pascal.
Die Arbeitsweise von Übersetzern wird zum Beispiel in [43, S. 256ff] beschrieben.
6.A.3
Binder (Task-Builder, Linker)
Der Binder bindet die als Objekte (Maschinenkode) vorliegenden Programmteile zu einem Programm zusammen. Diese Programmteile sind, vgl. 6.B
(a) durch Assembler oder Übersetzer entstandene Anwenderprozeduren,
(b) Prozeduren aus Objektbibliotheken,
(c) Systemprozeduren (z.B.: math. Funktionen, Ein/Ausgabe- oder Kommunikationroutinen),
6 Programmstrukturen
59
(d) Aufruf von speicherresidenten Prozeduren,
(e) Schnittstellen zu speicherresidenten Daten (system global common).
Ferner organisiert der Binder das Nachladen von überlagerten Programmteilen (Overlay). Das
Überlagern von Programmteilen ist notwendig, falls das gesamte Programm größer als ein adressierbaren Teil des Speichers wird. Hierauf wird hier nicht weiter eingegangen.
Bei einigen Programmiersprachen, wie zum Beispiel Pascal, wird das Übersetzen und Binden
zusammengefasst. Um dennoch auch hier Maschinensprache mit verarbeiten zu können, erlauben
diese Sprachen in der Regel das Einfügen von Zeilen in Maschinensprache.
6.A.4
Lader
Der Lader lädt das (in einer Datei vorhandene) Programm in den Speicher und bringt es zur
Ausführung.
Einige Betriebssysteme (DEC: RSX-11M, VAX, VMS) unterteilen das Laden in zwei Phasen:
(a) Das Installieren (Install): Hier wird nicht das gesamte Programm sondern lediglich der Programmkopf geladen. Der Programmkopf enthält den Programmnamen und weitere Informationen zur Konfiguration, die beim Installieren festgelegt werden können.
Unter Windows entspricht das Installieren ohne das Programm sofort auszuführen, der SchnellstartOption.
(b) Das Ausführen (Run, Execute): Der Programmrumpf wird geladen, das Programm wird ausgeführt.
6.A.5
Interpreter
Übersetzte Programme werden vor dem Ausführen insgesamt übersetzt und gebunden. Interpreter
übersetzen das Programm zeilenweise und führen es aus (Basic, APL ).
• Vorteile:
(a) Der Sprachkode ist maschinenunabhängiger, da der Interpreter an die Maschine angepasst werden kann. Dadurch ist das Arbeiten am Rechner problemorientiert und rechnerunabhängig, man arbeitet an einer abstrakten Maschine.
(b) Ein zeilenweises Testen ist möglich, die Fehlerstelle schneller sichtbar.
(c) Der Interpreterkode ist in der Regel kompakter als Maschinenkode, das gesamte Programm benötigt also weniger Speicherplatz als ein übersetztes Programm.
• Nachteile: Eventuell muss ein Verlust an Laufzeiteffizienz in Kauf genommen werden.
MatLab übersetzt alle Funktionen beim ersten Benutzen und führt eine Konfigurationskontrolle
durch, die sicherstellen soll, dass geänderte Funktionen beim nächsten Aufruf neu übersetzt werden.
Dies misslingt, wenn die Funktion geändert und in einem anderen, übergeordneten Verzeichnis
gespeichert wird. Trotzdem ist MatLab ein Interpreter, denn es werden keine lauffähigen Programme
erzeugt.
6.B
Bestandteile eines Programms
Literatur: Pomberger [40, S. 102ff], Schauer, Barta[46, S. 86ff]
Eingegangen wird auf die Bestandteile von Programmen bei der Verwendung zu übersetzender Sprachen wie Fortran, Pascal, Modula-2 u.a.. Auch auf die Besonderheit einer interpretativen
Sprache mit einem interaktiv zu bearbeitenden Arbeitsbereich (APL, MatLab) wird hingewiesen.
60
I Softwareentwicklung
6.B.1
Prozedur
Eine Prozedur ist die kleinste aufrufbare Einheit eines Programms. Sie kann von jeder Stelle des
Programms mit Aufrufparametern aktiviert werden, die Ergebnisse werden auf Ergebnisparametern
zurückgegeben.
Die meisten Sprachen unterscheiden Unterprogramme und Funktionen. Funktionen haben im
allgemeinen einen Ergebnisparameter. Diese können natürlich auch allgemeine Felder (Zellenfelder)
sein. APL und MatLab kennen nur Funktionen.
Als spezielle, nicht ausführbare Prozedur besitzt Fortran die BLOCK DATA Routine. Diese
dient zum Initialisieren der Werte von programmglobalen Variablen (COMMON), s. Alg. 6.1.
BLOCK DATA BDAdmini
IMPLICIT NONE
INTEGER*4
INTEGER*4
INTEGER*4
PARAMETER
CHARACTER*6
INTEGER*4
INTEGER*4
aderro
aderpa(5)
adstle
(adstle=20)
adstro(adstle)
adstlo(adstle)
adstpo
! Error Code
! Error Parameters
! Length of Trace Stack
COMMON
/ADMINI/
aderro,aderpa,adstro,adstlo,adstpo
DATA
DATA
END
aderro,aderpa,adstlo,adstpo/
27*0/
adstro
/’Root’,19*’ ’/
! Trace Stack: Routines
! Trace Stack: Locations
! Pointer to Actual Routine
Alg. 6.1 : BLOCK DATA-Anweisung
Der gemeinsame Datenbereich wird in den benutzenden Routinen durch seinen Namen Admini
identifiziert, die Variablen belegen die Speicherplätze des Datenbereichs entsprechend der Reihenfolge in der COMMON-Anweisung.
In diesem Beispiel werden alle ganzzahligen Variablen mit 0 vorbelegt, die 1. Komponente des
Textvektors mit dem Wort ’Root’ für Hauptmodul. Der Parameter adstle, der die Kellertiefe
angibt, gehört nicht zu den gemeinsamen, programmglobalen Variablen. Die Verwendung dieser
Datenstruktur wird später als Beispiel für eine Datenkapsel erläutert.
Die Länge des gemeinsamen Datenbereichs wird beim Binden des Programms nicht überprüft!
6.B.2
Modul
Eine oder mehrere, inhaltlich zusammengehörige, Prozeduren werden in einer Datei zusammengefasst und gleichzeitig übersetzt. Ferner können Prozeduren aus Sprachbibliotheken (z.B. Ein/Ausgaberoutinen) und programmglobale Datenstrukturen in den Modul aufgenommen werden.
Das Modulkonzept ermöglicht das Verwenden von Objektkode in mehreren Programmen bei einmaligem Übersetzen.
Sind mehrere Prozeduren in einem Modul zusammengefasst, so kann jeder einzelne von außen
aufgerufen werden. Es kommt jedoch häufig vor, dass nur einer oder wenige von außen aufgerufen
werden. Nach außen muss lediglich die Schnittstelle für die Ein- und Ausgangsparameter bekannt
sein, der Algorithmus kann verborgen bleiben.
6 Programmstrukturen
6.B.3
61
Programm
Ein Programm besteht aus einer lauffähigen oder ausführbaren Zusammenfassung von Moduln
und Prozeduren aus Bibliotheken. Es kann durch Schnittstellen an speicherresidente Bibliotheken
und systemglobale Datenstrukturen angeschlossen sein. Das Programm wird durch einen Namen
identifiziert, der in der Regel gleich dem Dateinamen der ausführbaren Datei ist. Unter den Betriebssystemen DOS und Windows sind dies Dateien mit den Erweiterungen exe oder com.
Diese Einheiten sind nicht bei allen Programmiersprachen vorhanden. Fortran und Modula-2
kennen alle Einheiten, bei Turbo-Pascal (bis zur Version 4) besteht das gesamte Programm aus nur
einem Modul, es wird immer geschlossen übersetzt.
In APL und MatLab arbeitet man mit einem Arbeitsbereich, der alle globalen Daten und alle
Funktionen beinhaltet. Jede Funktion kann interaktiv, also vom Benutzer am Bildschirm, und von
anderen Funktionen aufgerufen werden. Eine Funktion ist also zugleich Prozedur und Programm
in obigem Sinne.
6.C
Parameterübergabe bei Prozeduraufruf
Literatur: Schauer, Barta [46, S. 89ff]
Beim Aufruf einer Prozedur werden den formalen Parametern in der Definition der Prozedur
die aktuellen Aufrufparameter zugeordnet. Die formalen Parameter können Eingangsparameter,
Ausgangsparameter oder Durchgangsparameter (Ein- und Ausgangsparameter) sein.
Bei den gängigen Programmiersprachen sind alle Typen möglich. APL und MatLab trennen jedoch streng zwischen den Eingangsparametern und dem Ausgangsparameter, soweit sie vorhanden
sind. Es gibt in diesen Sprachen also keine Durchgangsparameter. Ein aktueller Ausgangsparameter muss eine Variable sein, er darf kein Ausdruck sein. Dagegen können die Eingangsparameter
Ausdrücke sein.
Die Parameterübergabe ist in den einzelnen Programmiersprachen unterschiedlich organisiert.
Es kann der Wert, die Adresse oder der Name der aktuellen Variablen übergeben bzw. zurückgegeben werden. Für den Programmierer ist es wichtig zu wissen, wie die Parameterübergabe organisiert
ist und wo eine formale Variable aktuell verankert ist. Dies lässt bei der Fehlersuche Rückschlüsse
auf eventuell unliebsame Nebeneffekte zu.
6.C.1
Wertübergabe (Call by Value)
Der Wert des Eingangsausdrucks wird berechnet und auf den formalen Parameter, der in diesem
Fall eine lokale Variable ist, übertragen. Bei der Rückgabe wird der Wert des lokalen formalen
Parameters auf den aktuellen Ausgangsparameter übertragen. APL benutzt ausschließlich diese
Methode.
Der Gültigkeitsbereich des formalen Parameters ist durch die Eigenschaft, eine lokale Variable zu
sein, festgelegt: Er ist damit auf diese Prozedur und eventuell aufgerufene Prozeduren eingeschränkt.
Variablen gleichen Namens in übergeordneten Prozeduren haben dagegen hier keine Gültigkeit.
Das nebenstehende Beispiel in APL soll dies verdeutlichen, zunächst
wird die Funktion notiert, dann die interaktiv eingegebenen Befehle
und ihre Ergebnisse:
Die Variablen a und b der Funktion Subr werden beim Aufruf mit 3
und 4 belegt und zu 9 und 16 geändert. Die Variablen a und b des
Arbeitsbereichs (oder der übergeordneten Funktion) behalten ihren
Wert.
Diese Art der Parameterübergabe ist eine sichere Methode, sie vermeidet Nebeneffekte.
[0]
[1]
[2]
[3]
rûa Subr b
aûa*2
bûb*2
rûa-b
aû3
bû4
rûa Subr b
a,b,r
3 4 ¢7
62
6.C.2
I Softwareentwicklung
Adressübergabe (Call by Reference)
Bei dieser Art der Parameterübergabe wird als Anfangsadresse des formalen Parameters die Anfangsadresse des aktuellen Parameters übergeben. Bei einer Veränderung des formalen Parameters
im Unterprogramm wird damit im gleichen Augenblick der Wert des aktuellen Parameters geändert.
Fortran kennt nur die Adressübergabe.
Dies ist eine schnelle Art der Parameterübergabe. Sie überlässt jedoch dem Programmierer
Kontrolle über die Unterscheidung zwischen Ein-/Ausgabeparameter und bei Fortran auch die
Typ- und Längenkontrolle.
Streng genommen sind hier als aktuelle Parameter nur VaPROGRAM Falsch
INTEGER*4 a
riable und keine Ausdrücke erlaubt. Fortran erlaubt jedoch
..
auch Ausdrücke als aktuelle Parameter: Der Compiler weist
.
den Wert des Ausdrucks einer neu definierten Variablen zu
CALL Subr(a,2,4)
..
und führt den Unterprogrammaufruf mit dieser Variablen
.
durch.
Write(6,*) 2 !Schreibt 4!
Klar ist, das die Adressübergabe für Ausgangsparameter
..
.
keine Ausdrücke oder Konstanten erlaubt. Der FortranEND
Compiler überprüft dies jedoch nicht, was zu unerwünschten Nebeneffekten führen kann. In Fortran sind Konstanten
SUBROUTINE Subr(a,b,c)
eigentlich auch Variable, der Compiler kann nur im vereinINTEGER*4 a,b,c
barenden Unterprogramm überprüfen, dass keine Wertzu..
weisung erfolgt.
.
Im folgenden Beispiel wird beim Aufruf des Unterprob = c
..
gramms Subr der Speicherplatz, auf den der Compiler die
.
Konstante 2 abgelegt hat, mit 4 überschrieben. Solche ProEND
grammfehler erfordern viel Zeit, bis sie gefunden sind.
Ein weiteres Beispiel mit Nebeneffekten aufgrund der Adressübergabe steht bei [29, S. 73f].
6.C.3
Namensübergabe (Call by Name)
Bei der Namensübergabe wird der Wert des aktuellen Parameters an jeder verwendeten Stelle
explizit berechnet. Ist der aktuelle Parameter ein Ausdruck, z.B. eine Funktion, so werden die an der
aktuellen Stelle gültigen Werte der globalen Variablen und Argumente der Funktion berücksichtigt.
Diese Art der Übergabe ist bei Algol60 möglich. Sie kann in MatLab nachempfunden werden, indem
ein Ausdruck, der eine Variable x beinhaltet, als Textvektor an eine Funktion übergeben wird.
Mit dem Aufruf Steffensen(’x-exp(-x)’,1,1E-13) wird eine Nullstelle von f (x ) = x − e −x
ausgehend vom Startwert x = 1 und der Toleranz 10−13 berechnet:
In der Funktion werden in den
Die Übergabe einer Funktion als Funktionsgriff (s. 4.E.2)
Zeilen 2 und 6 die Funktionswerte für die Werte x und f(x) ausgewertet, also f(x) und f(f(x)) berechnet. Funktion eval führt den
in der Textvariablen gespeicherten
Ausdruck aus.
ist allerdings besser, da z.B. nicht auf den Namen der Variablen geachtet werden muss.
APL kennt nur Wertübergabe. Fortran kennt nur Adressübergabe. Pascal und Modula-2 kennen Wert- und Adressübergabe. Hier muss jedoch ein Ausgangsparameter immer mit Adresse übergeben werden. Ein Beispiel in Pascal:
Der Parameter n wird mit Adresse, i mit Wert übergeben. MögliPROCEDURE INCREMENT (VAR n: INTEGER; i:INTEGER);
che Aufrufe sind INCREMENT (y,5)
BEGIN
oder INCREMENT (y,y), wobei beim
n:=n+i
letzten Aufruf der Wert von y verEND
doppelt wird.
6 Programmstrukturen
6.D
63
Globale und lokale Daten
Literatur: Schauer, Barta [46, S. 96ff], Pomberger [40, S. 103ff], Ludewig [29, S. 82ff]
6.D.1
Gültigkeitsbereich von Variablen
Die Variablen einer Prozedur können lokal, also nur in dieser Prozedur, oder global, also auch
in übergeordneten Prozeduren innerhalb des Programms, gelten. In allen Sprachen sind formale
Aufrufparameter einer Prozedur lokal. Auf die speziellen system-globalen Variablen wird hier nicht
eingegangen.
In Fortran sind Variablen implizit lokal, unabhängig von der Deklarationsart (explizit oder
implizit). Durch eine COMMON-Anweisung können sie zu globalen Variablen erklärt werden (s. 6.B, ein
weiteres Beispiel folgt bei der Behandlung von Datenkapseln.) In verschiedenen Unterprogrammen
benutzte globale Variable werden anhand ihrer Position im COMMON-Bereich identifiziert, nicht an
hand ihres Namens.
In Pascal, Algol60 sind alle in einer Prozedur deklarierten Variablen lokal, nicht in einer
Prozedur vereinbarten Variablen sind global. Diese müssen aber in einer übergeordneten Prozedur
vereinbart sein zu der sie dann lokal sind.
In MatLab sind alle in einer Funktion benutzten Variablen lokal, globale Variable müssen als solche vereinbart werden: global a b c vereinbart die Variablen a, b, c als global.
In verschiedenen Unterprogrammen
oder Funktionen global vereinbarte
Variablen werden anhand ihres Namens identifiziert.
In der Darstellung deuten ,:‘ und
,.‘ die Gültigkeit beim Aufruf oder
beim Rücksprung, jedoch nur außerhalb der gerufenen Routine, an.
function r=Subr(a,b)
global d
c=a^2;
d=b^2;
r=c-d;
>> global d
>> a=3;
>> b=4;
>> c=5;
>> d=6;
>> r=Subr(3+a,1+b);
>> [a,b,c,d,r]
ans =
3
4
5
% Gültigkeit der Variablen
% a b c d r a’ b’ c’ r’
%
|
% |
|
% | |
|
% | | | |
% | | | |
% : : : | . | | | | |
% | | | | |
25
11
In Modula-2 und Ada erlauben Moduln der Umwelt durch eine Export-Anweisung explizit das
Benutzen von hier deklarierten Daten. Andere Moduln können diese dann importieren.
In APL sind alle Variablen außer
den Übergabeparametern implizit
[0] rûa Subr b;c
global, durch Angabe in der Defini[1] cûa*2
[2] dûb*2
tionszeile können sie zu lokalen Va[3] rûc-d
riablen erklärt werden. Ein Beispiel
.
erläutert den Gültigkeitsbereich:
ã G.ultigkeit
der Variablen
In der untergeordneten Funktion
ã
a b c d r a' b' c' r'
aû3
ã
Í
Subr hat neben den lokalen Variabbû4
ã
Í Í
len a’, b’, c’ und r’ noch die globacû5
ã
Í Í Í
le Variable d Gültigkeit. Ihre Wert
dû6
ã
Í Í Í Í
wird verändert. Diese Änderung eirû(3+a) Subr 1+b
ã
: : : Í . Í Í Í Í
a,b,c,d,r
ã
Í Í Í Í Í
ner globalen Variablen in einer Pro3
4
5
25
11
ã
zedur nennt man Nebeneffekt oder
Nebenwirkung.
6.D.2
Nebenwirkungen
Das gefährliche an Nebenwirkungen ist, dass sie beim Aufruf einer Prozedur nicht unmittelbar
erkennbar sind. Nebenwirkungen sind deshalb zu vermeiden. In den Fällen der unvermeid-
64
I Softwareentwicklung
baren Notwendigkeit sind sie gut zu dokumentieren. Ein hoffentlich überzeugendes Beispiel soll dies
belegen:
Die nebenstehende Funktion erhöht den Wert der globalen Variablen n um 1 und gibt ihn zurück.
Was passiert bei nebenstehenden Aufrufen, wenn jeder
Ausdruck von rechts nach links abgearbeitet wird?
6.D.3
Trick ::=
DCL(Trick TYPE INTEGER);
Trick := n := n+1;
RETURN;
Werte von n
vor
nach
dem Aufruf
n:=1;
Trick+n
n+Trick
1
2
1
2
3
Ergebnis
3
6
Globale Variable und Modularisierung
Das Benutzen globaler Daten widerspricht im strengen Sinne der modularen Programmierung.
Die Schnittstellen zwischen den Prozeduren liegen nicht offen, durch die Nebenwirkungen werden
die Prozeduren zu eng gekoppelt. Darunter leidet das Testen und Warten der Prozeduren, eine
Änderung der Deklaration nicht-lokaler Daten wirkt sich auf alle benutzenden Prozeduren aus.
Auf der anderen Seite eignen sich globale Variablen und Datenstrukturen sehr gut zum Speichern
von Konstanten oder Daten, die einmal geladen werden und dann nur noch gelesen werden, also
als zusätzlich Eingangsparameter dienen. In Mehrprogrammsystemen der Echtzeitprogrammierung
werden system-globale Datenbereiche als Schnittstellen zwischen Programmen benutzt und sind
dort aus Gründen der Laufzeiteffizienz von großer Bedeutung.
Die Verwendung globaler Daten in diesem Sinne wird durch das Konzept der Datenkapsel beschrieben. Hier greifen nur die zur Datenkapsel gehörenden Prozeduren auf die globalen Daten zu
und geben sie den aufrufenden Prozeduren zurück.
Als positiv ist in Fortran in MatLab zu werten, dass globale Variable explizit als global deklariert
werden müssen.
6.E
Speicherorganisation der Daten
(a) Statisches Speichern der Daten (Fortran): Die Variable besitzt ihren Speicherplatz während
der gesamten Programmlebenszeit.
Der Übersetzer reserviert den benötigten Speicherplatz für alle Variable des Programms. Beim
Aufruf einer Routine werden die lokalen Variablen nicht initialisiert, sie haben den Wert, den
sie beim Verlassen des letzten Aufrufs hatten. Dies muss beim Programmieren berücksichtigt
werden!
Diese Methode ist unfexibel, die meisten Speicherplätze werden nur kurzzeitig benutzt.
Rekursive Programmierung ist nicht möglich, denn für jede Inkarnationen ist weiterer Speicherplatz für die lokalen Variablen nötig.
(b) Speichern der Daten in einem Laufzeitstapel (auch: Keller, Stapel (stack)), (Pascal, Modula2, APL , MatLab): Sie arbeiten im lifo-Modus (last-in-first-out): Beim Aufruf einer Prozedur
werden alle lokalen Variablen mit Namen und Werten auf den Stapel gelegt. Beim Zugriff auf
eine Variable wird die zuletzt auf den Stapel gelegte Variable mit dem gewünschten Namen
benutzt. Damit werden lokale Variable bevorzugt vor globalen Variablen gleichen Namens,
die in diesem Fall also keine Gültigkeit haben, vgl. Beispiel in 6.D. Beim Rücksprung aus
einer Prozedur werden alle ihre Variable vom Stapel entfernt.
6 Programmstrukturen
65
Diese Methode arbeitet sehr speichereffizient. Ferner erlaubt sie rekursives Programmieren,
da die lokalen Variablen bei jeder Inkarnation neu im Stapel angelegt werden.
Der Stapel pulsiert (ändert seine Größe) während des Programmablaufs. Er kann bei großem
Speicherbedarf überlaufen, worauf bei rekursivem Programmieren zu achten ist.
6.F
Rekursiver Prozeduraufruf
Literatur: Schauer, Barta [46, S. 101ff], Ludewig [29, S.75ff]
Die einfachste Definition der Rekursion lautet:
Rekursion:
siehe Rekursion.
In der Software-Technik bedeutet Rekursion, dass sich eine Prozedur selbst aufruft, direkt oder
indirekt.
Die erste Definition zeigt zugleich die Grenzen der Anwendung der Rekursion in der Programmentwicklung: Eine Rekursion in einem Programm muss irgendwann einmal abbrechen.
Als erstes Beispiel eines rekursiven Programmaufrufs wurde das Steffensen-Verfahren zur Bestimmung von Nullstellen bereits erwähnt.8 Als Abbruchkriterium wird hier der Funktionswert
benutzt, der sich 0 nähert.
6.F.1
Sortieralgorithmus
Als weiteres Beispiel betrachten wir das Ordnen
einer Menge von Zahlen. Die Grundidee des nebenstehenden Algorithmus besteht darin, zuerst
alle Elemente zu ordnen, die kleiner als das erste sind, und alle Elemente zu ordnen, die größer
als das erste sind. Im Ordnen der beiden echten
Teilmenge bestehen die rekursiven Aufrufe. Abgebrochen wird die Rekursion bei einelementigen
und leeren Mengen.
Ord(a)::=
DCL( a TYPE SET INTEGER;
b TYPE SET INTEGER;);
IF(|a|≤1) THEN Ord := a;
ELSE
b:={x∈a | x<a[1]};
Ord:=(Ord b),a[1],Ord((a-b)-a[1]);
ENDIF;
Dieser Algorithmus erlaubt auch mehrfaches Auftreten des gleichen Elements in der eingegebenen
Liste, in der geordneten Liste treten gleiche Elemente in der gleichen Anzahl wie in der eingegebenen Liste auf. Allerdings ist bei Listen mit
vielen mehrfachen Einträgen den nebenstehende
in MatLab notierte Algorithmus effizienter.
function b = Ord(a)
if(length(a) <= 1) b = a;
else
b=[Ord(a(a<a(1))),a(a=a(1)),...;
Ord(a(a>a(1)))];
end;
Es folgt die APL-Kodierung, APL beinhaltet diesen Algorithmus allerdings auch in der Systemfunktion Upgrade.
[0]
[1]
[4]
[5]
6.F.2
rûOrd a;l
ý(1¦Òrû,a)/0
lûr<r[1]
rû(Ord l/r),r[1],Ord 1Õ(~l)/r
Rekursives Programmieren
Voraussetzung für einen rekursiven Programmaufruf ist, dass bei jeder Inkarnation auch die Aufrufparameter und die lokalen Parameter neu angelegt werden. Folglich erlauben nur jene Programmiersprachen Rekursionen, die lokale Daten auf einem Laufzeitstapel anlegen. Fortran erlaubt also
keine Rekursion.
8
6.C.3
66
I Softwareentwicklung
Beim Programmieren ist darauf zu achten, dass alle Variablen, die in einer Prozedur vor einem
rekursiven Aufruf beschrieben und danach gelesen werden, lokal sind! Andernfalls wird der Wert
dieser Variablen in der nächsten Inkarnation verändert! Als Beispiel beachte man die Veränderungen
der Menge b in obigem Pseudokode beim Aufruf Ord {2,4,3,1}, falls b global wäre! Analog beachte
man den Wert der global angenommen Variablen l im APL-Kode beim entsprechen Aufruf Ord 2
4 3 1. Das Ergebnis wäre 4 2 3 4.
Auf der anderen Seite kostet das Neuanlegen der lokalen Variablen Speicherplatz. Es ist auch
oft sinnvoll, Daten in einer rekursiven Funktion global zu halten, falls dies unter Berücksichtigung
der obigen Überlegungen erlaubt ist.
6.F.3
Der Turm von Hanoi
Rekursives Programmieren erzeugt in vielen Fälle kurze Algorithmen. Dies soll anhand des Beispiels
Der Turm von Hanoi“ dargelegt werden. Es ist die Aufgabe des Software-Entwicklers, die Rekursion
”
im Entwicklungsprozess herauszuarbeiten. Da in APL Schleifen zeitintensiv ablaufen, bietet hier
in vielen Fällen die Rekursion eine laufzeiteffiziente Alternative. In MatLab ist dieser Zeitvorteil
nicht vorhanden, weil die Funktionen nur einmal übersetzt werden. Die Elleganz bei Verwenden
von Rekursionen im Programmkode bleibt der Vorteil!
Die Aufgabe besteht darin, einen Turm aus nach oben kleiner werdenden Scheiben scheibenweise
abzutragen und an einer anderen Stelle wieder aufzubauen. Dabei müssen folgende Regeln beachtet
werden:
(a) Es darf nur einen Turm als Zwischenlager existieren. Es gibt also einen Anfangs-, einen Endund einen Zwischenturm.
(b) Niemals liegt eine größere Scheibe auf einer kleineren.
(c) Es darf immer nur eine Scheibe bewegt werden.
Die Idee des Algorithmus besteht in folgender Aufteilung der Gesamtaufgabe, wobei mit A, E,
Z der Anfangs-, End- und Zwischenturm bezeichnet wird:
1. Zunächst wird der Turm bis auf die unterste Scheibe nach Z übertragen, wobei E als Zwischenturm dient.
2. Jetzt wird die unterste Scheibe auf E gelegt.
3. Schließlich wird der verkleinerte Turm von Z nach E übertragen, wobei A als Zwischenturm
dient.
Für den ersten und dritten Schritt kann dieser Algorithmus wieder rekursiv aufgerufen werden.
Bei jedem Schritt bleiben die Bedingungen (a) - (c) erfüllt, wobei die zweite Bedingung einer
genaueren Überlegung bedarf: Bei den Schritten 1 und 3 werden jeweils die Turmspitzen bewegt,
also bleibt sie erhalten. Beim 2. Schritt liegen, da er unmittelbar nach dem 1. Schritt ausgeführt
wird, alle kleineren Scheiben auf dem Turm Z, auf E liegen (auch in der Rekursion) nur größere
Scheiben.
Zur Implementierung des Algorithmus wird
ein Turm durch einen Vektor dargestellt, dessen erstes Element der untersten Scheibe entspricht. Die Werte der Vektorkomponenten
sind natürliche Zahlen und stellen die Größe
der Scheiben dar. Der Anfangsturm der Höhe 5 wird also dargestellt durch den Vektor
(5,4,3,2,1).
Dieser Algorithmus benutzt zwei Funktionen, die Funktion Length liefert die Länge
der Vektors, die Funktion Top(n,a) die Spitze des Turms, also die letzten n Komponenten des Vektors a.
Hanoi(a,e,z)::=
DCL (a TYPE ARRAY INTEGER;
e TYPE ARRAY INTEGER;
z TYPE ARRAY INTEGER;
n TYPE INTEGER; Länge des Vektors a
)
n := Length(a);
IF(n>0) THEN
Hanoi(Top(n-1,a),z,e);
e := e,a;
unterste a-Scheibe auf e
Hanoi(z,e,a);
ENDIF
6 Programmstrukturen
6.G
67
Datenkapseln
Literatur: Schauer, Barta [46, S. 106ff]
Datenkapseln beinhalten Datenstrukturen, auf die nur durch Routinen zugegriffen wird, die zur
Datenkapsel gehören. Diese Routinen heißen Zugriffsfunktionen. Die Realisierung der Datenstruktur
wird dadurch für den Rest des Programms versteckt oder abgekapselt.
Bekannte Beispiele von Datenkapseln sind die I/O-Routinen, die jeder Compiler anbietet. Als
weiteres wichtiges Beispiel sei hier die Realisierung eines Kellers mit den Zugriffsfunktionen Init
(Initialisierung), Push und Pop genannt. Hierauf wird auch in dem weiter unten aufgeführten Beispiel zurückgegriffen.
6.G.1
Realisierung in einzelnen Sprachen
Fortran: Die Daten werden in einem globalen Datenbereich, einem COMMON-Block, gehalten. Die
Zugriffsroutinen werden üblicherweise mit einer initialisierenden BLOCK DATA - Routine in einem
Modul zusammengefasst. Sie können durch den EXTERNAL-Befehl explizit eingebunden werden.
Pascal: Die Daten müssen explizit in dem Hauptprogramm vereinbart werden. Damit sind sie
dann als globale Daten definiert. Die Zugriffsroutinen müssen als Pascal-Kode in das Programm
aufgenommen und mit übersetzt werden. Damit ist die Datenkapsel“ für den Anwendungspro”
grammierer nicht mehr verdeckt.
Modula-2:
Datenkapseln können mit dem MODULE-Konzept realisiert werden.
APL: Eine initialisierende Funktion legt die Daten der Datenkapsel als globale Daten an. Auf
diese Daten kann dann jede Zugriffsfunktionzugreifen. Bei Verwendung von Datenkapseln darf kein
Unterprogramm unbeabsichtigt die Namen der Datenkapsel-Variablen als nicht-lokale Variable benutzen.
Eine andere Möglichkeit zur Realisierung von Datenkapseln ist durch die Implementierung eines
Auxiliary Processors“ gegeben. In diesem Fall ist die Datenstruktur völlig versteckt.
”
MatLab: Eine initialisierende Funktion legt die Daten der Datenkapsel mit dem Befehl global als
globale Daten an. Auf diese Daten kann dann jede Zugriffsfunktion zugreifen, sie muss die Variablen
ebenfalls mit dem Befehl global als global festlegen.
6.G.2
Beispiel: Speichern der Aufrufhierarchie und Ausgabe mit Fehler im Fehlerfall in Fortran.
In dieser Datenkapsel werden die Namen der Routinen in ihrer Aufrufsequenz und Positionen in den aufrufenden Routinen im gemeinsamen Datenbereich Admini gespeichert. Ferner werden im Fehlerfall die
Fehlernummer und Fehlerparameter abgelegt. Alle Informationen, also
Fehlernummer, -parameter, und Aufrufsequenz bis zur Fehlerstelle einschließlich der Positionen der nächsten Routine können (in Fehlerfall)
ausgegeben werden. Auf den gemeinsamen Datenbereich wird nur über
die Zugriffsroutinen zugegriffen.
Abb. 6.1: Datenkapsel Admini
68
I Softwareentwicklung
Datenstruktur: Die Namen der Routinen und Position in einer Routine werden in einem Keller
(last-in-first-out), dessen Tiefe durch einen Parameter definiert ist, gehalten. Weitere Variablen
nehmen die Fehlernummer und Fehlerparameter im Fehlerfall auf. Die Datenstruktur wird in dem
COMMON Admini abgelegt. Die Deklarationen werden in eine Datei Admini.dat geschrieben, die
dann per INCLUDE Admini.dat in jede Zugriffsroutine aufgenommen wird. Die Datei Admini.dat
ist in Abb. 6.2
INTEGER*4
INTEGER*4
INTEGER*4
PARAMETER
CHARACTER*6
INTEGER*4
INTEGER*4
aderro
aderpa(5)
adstle
(adstle=20)
adstro(adstle)
adstlo(adstle)
adstpo
! Error Code
! Error Parameters
! Length of Trace Stack
! Trace Stack: Routines
! Trace Stack: Locations
! Pointer to Actual Routine
COMMON
/ADMINI/
aderro,aderpa,adstro,adstlo,adstpo
Abb. 6.2: Admini.dat
Initialisierung: Die Datenstruktur wird in der BLOCK DATA-Routine Bdadmini, die in Abb. 6.3
enthalten ist, initialisiert: Alle numerischen Variablen werden auf 0 gesetzt, alle Textvariable mit
Leerzeichen gefüllt, außer der ersten.
BLOCK DATA BDAdmini
IMPLICIT NONE
INCLUDE Admini.dat
DATA
DATA
END
aderro,aderpa,adstlo,adstpo/
27*0/
adstro
/’Root’,19*’ ’/
Abb. 6.3: BLOCK DATA Bdadmini
Eintragen des aktuellen Unterprogrammnamens in Adpush(routin): Der Aufruf dieser
Routine ist die erste Anweisung in jedem Unterprogramm. Sie ist in Abb. 6.4 dargestellt.
Streichen des aktuellen Unterprogramms in Adpop: Der Aufruf dieser Routine ist die letzte
Anweisung in jedem Unterprogramm bei fehlerfreiem Verlauf, s. Abb. 6.5.
Setzen einer Positionsnummer in Adlset(loc): Diese Routine kann jederzeit aufgerufen werden, um die aktuelle Positionsnummer im aktuellen Unterprogramm zu ändern, s. Abb. 6.6
Adeset(fehler,fehpa1,fehpa2,fehpa3,fehpa4,fehpa5): Im Falle eines Fehlers werden mit dieser Routine die Fehlernummer und Fehlerparameter in die Datenkapsel eingegeben (Abb. 6.7)
6 Programmstrukturen
69
SUBROUTINE Adpush(routin)
IMPLICIT NONE
CHARACTER*6 routin
INCLUDE Admini.dat
aderpa = 0
IF(adstpo=adstle) THEN
Write(6,*) ’Adpush: Keller in Admini voll’
ELSE
adstpo = adstpo + 1
!Zeiger erhöhen
adstro(adstpo) = routin
!Name der Routine eintragen
adstlo(adstlo) = 1
!Position im Programm: 1
ENDIF
END
Abb. 6.4: Adpush
SUBROUTINE Adpop
IMPLICIT NONE
INCLUDE Admini.dat
adstpo = adstpo - 1
END
!Zeiger erhöhen
Abb. 6.5: Adlpop
SUBROUTINE Adlset(loc)
IMPLICIT NONE
INTEGER*4 loc
INCLUDE Admini.dat
adstlo(adstpo) = loc
END
Abb. 6.6: Adlset
Ausgabe: Adedis, Adeprt: Diese Routinen zur Fehlerausgabe geben die Fehlernummer, die Fehlerparameter und die im Keller gespeicherte Aufrufsequenz mit den Positionen auf den Drucker,
den Anwender-Bildschirm und den Monitor-Bildschirm aus und Schreiben eine Meldung in das
LOG-Buch des Systems. Diese Routinen sind mit ihren weiteren Aufrufen systemabhängig, da
sie spezielle Bildschirmausgaben und Systemroutinen zur Ausgabe auf den Monitor und in das
LOG-Buch benutzen.
70
I Softwareentwicklung
SUBROUTINE Adeset(fehler,fehpa1,fehpa2,fehpa3,fehpa4,fehpa5)
IMPLICIT NONE
INTEGER*4 fehler,fehpa1,fehpa2,fehpa3,fehpa4,fehpa5
INCLUDE Admini.dat
aderro = fehler
aderpa(1) = fehpa1
aderpa(2) = fehpa2
aderpa(3) = fehpa3
aderpa(4) = fehpa4
aderpa(5) = fehpa5
END
Abb. 6.7: Adeset
Kapitel II
Numerische Verfahren der Analysis
§ 7 Bisektionsverfahren und Regula falsi
In diesem und den folgenden Paragrafen behandeln wir Verfahren zur Bestimmung der Nullstellen
beliebiger Funktionen, das Lösungverfahren für viele Fragestellungen beinhaltet, da viele Probleme
zu Nullstellenproblemen umformuliert werden können.
(a) f (x ) = c wird auf f (x ) − c = 0 umgestellt.
(b) Die Frage nach einem Extremwert einer Funktion ist gleichbedeutend mit der Frage nach
einer Nullstelle ihrer Ableitung.
7.A
Ein einführendes Beispiel
Die Gravitationskraft der Erde ist nicht überall gleich. Ein Gravitationszentrum liegt in der Nähe
der Philippinen. Dies hat zur Folge, dass geostationäre Satelliten über Afrika nach Osten driften.
Um das zu Verhindern müssen in festen Zeitintervallen Manöver durchgeführt werden, die den
Satelliten in westlicher Richtung beschleunigen, vgl. Abb. 7.1. Hierzu besitzt der rotierende Satellit,
z.B. Meteosat, eine radiale Düse, die für eine kurze Impulsdauer ∆t gefeuert wird. Wie groß ist ihr
Impuls in der gewünschten Richtung, der x-Achse in Abb. 7.2?
Abb. 7.1: Satellit auf seiner Erdumlaufbahn
Abb. 7.2: Bereich, in dem die
Düse brennt
Der Impuls ist die über die Impulsdauer integrierte Kraft in der geforderten Richtung
∆t
Pd =
Z2
− ∆t
2
2F
F cos(ωt) dt =
sin
ω
∆ϕ
2
.
71
72
II Numerische Verfahren der Analysis
Die Effektivität ist folglich
∆ϕ
sin
2
Pd
=
.
∆ϕ
F ∆t
2
Bis zu welcher Impulsdauer ∆t ist die Effektivität größer oder gleich 80%?
sin ∆ϕ
2
∆ϕ
∆ϕ
≥ 0.8
.
≥ 0.8 ⇔ sin
∆ϕ
2
2
2
Im Grenzfall stellt sich also die Frage nach der kleinsten positiven Nullstelle der Funktion f (x ) =
sin(x ) − 0.8x .
Bemerkung 7.1 Welche Lösungsmöglichkeiten gibt es für das Nullstellenproblem?
(a) grafisch:
• Zur Bestimmung des Schnittpunkts zweier Funktionen kann man beide Funktionen zeichnen und den Schnittpunkt durch ablesen oder durch Messen bestimmen, s. Abb. 7.3.
• Nach dem Zeichnen der Funktion wird die Nullstelle näherungsweise aus der Zeichnung
abgelesen, s. Abb. 7.4.
(b) Taylorpolynom: Die Funktion (oder Teile von ihr) werden durch ihre Taylorpolynom des
Grades 2 oder 3 ersetzt:
sin(x ) ≈ x −
x3
6
1 x2
−
5
6
√
und x2/3 = ± 1.2 ≃ ±1.095
⇒
x3
0.2x −
=x
6
⇒
x1 = 0
Diese Näherungen können als Startwert für weitere Verfahren herangezogen werden.
(c) Spezielle Nullstellenverfahren:
• Bisektion
• Regula falsi
• Newton-Verfahren
• Steffensen-Verfahren
• Iterationsverfahren (Sukzessive Approximation)
Abb. 7.3: sin(x ) = 0.8x
Abb. 7.4: sin(x ) − 0.8x = 0
Im Weiteren Verlauf gehen wir auf die speziellen Nullstellenverfahren ein. Sie unterscheiden sich
sehr in ihren Voraussetzungen an die Funktion und in ihrer Konvergenzgeschwindigkeit.
7 Bisektionsverfahren und Regula falsi
7.B
73
Das Bisektionsverfahren
Wir beginnen mit dem Bisektionsverfahren, das mit einer Intervallhalbierung die Nullstelle immer
enger einschließt.
Bezeichnungen 7.2 Wir legen Bezeichnungen und Voraussetzungen fest:
Gegeben sei eine stetig Funktion f : [a, b] → R (f ∈ C 0 ([a, b]) ) mit f (a) · f (b) < 0 (Ein Wert
ist positiv, der andere negativ.). Aufgrund dieser Voraussetzung existiert immer eine Nullstelle in
dem betrachteten Intervall: ∃x̄ ∈ (a, b) : f (x̄ ) = 01 .
Jedes numerische Iterationsverfahren braucht einen oder mehrere Startwerte, eine Iterationsvorschrift und Abbruchkriterien, die festlegen, wie lange der Iterationsprozess durchgeführt werden
soll. Als Abbruchkriterien bei Nullstellenverfahren werden üblicherweise benutzt:
• der Funktionswert ist sehr nahe bei null, z.B. betragsmäßig kleiner als 10−6 . Diese Fehlerschranke muss berücksichtigen, dass im Laufe des Verfahrens numerisch bedingten Berechnungsfehler auftreten, so dass die Rechenergebnisse nicht übertreiben genau sein können.
• Der Abstand der Iterationsstellen ist relativ kleiner als die Fehlerschranke. Relativ“ bedeutet
”
hier im Vergleich zu einer Intervallgrenze.
• Beim Programmieren soll zusätzlich immer eine maximale Anzahl von Iterationsschritten als
Notbremse“ berücksichtigt werden.
”
Verfahren 7.3 (Bisektion) Das Bisektionsverfahren ist gegeben durch
(a) Startwerte: a0 := a , b0 := b
(b) Iteration: s. Abb. 7.5
bn
1. Schritt: Intervallmittelpunkt: xn+1 := an +
2
2. Schritt: Intervallhälfte mit Nullstelle:
f (an ) · f (xn+1 ) > 0 → an+1 := xn+1 , bn+1 := bn
f (an ) · f (xn+1 ) < 0 → an+1 := an , bn+1 := xn+1
(c) Abbruch: Mit der Fehlerschranke R, die oft als R = 10−6 gesetzt wird, wird das Bisektionsverfahren abgebrochen, falls |f (xn+1 )| < R oder |an+1 − bn+1 | < R · |an+1 | ist. Wir setzen im
Falle
• |f (xn+1 )| < R
:
x̄ :≈ xn+1
• (bn+1 − an+1 ) · |an+1 | < R :
,
x̄ :≈
an+1 +bn+1
2
.
Die a priori Abschätzung ist eine Fehlerabschätzung, die vor Beginn der Iteration durchgeführt
wird. Sie nutzt hier die Halbierung der Intervalllänge aus.
Satz 7.4 (Fehlerabschätzung)
(a) A priori Abschätzung:
(b) Erfüllt f ∈
C 1 ([a, b])
|xn − x̄ | ≤
1
2n (b
− a) .
die Bedingung
so gilt die a posteriori Abschätzung:
∃m ∈ R>0 ∀x ∈ [a, b] : |f ′ (x )| ≥ m > 0,
|xn − x̄ | ≤
|f (xn )|
.
m
Die Bedingung in (b) fordert, dass die Ableitung nirgends null sein darf und sich auch null nicht
nähern darf. Dies ist formal notwendig, weil die Ableitung in der Abschätzung im Beweis im Nenner
auftaucht. Anschaulich bedeutet eine Ableitung nahe null in der Nähe der Nullstelle, dass aus dem
Funktionswert in der n-ten Näherung der Abstand zur Nullstelle nicht berechnet werden kann.
1
mathematische Symbole sind im Symbolverzeichnis erklärt.
74
II Numerische Verfahren der Analysis
Beweis: Die a priori Abschätzung wird durch vollständige Induktion nachgewiesen:
• Iterationsanfang: x0 und x̄ liegen im Intervall [a, b], damit ist ihr Abstand höchstens b − a.
• Iterationsschritt:In jedem Schritt wird die Intervalllänge halbiert. xn ist ein Randpunkt des
Intervalls, dasx̄ enthält, nach der n-te Intervallhalbierung. Dieses Intervall hat die Länge b−a
2n .
Die a posteriori Abschätzung folgt aus dem Mittelwertsatz der Differenzialrechnung:
f (xn ) − f (x̄ ) |f (xn )|
f (xn ) − f (x̄ )
′
≤
= f (ξ) ⇒ |xn − x̄ | = .
xn − x̄
f ′ (ξ)
m
Abb. 7.6: Regula falsi
Abb. 7.5: Bisektion
7.C
⋄
Regula Falsi
Wir behalten die Voraussetzungen und Bezeichnungen von 7.2 bei.
Das Bisektionsverfahren benutzt als nächste Iterationsstelle die Mitte des Intervalls [an , bn ],
in dem die Nullstelle garantiert liegen muss. Meistens liegt die Nullstelle xn der Sekante zwischen
(an , f (an )) und (bn , f (bn )) näher an der gesuchten Nullstelle, vgl. Abb. 7.6. Die Gleichung dieser
Sekante ist
f (bn ) − f (an )
s(x ) = f (an ) +
·(x − an ) ,
bn − an
deren Nullstelle xn+1 wird berechnet:
f (bn ) − f (an )
·(xn+1 − an )
bn − an
bn f (an ) − an f (an ) − an f (bn ) + an f (an ) f (bn ) − f (an )
=
+
·xn+1
bn − an
bn − an
bn f (an ) − an f (bn ) f (bn ) − f (an )
=
+
·xn+1
bn − an
bn − an
Die Auflösung nach xn+1 wird im 1. Schritt des folgenden Verfahrens genutzt.
0 = f (an ) +
Verfahren 7.5 (Regula falsi) Das Verfahren Regula falsi ist gegeben durch
(a) Startwerte: a0 := a , b0 := b
(b) Iteration:
an f (bn ) − bn f (an )
f (bn ) − f (an )
• 1. Schritt:
xn+1 :=
• 2. Schritt:
f (an ) · f (xn+1 ) > 0
f (an ) · f (xn+1 ) < 0
→
→
an+1 := xn+1 , bn+1 := bn
an+1 := an , bn+1 := xn+1
(c) Abbruch: Mit der Fehlerschranke R, die oft als R = 10−6 gesetzt wird, wird das Verfahren
abgebrochen, falls |f (xn+1 )| < R oder |an+1 − bn+1 | < R · |an+1 | ist. Wir setzen im Falle
• |f (xn+1 )| < R
:
• |an+1 − bn+1 | < R :
x̄ :≈ xn+1
x̄ :≈
,
an+1 +bn+1
2
.
7 Bisektionsverfahren und Regula falsi
75
Für die Fehlerabschätzung erhalten wir denselben Satz wie bei der Bisektion.
Anschaulich wird Regula falsi schneller die Nullstelle finden, wenn dies auch in der Fehlerabschätzung noch nicht zum Tragen kommt, da dies mathematisch nicht begründet werden kann. Im
nächsten Kapitel werden wir Verfahren kennen lernen, die noch schneller konvergieren.
Sowohl Bisektionsverfahren als auch Regula falsi können auch auf nicht-stetige Funktionen angewandt werden, soweit die weiteren Voraussetzungen von 7.2 erfüllt sind. Enthält das Intervall
dann keine Nullstelle, so finden diese Verfahren ein Sprungstelle, an der die x-Achse übersprungen
wird.
76
II Numerische Verfahren der Analysis
§ 8 Das Newton-Verfahren
Bezeichnungen 8.1 Wir legen Bezeichnungen und Voraussetzungen für den gesamten Paragrafen
fest:
Gegeben sei eine stetig differenzierbare Funktion f : [a, b] → R (f ∈ C 1 ([a, b]) ) mit den Eigenschaften
• ∃m ∈ R>0 ∀x ∈ [a, b] : |f ′ (x )| ≥ m > 0
• f (a) · f (b) < 0
Aufgrund der zweiten Voraussetzung existiert immer eine Nullstelle x̄ ∈ [a, b], aufgrund der ersten
(wegen des Mittelwertsatzes der Differenzialrechnung) genau eine: ∃!x̄ ∈ [a, b] : f (x̄ ) = 0 .
8.A
Das Newton-Verfahren
Verfahren 8.2 (Tangentenverfahren von Newton2 )
Funktion f im Punkt (xn , f (xn )) und deren Nullstelle xn+1 :
Wir berechnen die Tangente an die
t(x ) = f (xn ) + (x − xn ) · f ′ (xn )
⇒ 0 = f (xn ) + (xn+1 − xn ) · f ′ (xn )
⇒
xn+1 = xn −
f (xn )
f ′ (xn )
(8.1)
Mit der Fehlerschranke R, oft R = 10−6 , wird das Verfahren abgebrochen, falls |f (xn+1 )| < R oder
|xn+1 − xn | < R ist. Wir setzen dann x̄ :≈ xn+1 .
Abb. 8.1: Tangentenverfahren nach Newton
Die Konvergenzeigenschaften formulieren wir in einem Satz:
Satz 8.3 Die Funktion f ∈ C 2 (I ) mit dem abgeschlossenen Intervall I erfülle3
(a) ∃m ∈ R>0 ∀x ∈ I : |f ′ (x )| ≥ m > 0
(b) ∃M ∈ R>0 ∀x ∈ I :
(c) ∃x̄ ∈ I : f (x̄ ) = 0
|f ′′ (x )|
.
≤M
,
,
Dann gelten mit einem ̺ ∈ R>0 , das ̺ <
2m
M
erfüllt,
(a) x̄ ist die einzige Nullstelle von f in I.
(b) Das Newton-Verfahren konvergiert für jeden Startwert x0 im Intervall [x̄ − ̺, x̄ + ̺] ∩ I :
∀x0 ∈ [x̄ − ̺, x̄ + ̺] ∩ I : limn→∞ xn = x̄
2
Sir Isaac Newton, engl. Physiker, Mathematiker, Astronom, Alchemist, Philosoph und Verwaltungsbeamter,
1642/43 (Woolsthorpe) - 1727 (Kensington)
3
An den Intervallgrenzen werden einseitige Ableitungen betrachtet.
8 Das Newton-Verfahren
(c) A priori Abschätzung: Mit q =
77
M
2m |x0
(d) A posteriori Abschätzung: |xn − x̄ | ≤
− x̄ | < 1 gilt |xn − x̄ | ≤
1
m |f (xn )|
≤
M
2m |xn
− xn−1
2m 2n
M q
|2
Anschaulich ist m betragsmäßig höchstens gleich der kleinsten Steigung der Funktion. Bei zu flachen
Funktionen kann die Nullstelle der Tangente sehr weit entfernt von der aktuellen Iterationsstelle
liegen, so dass der Abstand zur gesuchten Nullstelle sich deutlich vergrößert. M ist betragsmäßig
die größte zweite Ableitung. Ist diese groß, so ist in der Regel auch die Krümmung groß, so dass
eine Annäherung an eine Nullstelle durch das Newton-Verfahren langsamer verläuft.
Beweis:
(a) Gibt es zwei verschiedene Nullstellen x̄1 und x̄2 , so folgt nach dem Mittelwertsatz der Differenzialrechnung:
f (x̄1 ) − f (x̄2 )
∃ ξ ∈ (x̄1 , x̄2 ) : f ′ (ξ) =
=0
x1 − x2
Dies ist ein Widerspruch zur Voraussetzung |f ′ (ξ)| ≥ m > 0.
(b) folgt aus c) wegen q < 1.
(c) Diese Behauptung wird durch Induktion nach n bewiesen. Der Induktionsanfang für n = 0
folgt aus der Definition von q:
2m
2m 20
|x0 − x̄ | =
q=
q .
M
M
Der Induktionsschritt benötigt einige Vorbereitungen: Aus der Taylorentwicklung des Grades
1 um xn mit Restgliedabschätzung folgt zunächst für ein ξ ∈ [x̄ , xn ]
f ′′ (ξ)
(x̄ − xn )2
2
Diese Gleichung teilen wir durch f ′ (xn ) und erhalten
0 = f (x̄ ) = f (xn ) + f ′ (xn )(x̄ − xn ) +
.
f (xn )
f ′′ (ξ)
+
x̄
−
x
+
(x̄ − xn )2
n
f ′ (xn )
2f ′ (xn )
und hieraus durch Einsetzen des Newton-Verfahrens
f (xn )
f ′′ (ξ)
x̄ − xn+1 = x̄ − xn + ′
= − ′
(x̄ − xn )2 .
f (xn )
2f (xn )
Jetzt kann der Induktionsschluss von n auf n+1 nachgewiesen werden:
′′
f (ξ)
IV M 2m 2n 2
2m 2n+1
2
|x̄ − xn+1 | = ′
(x̄ − xn ) ≤
q
=
q
2f (xn )
2m M
M
0=
.
(d) Der Mittelwertsatz der Differenzialrechnung liefert für ein ξ1 ∈ (xn , x̄ ) oder ξ1 ∈ (x̄ , xn ) mit
0 = f (x̄ ) = f (xn ) + f ′ (ξ1 )(x̄ − xn ),
die Taylorentwicklung des Grades 1 um xn−1 mit Restgliedabschätzung ein ξ2 ∈ (xn , xn−1 )
oder ξ2 ∈ (xn−1 , xn ) mit
f (xn ) = f (xn−1 ) + f ′ (xn−1 )(xn − xn−1 ) +
|
{z
}
=0 (nach Newton-Verfahren)
f ′′ (ξ2 )
(xn − xn−1 )2 .
2
Die erste Gleichung dividieren wir durch f ′ (ξ1 ) und setzen die zweite ein:
′′
f (xn ) f (ξ2 )
1
M
2
|x̄ − xn | = ′
≤
|f (xn )| = (xn − xn−1 ) ≤
|xn − xn−1 |2 .
f (ξ1 )
m
2m
2m
⋄
Beispiel 8.4 Wir suchen die kleinste positive Nullstelle der Funktion f (x ) = sin(x ) − 0.8x :
Nach Bemerkung 7.1 gilt x̄ ≈ 1.1. Mit I0 = [0.9, π2 ] und den Ableitungen f ′ (x ) = cos(x ) − 0.8 und
f ′′ (x ) = − sin(x ) erhalten wir für x ∈ I0
|f ′ (x )| ≥ | cos(0.9) − 0.8| = 0.1784
und |f ′′ (x )| ≤ 1 .
78
II Numerische Verfahren der Analysis
2·0.1784
Ich benutze damit m = 0.1784 und M = 1. Da ̺ := 0.3 die Ungleichung ̺ < 2m
=
M =
1
0.3568 erfüllt, können wir I = [0.9, 1.3] setzen. Das Newton-Verfahren konvergiert also für jedes
x0 ∈ [0.9, 1.3].
Wie viele Iterationsschritte sind nötig, um ein auf 8 Stellen genaues Ergebnis zu garantieren?
M
M
0.3
Mit q = 2m
|x0 − x̄ | ≤ 2m
̺ ≤ 0.3568
≤ 0.841 erhalten wir aus der a priori Abschätzung
|x̄ − xn | ≤
2m 2n
n
q ≤ 0.3568 · 0.8412
M
.
Wir stellen 8 genauer Dezimalstellen, also |x̄ − xn | ≤ 0.5 · 10−8 , dadurch sicher, dass wir 0.3568 ·
n
0.8412 ≤ 0.5 · 10−8 fordern. Dies ist äquivalent zu
⇔
⇔
log10 (0.3568) + 2n · log10 (0.841) ≤ log10 (0.5) − 8
log10 (0.5) − 8 − log10 (0.3568)
2n ≥
log10 (0.841)
log10 (0.5) − 8 − log10 (0.3568)
n ≥ log2
≈ 6.706
log10 (0.841)
.
Folglich müssen wir n=7 wählen, nur dann haben wir nach der Berechnung sicher 7 genaue Stellen.
Während der Rechnung können wir natürlich auch die a posteriori Abschätzung heranziehen und
dadurch vielleicht früher aufhören zu rechnen.
In nebenstehendem Beispiel setzen wir das Abbruchkriterium auf
10−10 . Es steht also ein Programm
mit doppelt-genauer Arithmetik
zur Verfügung:
Nullstellenbestimmung nach Newton
für die Funktion f(x) = sin(x) -.8*x
Iterationsanfang
:
.900
Maximale Anzahl der Iterationsschritte:
20
Abbruchkriterium
: .1E-09
n
0
1
2
3
4
5
6
x(n)
.90000000
1.25499130
1.14578740
1.13135540
1.13119266
1.13119259
1.13119259
f(x(n))
|x(n)-x(n-l)|
.6333E-01
-.5345E-01
-.5595E-02
-.9467E-04
-.2899E-07
-.2442E-14
.0000E+00
.9000E+00
.3550E+00
.1892E+00
.1443E-01
.2527E-03
.7721E-07
.6661E-14
Nach 6 Schritten wurde eine Nullstelle
bei 1.1311926 gefunden.
Die a posteriori Abschätzungen nach 4 und 5 Iterationen
(a)
|x4 − x̄ | ≤
|f (x4 )|
0.2899·10−7
≈
≈ 1.6·10−7 ,
m
0.1784
(b)
|x4 − x̄ | ≤
M
1
(x4 − x3 )2 ≈
(0.2527·10−3 )2 ≈ 1.8·10−7 ,
2m
2·0.1784
(c)
|x5 − x̄ | ≤
|f (x5 )|
0.2442·10−14
≈
≈ 1.4·10−14 ,
m
0.1784
(d)
|x5 − x̄ | ≤
M
1
(x5 − x4 )2 ≈
(0.7721·10−7 )2 ≈ 1.5·10−14
2m
2·0.1784
zeigen, dass 4 Iterationen nicht ausreichen, wohl aber 5.
8 Das Newton-Verfahren
79
Das zweite Beispiel verdeutlicht
das mögliche Verhalten des Verfahrens, wenn die Startbedingungen nicht eingehalten werden: Das
Verfahren konvergiert nicht zur
nächstgelegenen Nullstelle sondern
zu einer zufällig gefunden anderen.
Nullstellenbestimmung nach Newton
für die Funktion f(x) = sin(x) -.1*x
Iterationsanfang
: 1.700
Maximale Anzahl der Iterationsschritte:
20
Abbruchkriterium
: .1E-09
n
x(n)
0
1
2
3
4
5
6
1.70000000
5.29049412
8.35149940
8.42706508
8.42321369
8.42320393
8.42320393
f(x(n))
.8217E+00
-.1367E+01
.4362E-01
-.2473E-02
-.6237E-0S
-.4912E-10
-.2229E-15
|x(n)-x(n-l)|
.1700E+01
.3590E+01
.3061E+01
.7557E-01
.3851E-02
.9761E-05
.6279E-10
Nach 6 Schritten wurde eine Nullstelle bei
8.4232039 gefunden.
8.B
Der Algorithmus von Steffensen (1933)
Das Newton-Verfahren benutzt die Ableitung der Funktion, die dort ebenfalls berechnet werden
muss. Steffensen ersetzt im Newton-Verfahren diese Ableitung durch einen Differenzenquotienten
f ′ (xn ) ∼
f (xn + hn ) − f (xn )
hn
mit 0 < |hn | ≪ 1
und wählt für hn den Funktionswert f (xn ), der ja in der Iteration gegen Null gehen soll.
Verfahren 8.5 (Steffensen (1933))
xn+1 = xn −
(f (xn ))2
f (xn + f (xn )) − f (xn )
Die Konvergenzeigenschaften formulieren wir wieder in einem Satz:
Satz 8.6 Für eine Funktion f ∈ C 2 (I ) mit einem abgeschlossenen Intervall I , das eine Nullstelle
x̄ mit f ′ (x̄ ) 6= 0 enthält, gilt mit
2
̺M
M := sup g ′′ (ξ) , ̺ <
und
q=
<1
(8.2)
M
2
ξ∈I
mit der Funktion


(f (x ))2
x−
g(x ) :=
f (x + f (x )) − f (x )

x̄
:
:
x 6= x̄


x = x̄ 
(a) Das Steffensen-Verfahren konvergiert für jeden Startwert x0 im Intervall
[x̄ − ̺, x̄ + ̺] ∩ I gegen x̄ : ∀x0 ∈ [x̄ − ̺, x̄ + ̺] ∩ I : limn→∞ xn = x̄
(b) A priori Abschätzung: |xn − x̄ | ≤
2
M
n
· q2
Beweis: Die erste Behauptung folgt aus der zweiten, folglich zeigen wir nur diese. Sie wird durch
eine Induktion nach n nachgewiesen.
Der Induktionsanfang für n = 0 folgt mit ̺ =
|x0 − x̄ | ≤ ̺ =
2
· q1 .
M
2q
, s. Gleichung 8.2, aus x0 ∈ [x̄ − ̺, x̄ + ̺]:
M
80
II Numerische Verfahren der Analysis
Für den Induktionsschritt betrachten wir die Funktion g(x ). Es gelten xn+1 = g(xn ) und x̄ =
g(x̄ ), sie hat also den Fixpunkt x̄ . Für den ersten Term des Nenners gilt nach dem Mittelwertsatz
der Differenzialrechnung für ein ξ ∈ (x , x + f (x )):
f (x + f (x )) = f (x ) + f ′ (ξ) · (x + f (x ) − x ) = f (x ) + f ′ (ξ) · f (x ) .
Wir berechnen die Ableitung von g an der Stelle x̄ und verwenden die obige Formel an der Stelle
x = x̄ + h im oberen Nenner:
(f (x̄ +h))2
f (x̄ +h+f (x̄ +h))−f (x̄ +h)
x̄ + h −
g(x̄ + h) − g(x̄ )
g (x̄ ) = lim
= lim
h→0
h→0
h
′
=
h−
lim
h
− x̄
(f (x̄ +h))2
f (x̄ +h)·f ′ (ξ)
( mit ξ ∈ (x̄ + h , x̄ + h + f (x̄ + h) ) )
h 1
f (x̄ + h) − 0
1
= 1 − lim ′
· lim
= 1− ′
· f ′ (x̄ ) = 0
h→0 f (ξ)
h→0
h
f (x̄ )
Aus dem Taylorpolynom 2. Grades um x̄ mit Restgliedabschätzung
g ′′ (ξ)
· (x − x̄ )2
g(x ) = g(x̄ ) + g ′ (x̄ ) · (x − x̄ ) +
2
für ein ξ ∈ (x , x̄ ) oder ξ ∈ (x̄ , x ) erhalten wir mit xn+1 = g(xn ) und g(x̄ ) = x̄
h→0
|g ′′ (ξ)|
· (xn − x̄ )2 .
2
Hieraus erhalten wir die Abschätzung
M
|xn+1 − x̄ | ≤
· (xn − x̄ )2 .
2
Für x0 ∈ [x̄ − ̺, x̄ + ̺] weisen wir jetzt den Induktionsschluss von n auf n+1 nach: Mit der Induktionsvoraussetzung aus obiger Formel erhalten wir
M
M
2 2n 2
2 2n+1
2
|xn+1 − x̄ | ≤
· (xn − x̄ ) ≤
q
=
q
.
⋄
2
2 M
M
|xn+1 − x̄ | =
8.C
Nullstellen von Polynomen
Wie untersuchen die Lage der Nullstellen eines Polynoms. Wie groß kann eine Nullstelle sein?
Satz 8.7 (Lage der Nullstellen) Für ein Polynom
p(x ) =
n
X
ai x i
mit
i=0
setzen wir
r0
r1
r2
r3
:
an 6= 0
positive Lösung der Gleichung
s ai :=
max n−i ,
i=0,...,n−1
an
ai :=
max .
i=0,...,n−1 an
ai := max .
i=1,...,n a0
und
n−1
X
|ai | > 0
n−1
X
|ai |
,
x n−i
i=0
|an | =
i=0
Für eine Nullstellen x̄ von p(x ) und diese Zahlen gelten:
(a) |x̄ | ≤ r0
(b) r1 ≤ r0 ≤ 2r1
(c)
1
1+r3
< |x̄ | < 1 + r2
8 Das Newton-Verfahren
81
Beweis: Die Ableitung der Funktion
f (x ) =
n−1
X
i=0
ist
|ai |
x n−i
n−1
X
(n − i )|ai |
.
x n−i+1
i=0
Für x > 0 ist sie immer negativ, damit ist f (x ) für x >
0 streng monoton fallend. Diese Eigenschaft nutzen wir
mehrfach aus.
Ferner existiert wegen lim f (x ) = ∞ und lim f (x ) =
f ′ (x ) = −
x →∞
x →0+
0 die Zahl r0 mit f (r0 ) = |an |. Da f (x ) streng monoton
ist für x > 0, kann f keine weitere Stelle mit dieser
Eigenschaft haben.
Abb. 8.2: Zur Lage der Nullstellen
Da f streng monoton fallend ist, gelten
x < r0
⇐⇒
f (x ) > |an |
und
x > r0
⇐⇒
f (x ) < |an | .
Das werden wir im weiteren Verlauf des Beweises oft ausnutzen.
n−1
n−1
X ai
X |ai |
(a)
p(x̄ ) = 0 ⇐⇒ an = −
impliziert
|a
|
≤
= f (|x̄ |) .
n
n−i
x̄
|x̄ |n−i
i=0
i=0
Aufgrund obiger Bemerkung ist die |x̄ | ≤ r0 .
(b) Bezeichnet j den Index mit dem maximalem Wert für
f (r1 ) =
n−1
X
i=0
r ai an , so folgt aus
n−i
n−1
X
|aj |
|ai |
|ai |
=
r n−i ≥ r n−j = |an |
n−i
r1
i=0
n−j aj n−j aj an an mit der Monotonie von f (x ) die Ungleichung r1 ≤ r0 . Die Gleichung
f (2r1 ) =
n−1
X
n−1
n−1
X
X
|ai |
|ai |
=
=
n−i
n−i
n−i
(2r1 )
2 r1
i=0
i=0
n−1
X
n−1
n−1
X |an |
X 1
|ai |
=
=
|a
|
< |an |
r
n
n−i
2n−i
2n−i
a
i=0
i=0
n−i
2n−i
ani i=0
≤
i=0
|ai |
r n−i
a 2n−i n−j anj liefert aufgrund der Monotonie r0 ≤ 2r1 . Damit ist r1 ≤ r0 ≤ 2r1 gezeigt.
(c) Wir beginnen mit der rechten Ungleichung. Ist |x̄ | ≤ 1, so ist alles gezeigt. Nehmen wir also
|x̄ | > 1 an:
P
Wir teilen 0 = p(x̄ ) = ni=0 ai x̄ i durch an und lösen nach |x̄ |n auf. Aus
x̄ n = −
n−1
X
ai i
x̄
an
n−1
X
X
|ai | i
|x̄ |n − 1
r2 |x̄ |n
|x̄ | ≤ r2
|x̄ |i = r2
<
.
|an |
|x̄ | − 1
|x̄ | − 1
i=0
erhalten wird die Abschätzung
n
|x̄ | ≤
i=0
n−1
i=0
Diese dividieren wird durch |x̄ |n , lösen nach x̄ auf und erhalten
|x̄ | < 1 + r2 .
Für die linke Ungleichung definieren wir ein Polynom
X
n
1
n
q(y) := y · p
=
ai y n−i .
y
i=0
82
II Numerische Verfahren der Analysis
q hat die gleichen Koeffizienten wie p, jedoch mit Hauptkoeffizient a0 . Folglich gilt für die
Nullstelle 1/x̄ nach der verifizierten Abschätzung
1
< 1 + r3 .
|x̄ |
Hieraus folgt
1
|x̄ | >
.
⋄
1 + r3
Ohne Beweis schließen wir einen Satz über einen besonders gutmütigen Fall an
Satz 8.8 (Nullstellen reeller Polynome ohne komplexe Nullstellen)
Ist p ein Polynom ohne komplexe Nullstellen, so konvergiert das Newton-Verfahren für jeden Startwert, der größer als die größte (kleiner als die kleinste) Nullstelle ist, gegen diese Nullstelle.
Der Beweis nutzt aus, dass in diesem Falle alle Extremstellen zwischen den Nullstellen liegen und
damit außerhalb des Intervalls von der kleinsten zur größten Nullstelle die Ableitung von null
verschieden ist.
Ist die Voraussetzung des Satzes nicht erfüllt, so kann es eines Extremstelle größer als die größte
Nullstelle (oder kleiner als die kleinste) geben. Mit einem Startwert größer als die Extremstelle
konvergiert das Newton-Verfahren nur zufällig gegen die gesuchte Nullstelle.
Dieser Satz hat jedoch in der Technik eine Bedeutung bei symmetrischen Matrizen:
Bemerkung 8.9 Da alle Eigenwerte symmetrischer Matrizen reell sind, sind alle Nullstellen der
charakteristischen Polynome symmetrischer Matrizen reell und damit die Voraussetzungen des Satzes erfüllt. Die charakteristischen Polynome symmetrischer Matrizen des Grades n haben damit
auch n Nullstellen, wenn sie mit ihrer Vielfachheit gezählt werden.
Symmetrisch sind zum Beispiel dreidimensionale Spannungs- und Dehnungsmatrizen, aber auch
höherdimensionale Matrizen, die in Finit-Element-Berechnungen auftreten.
9 Sukzessive Approximation
83
§ 9 Sukzessive Approximation
9.A
Bisherige Verfahren als Iterationsverfahren
Tab. 9.1: Nullstellenverfahren als Iterationen
Verfahren
Funktion
Iteration
Newton
ΦN (x ) := x −
f (x )
f ′ (x )
xn+1 = xn −
Steffensen
ΦS (x ) := x −
(f (x ))2
f (x + f (x )) − f (x )
xn+1
Regula falsi
ΦR (x ) wird entsprechend definiert.
xn+1 = ΦR (xn )
Bisektion
ΦB (x ) wird entsprechend definiert.
xn+1 = ΦB (xn )
f (xn )
= ΦN (xn )
f ′ (xn )
(f (xn ))2
= xn −
= ΦS (xn )
f (xn + f (xn )) − f (xn )
Alle Iterationsfunktionen Φ in Tab. 9.1 sind stetig, daher liefert ein Grenzübergang
x̄ = lim xn+1 = lim Φ(xn ) = Φ( lim xn ) = Φ(x̄ ) .
n→∞
n→∞
n→∞
Der Grenzwert der Iteration x̄ ist also ein Fixpunkt des Verfahrens, der Funktion Φ. Ferner erkennt
man an obigen Definitionen, dass x genau dann Nullstelle von f ist, wenn es Fixpunkt von Φ ist,
z.B. beim Newton-Verfahren:
f (x )
f (x )
⇐⇒ 0 = ′
⇐⇒ 0 = f (x ) .
x = ΦN (x ) ⇐⇒ x = x − ′
f (x )
f (x )
Die Iterationsvorschriften in Tab. 9.1 wurden aufgrund geometrischer Ideen oder deren Verfeinerungen gefunden. Die letzte Aussage kann jedoch auch von anderen Iterationsvorschriften erfüllt
werden: Die Gleichung eines zu null gesetzten Terms wird nach einem beliebigen x aufgelöst. Ob
diese Wahl zu einer erfolgreichen Iterationsvorschrift führt, muss untersucht werden. Die Vorgehensweise ist Thema dieses Paragrafen.
Beispiel 9.1 (Spezielle Iterationsverfahren zur Nullstellenbestimmung)
√
√
1
x 2 − 2x − 8 = 0 ⇐⇒ x = 2x + 8 ∨ x = − 2x + 8 ⇐⇒ x = (x 2 − 8)
2
8
8
⇐⇒ x =
⇐⇒ x = 2 +
x −2
x
Abb. 9.1: Sukzessive Approximation, |φ′ | < 1
Abb. 9.2: Sukzessive Approximation, |φ′ | > 1
84
II Numerische Verfahren der Analysis
Frage 9.2
Welches Verfahren konvergiert für welchen Startwert gegen welchen Fixpunkt?
• Abb. 9.1 und 9.2 zeigen, dass die Beträge der Ableitungen notwendig kleiner 1 sein müssen.
• Ferner muss es um einen Fixpunkt x̄ ein Intervall I geben, dass in sich abgebildet wird:
Φ(I ) ⊂ I .
Dies ist der Fall, falls
∃ q < 1 ∀x , y ∈ I : |Φ(x ) − Φ(y)| ≤ q|x − y|
gilt. Die im letzten Punkt beschriebene Eigenschaft heißt kontrahierend. Sie wird im Weiteren
eingehender untersucht.
9.B
Kontrahierende Funktionen und Fixpunktsatz
Definition 9.3 (Kontrahierende Funktion) Eine Funktion Φ : I → I auf einem abgeschlossenen Intervall I heißt kontrahierend, falls
gilt.
∃(q < 1)∀(x , y ∈ I ) : |Φ(x ) − Φ(y)| ≤ q|x − y|
Satz 9.4 (Eigenschaften kontrahierender Funktionen)
Mit der Bezeichnung xn+1 := Φ(xn ) gelten:
Φr (xs )
r
=
r
|Φ (x ) − Φ (y)|
|xr +l − xr +m |
≤
(9.1)
|xn+i − xn |
=
≤
=
|xn+i − xn |
≤
Φr −1 (xs+1 ) = ... = xr +s ,
q Φr −1 (x ) − Φr −1 (y) ≤ q r |x − y| ,
(9.2)
|Φr (xl ) − Φr (xm )| ≤ q r |xl − xm | ,
i
i
X
(9.3) X
|xn+j − xn−1+j | ≤
q j |xn − xn−1 |
j =1
q i+1
(9.1)
(9.2)
(9.3)
j =1
−q
q
|xn − xn−1 | ≤
|xn − xn−1 | ,
q −1
1−q
(9.3)
q
qn
|xn − xn−1 | ≤
|x1 − x0 | .
1−q
1−q
(9.4)
(9.5)
Welche differenzierbare Funktionen Φ : I → I sind kontrahierend? Zur Beantwortung dieser Frage
ziehen wir den Mittelwertsatz der Differenzialrechnung heran und erhalten mit q := max |Φ′ (x )|
x ∈I
Φ(x ) − Φ(y) ′
= |Φ (ξ)| ≤ q die Abschätzung
aus der Gleichung x −y
∀(x , y ∈ I ) : |Φ(x ) − Φ(y)| ≤ q|x − y| .
(9.6)
Hieraus folgt
Satz 9.5 Ist Φ : I → I differenzierbar und maxx ∈ I |Φ′ (x )| < 1, so ist Φ kontrahierend mit
q := maxx ∈ I |Φ′ (x )|.
Wir kommen zum zentralen Satz dieses Kapitels:
Satz 9.6 (Fixpunktsatz) (Stefan Banach)
Ist Φ : I → I eine auf dem abgeschlossenes Intervall I stetige und kontrahierende Abbildung, so
gelten:
(a) Φ hat genau einen Fixpunkt auf I :
∃! x̄ ∈ I : Φ(x̄ ) = x̄
(b) Φ konvergiert für jeden Startwert aus I gegen x̄ : Mit xn+1 = Φ(xn ) gilt
∀ x0 ∈ I lim xn =x̄
n→∞
9 Sukzessive Approximation
85
qn
|x1 − x0 |
1−q
(d) Zweite à priori Abschätzung:
∀ n ∈ N : |x̄ − xn | ≤ q n |x̄ − x0 |
q
(e) À posteriori Abschätzung:
∀ n ∈ N : |x̄ − xn | ≤
|xn − xn−1 |
1−q
(c) Erste à priori Abschätzung:
∀ n ∈ N : |x̄ − xn | ≤
Beweis: Zunächst zeigen wir, dass die Folge hxn i für jeden Startwert x0 ∈ I konvergiert: Gl. 9.5
besagt
qn
|x1 − x0 | .
1−q
Die linke Seite kann damit unabhängig von i begrenzt werden. Damit ist diese Folge eine CauchyFolge, die nach [25, Satz 19.3, Seite 108] einen Grenzwert hat:
|xn+i − xn | ≤
x̄ := lim xn .
n→∞
Jetzt werden die einzelnen Behauptungen nachgewiesen:
(a) Existenz eines Fixpunkts: Mit Hilfe der Stetigkeit von Φ (Vertauschbarkeit von Funktion und
Grenzwert) zeigen wir, dass jeder Grenzwerte einer solchen Folge ein Fixpunkt von Φ ist:
Φ(x̄ ) = Φ( lim xn ) = lim Φ(xn ) = lim xn+1 = x̄
n→∞
n→∞
n→∞
(9.7)
Eindeutigkeit des Fixpunkts: Seien x̄1 und x̄2 zwei verschiedene Fixpunkt von Φ, so gilt wegen
Φ(x̄1 ) = x̄1 und Φ(x̄2 ) = x̄2
|x̄1 − x̄2 | = |Φ(x̄1 ) − Φ(x̄2 )| ≤ q|x̄1 − x̄2 | < |x̄1 − x̄2 |
Dies ist ein Widerspruch, also können x̄1 und x̄2 nicht verschieden sein.
(b) Die Existenz des Grenzwerts ist gezeigt. Dass dieser gleich dem Fixpunkt ist, folgt aus Gl. 9.7.
(c) Mit Gl. 9.5 folgt
qn
|x1 − x0 | .
i→∞
i→∞
1−q
(d) Mit |x̄ − xn | = |Φ(x̄ ) − Φ(xn−1 )| ≤ q|x̄ − xn−1 | folgt die Aussage durch eine Induktion nach
n.
|x̄ − xn | = | lim xn+i − xn | = lim |xn+i − xn | ≤
(e) Mit Gl. 9.4 folgt:
|x̄ − xn | = | lim xn+i − xn | = lim |xn+i − xn | ≤
i→∞
i→∞
q
|xn − xn−1 | .
1−q
Bemerkung 9.7 Die beiden Voraussetzungen des Satzes
•
•
Φ(I ) ⊆ I
und
∃q∀x ∈ I Φ′ (x ) ≤ q < 1
sind notwendig, wie die folgenden Beispiele zeigen
(a) Die Funktion f (x ) = 1.1 sin(x ) bildet das Intervall [− π/2, π/2] in sich ab. Ihre Ableitung ist
f ′ (x ) = 1.1 cos(x ), sie ist an den Randpunkten null, aber f ′ (0) = 1.1 > 1! Der Versuch, den
Fixpunkt x = 0 mit einem nahe gelegenen Startpunkt zu finden, scheitert:
>> [xN,xN1,anz]=Sukzes(@(x)1.1*sin(x),.1,5E-7,1000000)
??? Error using ==> Sukzes at 43
Intervall wird größer: 0.13229, 0.120556, 0.109817
(b) Die Funktion f (x ) = x bildet das Intervall [0, 1] in sich ab. Ihre Ableitung ist f ′ (x ) = 1.
Jeder Punkt des Intervalls ist ein Fixpunkt.
(c) Die Ableitung der Funktion f (x ) = ln(x ) ist für x > 1 kleiner 1, sie bildet aber das Intervall
I = [2, 3] nicht in sich ab: Da ln streng monoton steigt, gilt ln([2, 3]) = [ln(2), ln(3)] ≈
[0.6931, 1.0986]. Ein Versuch mit der Funktion Sukzes führt zu einem Fehler:
>> [xN,xN1,anz]=Sukzes(@(x) log(x),2.5,5E-7,1000000)
??? Error using ==> Sukzes at 43
Intervall wird größer: -2.43701, -0.0874216, 0.916291
86
II Numerische Verfahren der Analysis
Zusatz 9.8 Ist die kontrahierende Iterationsfunktion Φ mit dem Fixpunkt x̄ stetig differenzierbar
ohne kritische Stelle auf dem Intervall I , so ist die Ableitung auf I positiv oder negativ. In diesen
Fällen gilt für die Iterationsfolge xn = Φ(xn−1 ):
• ∀x ∈ I : Φ′ (x ) > 0:
Für einen Startwert x0
>
<
x̄ ist die Iterationsfolge streng monoton
• ∀x ∈ I : Φ′ (x ) < 0:
Die Iterationsfolge ist alternierend und es gelten
∀n ∈ N : xn+1 ∈ [xn , xn−1 ] ∧ x̄ ∈ [xn , xn−1 ] ,
fallend
steigend
.
(9.8)
falls xn < xn−1 ist. Andernfalls sind die Intervallgrenzen vertauscht.
Beweis: Der Mittelwertsatz der Differentialrechnung liefert:
xn+1 − x̄ = Φ(xn ) − Φ(x̄ ) = Φ′ (ξ)(xn − x̄ )
(9.9)
Im ersten Fall folgt wegen 0 < Φ(ξ) < 1 hieraus, dass xn+1 auf derselben Seite von x̄ liegt wie xn
aber näher an x̄ . Damit ist die Behauptung bewiesen.
Im zweiten Fall folgt aus Gl. 9.9, dass die Folgenglieder abwechseln größer und kleiner als x̄ sind.
Damit gilt die zweite Behauptung von Gl. 9.8.
Für xn > xn−1 folgt aus
xn+1 − xn = Φ(xn ) − Φ(xn−1 ) = Φ(ξ)(xn − xn−1 ) = |Φ(ξ)|(xn−1 − xn )
für ein ξ ∈ [xn−1 , xn ]. Damit liegen xn−1 und xn+1 auf derselben Seite von xn aber xn+1 liegt näher
an xn als xn−1 . Dies beweist die erste Aussage der Gl. 9.8 im Fall xn > xn−1 , der Fall xn < xn−1
folgt analog.
⋄
Beispiel 9.9 Wir greifen Beispiel 9.1 auf. Die Funktion
f (x ) = x 2 − 2x − 8
hat die Nullstellen x1 = −2 und x2 = 4. Diese versuchen wir jetzt durch sukzessive Approximation
mit den Iterationsvorschriften aus 9.1 zu bestimmen:
√
(a) Φ1 (x ) = 2x + 8
mit dem Definitionsbereich
DΦ1 = [−4 ; ∞) :
Wir bestimmen den Bereich,
auf
dem Φ1 kontrahierend ist:
′
√
1
Φ1 (x ) = √
< 1 ⇐⇒
2x + 8 > 1 ⇐⇒ 2x + 8 > 1
•
2x + 8 ⇐⇒ x > −3.5
• Wir wählen zum Beispiel I = [−3, 100] (riesig groß!) und berechnen, wobei wir ausnutzen,
dass Φ1 monoton wachsend ist, denn Φ′ (x ) ist auf dem Definitionsbereich positiv:
h√ √ i
Φ1 (I ) = Φ1 ([−3 ; 100]) = [Φ1 (−3) ; Φ1 (100)] =
2 ; 208 ⊆ I
Damit ist Φ1 kontrahierend auf I . Das Iterationsverfahren konvergiert für jeden Startwert aus
diesem Intervall gegen 4.
Setzt man das Wissen über die ungefähre Lage der Nullstelle voraus, startet man natürlich
besser mit einem kleineren Intervall, z.B. I = [3 ; 5].
√
(b) Φ2 (x ) = − 2x + 8
mit dem Definitionsbereich
DΦ2 = [−4 ; ∞) :
Analog zum ersten Beispiel ergibt sich
′
−1
Φ2 (x ) < 1 ⇐⇒ x > −3.5 .
Φ′2 (x ) = √
und damit
2x + 8
Wegen Φ2 (x ) ≤ 0 für alle x ∈ DΦ2 wählen wir I = [−3, 0] und berechnen, wobei wir ausnutzen,
dass Φ1 monoton fallend ist,
h √
√ i
Φ2 (I ) = Φ2 ([−3 ; 0]) = [Φ2 (0) ; Φ2 (−3)] = −2 2 ; − 2 ⊆ I .
Damit ist Φ2 kontrahierend auf I . Das Iterationsverfahren konvergiert für jeden Startwert aus
diesem Intervall gegen −2.
9 Sukzessive Approximation
(c) Φ3 (x ) = 12 x 2 − 8
mit dem Definitionsbereich
Wegen
′
Φ3 (x ) = |x | < 1 ⇐⇒ − 1 < x < 1
87
D Φ3 = R :
ist dieses Verfahren auf keinem Intervall, das eine der beiden Nullstellen enthält, konvergent.
8
(d) Φ4 (x ) = x −2
mit
DΦ4 = R\{2}
und
WΦ4 = R\{0} :
Wir bestimmen den Bereich, auf dem Φ4 kontrahierend ist:
−8
Φ′4 (x ) =
liefert
(x − 2)2
√
′
Φ4 (x ) < 1 ⇐⇒ 8 < (x − 2)2 ⇐⇒ 2 2 < |x − 2|
√
√
⇐⇒ 2 2 < x − 2 ∨ 2 2 < 2 − x
√
√
⇐⇒ x > 2 + 2 2 ≈ 4.8 ∨ x < 2 − 2 2 ≈ −0.8
Nur der zweite Fall verspricht Erfolg. Da Φ4 monoton fallend ist, erhalten wir für I = [−6 ; −1]
8
Φ4 (I ) = Φ4 ([−6 ; −1]) = [Φ4 (−1) ; Φ4 (−6)] = − ; −1 ⊆ I .
3
Damit ist Φ4 kontrahierend auf I . Das Iterationsverfahren konvergiert für jeden Startwert aus
diesem Intervall gegen −2.
(e) Φ5 (x ) = 2 + x8
mit
DΦ5 = R\{0}
und
WΦ5 = R\{2}
Wir bestimmen den Bereich, auf dem Φ4 kontrahierend ist:
−8
Φ′5 (x ) = 2
liefert
x
√
′
Φ5 (x ) < 1 ⇐⇒ 8 < x 2 ⇐⇒ 2 2 < |x |
√
√
⇐⇒ x > 2 2 ≈ 2.8 ∨ x < −2 2 ≈ −2.8
Nur der erste Fall verspricht Erfolg. Da Φ5 monoton fallend ist, erhalten wir für I = [3 ; 8]
14
Φ5 (I ) = Φ5 ([3 ; 8]) = [Φ5 (8) ; Φ5 (3)] = 3 ;
⊆I .
3
Damit ist Φ5 kontrahierend auf I . Das Iterationsverfahren konvergiert für jeden Startwert aus
diesem Intervall gegen 4.
9.C
Das Newton-Verfahren als sukzessive Approximation
Wir wenden den Banachschen Fixpunktsatz auf das Newton-Verfahren an und berechnen zunächst
f (x ) ′
f ′ (x )2 − f (x )f ′′ (x )
f (x )f ′′ (x )
′
ΦN (x ) = x − ′
=1−
=
.
f (x )
f ′ (x )2
f ′ (x )2
Satz 9.10 (Das Newton-Verfahren als Iterationsverfahren)
Gilt auf dem Intervall I = [x̄ − r ; x̄ + r ] für ein q ∈ R
f (x )f ′′ (x ) f ′ (x )2 ≤ q < 1 ,
(9.10)
so konvergiert das Newton-Verfahren für jeden Startwert aus den Intervall I = [x̄ − r ; x̄ + r ] gegen
den einzigen Fixpunkt x̄ in diesem Intervall.
Beweis: Wir weisen die Voraussetzungen des Banachschen Fixpunktsatzes nach:
• Nach Satz 9.5 gilt |Φ(x ) − Φ(y)| ≤ q · |x − y|.
• Für y ∈ [x̄ − r ; x̄ + r ] gilt
|Φ(y) − x̄ | = |Φ(y) − Φ(x̄ )| ≤ q|y − x̄ | ≤ q r < r .
88
II Numerische Verfahren der Analysis
Nach dem letzten Punkt bildet Φ das Intervall I in sich ab: Φ(I ) ⊆ I . Insgesamt ist die Abbildung
kontrahierend.
⋄
′′ ) Nachgewiesen werden muss die Eigenschaft f (xf ′)f(x )(x
2 < 1 für alle Punkte des Intervalls I . In
einer früheren Ausgabe von [34] war dies lediglich für den Startwert der Iteration gefordert. Dies
reicht nicht aus, wie das folgende Beispiel mit der Funktion f (x ) = log10 (x ) − cos(2x ) mit dem
Startwert x0 = 12.9 zeigt:
1
+ 2 sin(2x )
x ln(10)
1
f ′′ (x ) = − 2
+ 4 cos(2x )
x ln(10)
f (12.9)f ′′ (12.9) ≈ 0.63 < 1 konvergiert
Trotz f ′ (12.9)2
das Verfahren nicht:
f ′ (x ) =
Abb. 9.3: Beispiel f (x ) = log10 (x ) − cos(2x )
12.9 12.64430941 12.3136661112.54453072 14.43042011 16.28046976 15.84833421
15.43712714 15.76785174 14.99892732 15.52462139 15.8983136 15.54404881
15.94146081 15.60771226 16.1836212 15.80392991 15.27304755 15.63235988
16.38354447 15.87985259 15.51010235 15.87068765 15.49114952 15.83909682
15.41063058 15.73974384 14.45268202 16.16357974 15.7929377215.21095061
15.5974028 16.12661066 15.7708865 15.03223318 15.53111271 15.91184742
15.56603244 16.00230442 15.67487272 17.56273395 19.5488805 18.98690459
18.42808708 18.8364933 28.269691 168.9379767 169.9886825 168.8406506
169.976704 168.8059038 169.9827395 168.8237096 169.9789179 168.8125077
169.9811393 168.8190492 169.9797676 168.8150197 169.9805876 168.8174324
169.9800871 168.815961 169.980389 168.8168489169.9802055 168.8163095
169.9803165 168.8166358169.9802492168.8164379 169.9802899168.8165578
169.9802652 168.8164852 169.9802802 168.8165292 169.9802711 168.8165025
INTERRUPT
In der neuen Ausgabe ist diese Voraussetzung geändert. Jede Iterationsstelle muss Gleichung
9.10 erfüllen. Dies erfordert zusätzliche Rechenzeit während der Berechnung! Die vorherige Einschränkung des Startintervalls und Überprüfung von 9.10, gegebenenfalls auch grafisch, ziehe ich
vor.
10 Numerische Integration
89
§ 10 Numerische Integration
Gesucht ist eine Näherung für den Wert des Integrals einer Funktion f (x ) auf dem Intervall [a, b].
Hierbei ist, wie oft in den Anwendungen, die Funktion nicht analytisch gegeben, sondern es sind
lediglich die Funktionswerte an einigen Stellen innerhalb des Intervalls bekannt.
Diese Stellen heißen Stützstellen. Sie zerlegen das Intervall in Teilintervalle (Partition des Intervalls). Häufig werden die Stützstellen in gleichem Abstand genommen, z.B. als Messstellen einer
Versuchsreihe. In diesem Fall spricht man von einer äquidistanten Partition des Intervalls.
Bezeichnungen 10.1 Wir legen allgemeine Bezeichnungen fest, die im gesamten Paragrafen beibehalten werden, vgl. Abb. 10.1:
Gegeben: Eine Partition a = x0 < x1 < . . . < xn = b des Intervalls [a, b] und die
Funktionswerte an den Stützstellen f (x0 ), f (x1 ), . . . , f (xn ).
Rb
gesucht: Eine gute Näherung für das Integral I = a f (x ) dx und eine Aussage
über die Qualität der Näherung.
Intervalllänge: H := b − a
äquidistante Partition: Die Schrittweite ist konstant.
xn − xo
H
=
n
n
xn − x0
H
Zerlegung: xi := x0 + i ·
= x0 + i ·
= x0 + i · h
n
n
Schrittweite: h := x1 − x0 =
10.A
(i = 0, ..., n)
Trapezregel
Gemäß Abb. 10.2 teilen wir das Intervall [a, b] zunächst nicht auf (n = 1, h = H ) und berechnen
Rb
eine erste Näherung für I = a f (x )dx durch die Fläche des Trapezes, das mit Hilfe der beiden
Punkte (x0 , f (x0 )) und (x1 , f (x1 )) gebildet wird:
Verfahren 10.2 (einfache Trapezregel)
h
(10.1)
I ≃ T := (f (x0 ) + f (x1 ))
2
Wir schätzen den Fehler mit Hilfe der Tangenten, jeweils bis zur halben Schrittweite, ab und berechnen die Fläche nach Abb. 10.3 als T ∗ -Regel:
L =
R =
h
(f (x0 ) + f (x0 ) +
4
h
(f (x1 ) + f (x1 ) −
4
Abb. 10.1: Äquidistante Partition
h ′
f (x0 )) =
2
h ′
f (x1 )) =
2
h
f (x0 ) +
2
h
f (x1 ) −
2
h2 ′
f (x0 )
8
h2 ′
f (x1 )
8
Abb. 10.2: Trapezregel
Abb. 10.3: T ∗ -Regel
90
II Numerische Verfahren der Analysis
T∗ = L + R =
= T+
Behauptung:
T ≤ I ≤ T∗
h
h2
(f (x0 ) + f (x1 )) + (f ′ (x0 ) − f ′ (x1 ))
2
8
h2 ′
(f (x0 ) − f ′ (x1 ))
8
(10.2)
Hat f ∈ C 2 ([x0 , x1 ]) keinen Wendepunkt auf dem Intervall [x0 , x1 ], so gelten:
oder
T ≥ I ≥ T ∗,
und
h 3 ′′
|f ′ (x0 ) − f ′ (x1 )| =
|f (ξ)|
|I − T | ≤ |T ∗ − T | =
8
8
h2
für ein
ξ ∈ [x0 , x1 ]
(10.3)
Die erste Gleichheit gilt wegen Gl. 10.2, die letzte folgt mit dem Mittelwertsatz der Differenzialrechnung.4
Verfahren 10.3 (Trapezregel bei äquidistanter Partition) Mit den Bezeichnungen H = b −
H
a und h = b−a
n = n wenden wir die einfache Trapezregel (Verfahren 10.2) auf jedes Teilintervall
an:
!
n−1
f (x0 ) + f (xn ) X
h
T (h) = (f (x0 ) + 2f (x1 ) + ... + 2f (xn−1 ) + f (xn )) = h
+
f (xi ) (10.4)
2
2
i=1
C 2 ([a, b])
Fehlerabschätzung:
Für f ∈
wenden wir in jedem Teilintervall Gl. 10.3 an und
erhalten für geeignete ξi ∈ [xi−1 , xi ]
n
h 3 X ′′
h3 · n
h 2 (b − a)
|I − T (h)| ≤
|f (ξi )| ≤
max |f ′′ (ξ)| =
max |f ′′ (ξ)|
(10.5)
8
8 ξ∈[a,b]
8
ξ∈[a,b]
i=1
Diese Herleitung setzt voraus, dass die Funktion in keinem Teilintervall einen Wendepunkt hat.
Dies wird bei fortschreitender Verringerung der Schrittweite näherungsweise erreicht, so dass diese
Formel in jedem Fall eine gute Näherung an den Fehler darstellt.
Beispiel 10.4 Wir berechnen
Z
1.4
e
−x 2
dx . Das unbestimmte Integral
1
Z
2
e −x dx besitzt keine
elementare Stammfunktion, die Berechnung muss daher numerisch erfolgen:
T (0.2) = 0.1 · e −1 + 2e −1.44 + e −1.96 ≈ .098
T (0.1) = 0.05 · e −1 + 2e −1.21 + 2e −1.44 + 2e −1.69 + e −1.96 ≈ .0974
Verfahren 10.5 (Trapezregel bei fortgesetzter Intervallhalbierung)
Zur Verbesserung
der Näherung werden die Teilintervalle und damit die Schrittweite fortlaufend halbiert. Es gelten
h1 = H , h2 = H/2 und im m-ten Schritt mit n = 2m−1 und hm = H/2m−1 nach Gl. 10.4


2m−1
X−1 H
H  f (x0 ) + f (xn )
i ·H 
+
Tm = T
= m−1
f x0 + m−1
(10.6)
2m−1
2
2
2
i=1
In dieser Gleichung ersetzen wir m durch m + 1 und isolieren in dem neuen Ausdruck Tm . Damit
kann bei jeder Intervallhalbierung das bisher erreichte Ergebnis weiter benutzt werden und so die
Berechnung des neuen Ergebnisses erheblich beschleunigt werden!
m −1
!
2X
H
H
f (x0 ) + f (xn )
H
Tm+1 = T
= m
+
f x0 + i · m
2m
2
2
2
i=1


2m−1
X−1 1
H  f (x0 ) + f (xn )
H 
=
·
+
f x0 + (2i ) m
2 2m−1
2
2
i=1
|
{z
}
Tm
4
174]
Mit einer aufwändigeren Fehlerabschätzung erhält man sogar |I − T | ≤
h 3 ′′
|f (ξ)|; ξ ∈ [x0 , x1 ] , s. z.B. [48, S.
12
10 Numerische Integration
91
2m−1 H X
H
+ m
f x0 + (2i − 1) m
2
2
i=1
Dies fassen wir zusammen
H
H
(f (x0 ) + f (xn )) =
(f (x0 ) + f (x0 + H ))
2
2
2m−1 Tm
H X
H
+ m ·
f x0 + (2i − 1) m
2
2
2
T1 = T (H ) =
Tm+1 =
;
(10.7)
(10.8)
i=1
10.B
Simpson-Regel
Bemerkung 10.6 (Exakte Polynom-Integration)
(a) T berechnet Polynome 1. Grades genau.
(b) Versuch: Eine Linearkombination pT1 +qT2 soll Polynome des Grades kleiner oder gleich zwei
genau berechnen! Wie sind p und q zu wählen?
Zur Beantwortung setzen wir für zwei Integrale diese Linearkombination gleich dem exakten
Integralwert und bestimmen aus diesen zwei Gleichungen die Parameter p und q:
1 =
Z1
1 dx = p · T1 + q · T2 = p · 1 + q · 1
1
3
Z1
x 2 dx = p · T1 + q · T2 = p ·
0
=
0
Das Gauß-Schema
1 1 1
1
2
3
8
1
3
liefert die Lösung q =
→
4
3
1 1
0 − 18
1
− 16
1
3
+q ·
2
8
und p = − 13 .
Dieses Ergebnis formulieren wir zu einem neuen Verfahren. Mit der Bezeichnung h =
folgt aus Gl. 10.7 und 10.8:
H
2
= x1 −x0
Verfahren 10.7 (Simpson-Regel)
S
:=
=
=
4 · T21 + H2 f x0 + H2 − T1
T1 + 2Hf x0 + H2
4 · T2 − T1
=
=
3
3
3
H
H
(f
(x
)
+
f
(x
+
H
))
+
2Hf
x
+
H
0
0
0
2
2
=
(f (x0 ) + 4f (x1 ) + f (x2 ))
3
6
h
(f (x0 ) + 4f (x1 ) + f (x2 ))
3
T1 benutzt x0 = a und x1 = b, T2 benutzt x0 = a, x1 = a+b
2 und x2 = b. Die Simpson-Regel ist
auch als Keplersche Fassformel bekannt. Nachgewiesen werden muss noch, dass sie alle Polynome
des Grades kleiner gleich zwei exakt integriert. Es gilt sogar der
Satz 10.8 Die Simpson-Regel integriert Polynome dritten Grades exakt.
92
II Numerische Verfahren der Analysis
Beweis: Wir integrieren das um die Mitte des Integrationsintervalls x1 =
Polynom dritten Grades
3
X
f (x ) =
ai (x − x1 )i
x0 +x2
2
entwickelte
.
i=0
Bei der Berechnung des Integrals benutzen wir die Bezeichnung h = x1 − x0 = x2 − x1 und beachten,
dass sich die Terme mit geradem Exponenten aufheben:
x2
Z x2
3
X
1
i+1 f (x )dx =
ai
(x − x1 ) i +1
x0
i=0
S
x0
a1
a1
= a0 (x2 − x1 ) − a0 (x0 − x1 ) + (x2 − x1 )2 − (x0 − x1 )2
2
2
a2
a2
a3
a3
3
3
+ (x2 − x1 ) − (x0 − x1 ) + (x2 − x1 )4 − (x0 − x1 )4
3
3
4
4
a1 2 a1 2 a2 3 a2 3 a3 4 a3 4
= a0 h + a0 h + h − h + h + h + h − h
2
2
3
3
4
4
2
3
= 2a0 h + a2 h
3
!
3
3
X
h X
i
i
=
ai (−h) + 4a0 +
ai h
3
i=0
i=0
h
(a0 − a1 h + a2 h 2 − a3 h 3 + 4a0 + a0 + a1 h + a2 h 2 + a3 h 3 )
=
3
h
2
=
(6a0 + 2a2 h 2 ) = 2a0 h + a2 h 3
3
3
Damit ist der Beweis geführt.
⋄
Wie bei der Trapezregel teilen wir das Gesamtintervall [a, b] in Teilintervalle auf und wenden
die Simpson-Regel auf jedes Teilintervall an. Da die Simpson-Regel immer drei Stützstellen, also
zwei Teilintervalle benutzt, wird das Gesamtintervall in eine gerade Anzahl von Teilintervallen mit
einer ungeraden Anzahl von Stützstellen zerlegt.
Verfahren 10.9 (Simpson-Regel bei beliebiger Schrittweite)
Mit der Partition
a = x0 < x1 < . . . < x2m = b (m ∈ N) des Intervalls [a, b] der Schrittweite h = b−a
2m erhalten wir
als Näherung des Integrals
!
m−1
m
X
X
h
S (h) =
f (x0 ) + 2
f (x2k ) + 4
f (x2k −1 ) + f (x2m ) .
3
k =1
k =1
Ohne Beweis fügen wir eine Fehlerabschätzung an: Für f ∈ C 4 gilt
b
Z
f (x )dx − S (h) ≤ b − a h 4 max f (4) (ξ) .
180
ξ∈[a,b]
a
Bemerkung 10.10
(a) Die Simpson-Regel S = 43 · T2 − 13 · T1 integriert Polynome dritten Grades exakt. Dies erreicht
auch die Regel
1
2
h
h2
T + T ∗ = (f (x1 ) + f (x0 )) + (f ′ (x0 ) − f ′ (x1 )) ,
3
3
2
12
mit der Tangentenregel T ∗ .
(b) Simpsons ursprüngliche Idee ersetzt eine beliebige Funktion durch ein Polynom zweiten Grades, das durch die Stützstellen (x0 , f (x0 )), (x1 , f (x1 )) und (x2 , f (x2 )) (xi := x0 +i ·h; i = 0, 1, 2)
geht und integriert dieses Polynom exakt:
Der Ansatz p2 (x ) = a + b · x + c · x 2 liefert das lineare Gleichungssystem
a + b · x0 + c · x02 = f (x0 )
a + b · x1 + c · x12 = f (x1 )
a + b · x2 + c · x22 = f (x2 ) ,
10 Numerische Integration
93
das mit Hilfe der Cramerschen Regel gelöst werden kann. Wir geben sofort das Ergebnis an,
das als Lagrangesche Interpolationsformel bekannt ist. Zur Probe kann p2 (xi ) = f (xi ) schnell
verifiziert werden:
2
2
X
Y
x − xj
p2 (x ) =
f (xi )
x
i − xj
j =0
i=0
j 6=i
Das Integral über p2 berechnen wir mit Hilfe der linearen Substitution x = x0 +h·s, dx = h ds:


Z 2 X
Z x2
2
2
Y s −j

p2 (x ) dx =
f (xi )

 h ds
i −j
x0
0
j =0
i=0

= h

= h
j 6=i
f (x0 )
2
Z2
(s − 1)(s − 2) ds − f (x1 )
f (x0 )
2
Z2
Z2
0
0
s 2 − 3s + 2 ds − f (x1 )
0
0
s(s − 2) ds +
s 2 − 2s ds +
f (x2 )
2
f (x2 )
2
Z2
0
Z2
0

s(s − 1) ds 

s 2 − s ds 
2
f (x0 )
f (s2 ) s 3 s 2
3·
2
= h
−
+ 2 · s − f (x1 )
−s +
−
2
3
2
3
2
3
2
0
f (x2 ) 8
f (x0 ) 8
8
− 6 + 4 − f (x1 )
−4 +
−2
= h
2
3
3
2
3
h
=
(f (x0 ) + 4f (x1 ) + f (x2 ))
3
s3
s2
Z2
s3
Bemerkung 10.11 (Simpson-Regel bei fortgesetzter Intervallhalbierung)
mus
H
4Ti+1 − Ti
Si := S
=
i
2
3
Der Algorith-
• ist genau für Polynome dritten Grades,
• liefert eine einfache Berechnung für die Simpsonregel und
• konvergiert schneller als Ti .
10.C
Romberg-Integration
Bemerkung 10.12
(a) In dem Ansatz Ci = pSi+1 + qSi werden p und q so gewählt, dass Polynome vierten Grades
exakt integriert werden. Es ergeben sich
• p=
16
15
1
q = − 15
,
• Polynome fünften Grades werden exakt integriert und
• eine höhere Konvergenzgeschwindigkeit.
(b) In dem Ansatz Di := pCi+1 + qCi werden p und q so gewählt, dass Polynome sechsten Grades
exakt integriert werden. Es ergeben sich
• p=
64
63
1
q = − 63
,
• Polynome siebten Grades werden exakt integriert und
• eine höhere Konvergenzgeschwindigkeit.
94
II Numerische Verfahren der Analysis
Dieses Verfahren wird verallgemeinert:
Verfahren 10.13 (Romberg-Integration der Stufe n) Zur näherungsweisen Berechnung des
Rb
Integrals I = a f (x )dx berechnet das Rombergverfahren
(a) in der Anlaufrechnung nach der Trapezregel mit fortgesetzter Intervallhalbierung (Gl. 10.7,
10.8) mit H := b − a
H
(f (a) + f (b))
T1 :=
2

i−1
2X
1
H
H
Ti+1 :=
Ti + i−1
f a + (2j − 1) i 
2
2
2
j =1
(b) im Aufbau eines Dreiecksschemas (das in einer Matrix gespeichert wird)
Ri,o := Ti
Ri,k
:=
(i = 1, ..., n)
4k Ri+1,k −1 −
4k − 1
(Anlaufrechnung)
Ri,k −1
k = 1, ..., n − 1
;
i = 1, ..., n − k
Das Dreiecksschema wird dargestellt. Die erste Spalte enthält die Anlaufrechnung, die weiteren
Spalten die Ergebnisse der einfach zu berechnenden zweiten Formel:
/
k R
Ri,1 Ri,2
Ri,3
Ri,4
· · · · · · Ri,n−2 Ri,n−1
i,o
i
T1
S1
C1
D1
R1,4
· · · · · · R1,n−2 R1,n−1
T2
S2
C2
D2
R2,4
· · · · · · R2,n−2
..
T3
S3
C3
D3
.
··· ···
..
..
T4
S4
C4
.
.
···
..
..
T5
S5
.
.
Rn−4,4
..
..
.
.
T6
Dn−3
..
..
.
.
Cn−2
..
Sn−1
.
Tn
(c) Das Ergebnis, also die beste Näherung, steht in R1,n−1 .
Bemerkung 10.14
(a) Ri,k ist exakt auf P2k +1 .
(b) Die Genauigkeit der Ergebnisses hängt von der Anzahl der signifikanten Stellen in der Anlaufrechnung ab.
(c) Die Stufe n wird solange erhöht, bis hinreichend viele Stellen im Ergebnis unverändert bleiben.
Hierbei können die bisherigen Ergebnisse im Schema benutzt werden.
Beispiel 10.15 Integration der Monome ungeraden Grades bis elf auf dem Intervall [0, 4] mit dem
Romberg-Verfahren sechster Stufe:
• 12 4 î0 4 6 Romberg 't*1'
8.0000
8.0000
8.0000
8.0000
8.0000
8.0000
8.0000
8.0000
8.0000
8.0000
8.0000
.0000
8.0000
8.0000
8.0000
8.0000
.0000
.0000
8.0000
8.0000
8.0000
.0000
.0000
.0000
8.0000
8.0000
.0000
.0000
.0000
.0000
8.0000
.0000
.0000
.0000
.0000
.0000
10 Numerische Integration
95
Die Trapez-Regel integriert jedes Polynom 1. Grades exakt, folglich stimmen alle Werte der RombergTabelle mit dem Integralwert überein.
• 12 4 î0 4 6 Romberg 't*3'
128.0000
80.0000
68.0000
65.0000
64.2500
64.0625
64.0000
64.0000
64.0000
64.0000
64.0000
.0000
64.0000
64.0000
64.0000
64.0000
.0000
.0000
64.0000
64.0000
64.0000
.0000
.0000
.0000
64.0000
64.0000
.0000
.0000
.0000
.0000
64.0000
.0000
.0000
.0000
.0000
.0000
Die Simpson-Regel integriert jedes Polynom dritten Grades exakt, folglich stimmen ab der zweiten
Spalte alle Werte der Romberg-Tabelle mit dem Integralwert überein.
• 12 4 î0 4 6 Romberg 't*5'
2048.0000
1088.0000
788.0000
709.2500
689.3281
684.3330
768.0000
688.0000
683.0000
682.6875
682.6680
.0000
682.6667
682.6667
682.6667
682.6667
.0000
.0000
682.6667
682.6667
682.6667
.0000
.0000
.0000
682.6667
682.6667
.0000
.0000
.0000
.0000
682.6667
.0000
.0000
.0000
.0000
.0000
Die dritte Spalte integriert jedes Polynom fünften Grades exakt, folglich stimmen ab dieser Spalte
alle Werte der Romberg-Tabelle mit dem Integralwert überein. Entsprechendes kann in den beiden
folgenden Beispielen beobachtet werden.
• 12 4 î0 4 6 Romberg 't*7'
32768.0000 11264.0000
16640.0000
8464.0000
10508.0000
8210.2500
8784.6875
8193.1602
8341.0420
8192.0728
8229.3151
.0000
8277.3333
8193.3333
8192.0208
8192.0003
.0000
.0000
8192.0000
8192.0000
8192.0000
.0000
.0000
.0000
8192.0000
8192.0000
.0000
.0000
.0000
.0000
8192.0000
.0000
.0000
.0000
.0000
.0000
• 12 4 î0 4 6 Romberg 't*9'
524288.0000
263168.0000
151268.0000
116968.3906
107918.4312
105624.9005
176128.0000
113968.0000
105535.1875
104901.7781
104860.3902
.0000
109824.0000 104896.0000 104857.6000 104857.6000
104973.0000 104857.7500 104857.6000
.0000
104859.5508 104857.6006
.0000
.0000
104857.6311
.0000
.0000
.0000
.0000
.0000
.0000
.0000
.0000
.0000
.0000
.0000
• 12 3 î0 4 7 Romberg 't*11'
8388608.000
4198400.000
2276348.000
1632883.965
1457825.828
1413098.029
1401854.625
2801664.000
1635664.000
1418395.953
1399473.116
1398188.762
1398106.824
.000
1557930.667
1403911.417
1398211.593
1398103.139
1398101.362
.000
.000
1401466.667 1398108.000 1398101.333 1398101.333
1398121.120 1398101.340 1398101.333
.000
1398101.417 1398101.333
.000
.000
1398101.334
.000
.000
.000
.000
.000
.000
.000
.000
.000
.000
.000
.000
.000
.000
.000
96
II Numerische Verfahren der Analysis
§ 11 Numerische Verfahren für explizite Differenzialgleichung
Zunächst behandeln wir Einschrittverfahren für explizite Differenzialgleichung erster Ordnung. Später gehen wir auf die Behandlung von expliziten Differenzialgleichung zweiter Ordnung ein.
11.A
Eulersches Streckenzugverfahren
Verfahren 11.1 Wir betrachten das Anfangswertproblem
y ′ (x ) = f (x , y) ;
y(a) = ya
auf dem Intervall [a, b]. Das Eulersche Streckenzugverfahren berechnet eine Näherung η(x , h) zur
Schrittweite h = b−a
n der Lösung nach folgendem Algorithmus:
η0 := ya ,
xi
:= a + i h
(i = 0, . . . , n)
ηi
:= ηi−1 + h y ′ (xi−1 ) = ηi−1 + h f (xi−1 , ηi−1 )
(i = 1, . . . , n) .
η(x , h) ist ein Streckenzug.
Für die Berechnung der nächsten Stützstelle wird nur der aktuelle Wert berücksichtigt, nicht die
vorhergehenden. Daher ist dieses Verfahren ein Einschrittverfahren.
Satz 11.2 Wir betrachten das Anfangswertproblem y ′ (x ) = f (x , y) ; y(a) = ya auf dem Intervall
[a, b]. Für den Eulerschen Streckenzug η(x , h) gilt die Fehlerabschätzung
∀ x ∈ [a, b] |y(x ) − η(x , h)| < h sup |f,y (x , y)| .
x ∈[a,b]
Beweis: s. [52, 7.1]
Dieses Verfahren hat die Konvergenzordnung 1 (Exponent von h) und konvergiert damit nicht
gut. Der wesentliche Grund liegt in der schlechten Wahl der Steigungen. Ist y1 falsch berechnet,
so wird eine falsche Steigung genommen und dieser Effekt verstärkt sich noch in den folgenden
Schritten (s. Abb. 11.1). Zur Verbesserung werden im Folgenden mehrere Zwischenwerte für x und
y betrachtet.
Abb. 11.1: Eulersches Streckenzugverfahren
Abb. 11.2: Verfahren von Runge-Kutta
11 Numerische Verfahren für explizite Differenzialgleichung
11.B
97
Das Verfahren von Runge-Kutta
Verfahren 11.3 Wir betrachten das Anfangswertproblem
y ′ (x ) = f (x , y) ; y(a) = ya
auf dem Intervall [a, b]. Das Verfahren von Runge-Kutta berechnet eine Näherung der Lösung nach
folgendem Algorithmus (vgl. Abb. 11.25 ):
b−a
n
:= x0 + i h
h :=
xi
(i = 0, . . . , n)
η0 := ya
ki1 := f (xi−1 , ηi−1 )
h
h
ki2 := f xi−1 + , ηi−1 + k1i
2
2
h
h
ki3 := f xi−1 + , ηi−1 + k2i
2
2
ki4 := f (xi−1 + h , ηi−1 + h k3i )
ηi
:= ηi−1 +
h(ki1 + 2ki2 + 2ki3 + ki4 )
6
(i = 1, . . . , n)
Mit η(x , h) bezeichnen wir den so gewonnenen Streckenzug.
Satz 11.4 Das Verfahren von Runge-Kutta ist ein Verfahren 4. Ordnung, d.h.
∃k ∈ R>0 ∀ x ∈ [a, b] |y(x ) − η(x , h)| < k h 4
Beweis: s. [52, 7.1]
Eine sinnvolle Wahl für die Schrittweite ist in vielen Fällen h =
1
.
10 sup |f,y (x , y)|
Beispiel 11.5
(a) Wir betrachten das Anfangswertproblem y ′ (x ) = f (x , y) = x − y; y(0) = 1 im Intervall [0, 1].
Die Lösung dieser Differenzialgleichung ist nach [26, 19.9(b)] y(x ) = 2e −x + x − 1. Wegen
f,y (x , y) = −1 wird die Schrittweite h = 0.1 gewählt. Die Werte der Berechnung des ersten
Schritts werden tabellarisch erfasst:
x
η
k1j = f (x , η) = x − η k1j (j = 1, 4) 2 k1j (j = 2, 3)
0
1
−1
−1
0.05 0.95
−0.9
−1.8
0.05 0.955
−0.905
−1.81
0.1 0.9095
−0.8095
−0.8095
−5.4195
Hieraus wird η1 = 1 − 0.1 ·
y(0.1) = 0.9096748.
5.4195
6
= 0.909675 berechnet. Zum Vergleich der exakte Wert:
Diese numerische Berechnung wir natürlich mit dem Rechner durchgeführt. Hier seine Ergebnisse, zum Vergleich mit zwei Schrittweiten, wobei η den Streckenzug und y die exakter
Lösung bezeichnet:
5
Diese Abbildung zeigt eine Funktion, die durch den Punkt (xi−1 , µi−1 ) verläuft und die Differenzialgleichung
erfüllt.
98
II Numerische Verfahren der Analysis
Schrittweite 0.1 :
Schrittweite 0.5 :
x
η(x , h)
y(x )
0.0 1.0000000 1.0000000
0.1 .9096750 .9096748
0.2 .8374618 .8374615
0.3 .7816368 .7816364
0.4 .7406406 .7136401
0.5 .7130619 .7130613
0.6 .6976239 .6976233
0.7 .6931712 .6931706
0.8 .6986586 .6986579
0.9 .7131400 .7131393
1.0 .7357595 .7357589
x
η(x , h)
y(x )
.0 1.0000000 1.0000000
.5 .7135417 .7130613
1.0 .7363417 .7357589
(b) Als weiteres Beispiel betrachten wir das leicht geänderte Anfangswertproblem
y ′ (x ) = x − 10y ;
y(0) = 1
im Intervall
[0, 1]
mit der Lösung
101 −10x x
1
y(x ) =
e
+ −
100
10 100
nach [26, 19.9(b)] (a=1, b=-10, c=0, vgl. a)). Die numerischen Ergebnisse lauten:
Schrittweite 1:
Schrittweite 0.01:
x
η(x , h)
y(x )
0.0 1.0000000 1.0000000
0.1 .3715586 .3715582
0.2 .1466889 .1466886
0.3 .0702851 .0702849
0.4 .0484989 .0484988
0.5 .0468054 .0468053
0.6 .0525036 .0525035
0.7 .0609210 .0609210
0.8 .0703388 .0703388
0.9 .0801246 .0801246
1.0 .0900459 .0900459
x
η(x , h)
y(x )
.0
1.0000000 1.0000000
1.0 294.0000000 .0900459
Schrittweite 0.5:
x
η(x , h)
y(x )
0.0 1.0000000 1.0000000
0.5 13.885416
0.468053
1.0 189.8875868 .0900459
Schrittweite 0.1:
x
η(x , h)
y(x )
0.0 1.0000000 1.0000000
0.1 .3787500 .3715582
0.2 .1520312 .1466886
0.3 .0732417 .0702849
0.4 .0499731 .0484988
0.5 .0474899 .0468053
0.6 .0528087 .0525035
0.7 .0610533 .0609210
0.8 .0703950 .0703388
0.9 .0801481 .0801246
1.0 .0900555 .0900459
11.C
Modifizierte Euler-Verfahren
Zur numerischen Lösung einer expliziten Differenzialgleichung erster Ordnung
y ′ (x ) = f (x , y) ;
y(a) = ya
berechnet das Euler-Verfahren die Näherung an den Funktionswert an der Stelle xi+1 mit Hilfe der
Näherung und der Steigung aus der Differenzialgleichung an der Stelle xi :
x0 = a ;
xi = x0 + i · h ;
η0 = y0 ;
ηi+1 = ηi + h · f (xi , ηi )
für
i = 0, . . . , n .
11 Numerische Verfahren für explizite Differenzialgleichung
99
Modifizierte Verfahren benutzen Werte, die mit Hilfe der Differenzialgleichung im Intervall [xi , xi+1 ]
prognostiziert werden:
x0 = a ;
xi = x0 + i · h ;
η0 = y0 ;
Ich stelle zwei Verfahren vor:
ηi+1 = ηi + h · Φ(xi , ηi , f )
für
i = 0, . . . , n .
Verfahren 11.6 (Heun, 1900) Das Verfahren von Heun benutzt den Mittelwert aus der Steigung
am Anfang und der ersten Prognose am Ende des Intervalls:
1
Mit Φ(x , y, f ) = (f (x , y) + f (x + h, y + hf (x , y))) erhalten wir
2
h
ηi+1 = ηi + (f (xi , ηi ) + f (xi+1 , ηi + hf (xi , ηi ))) .
2
Verfahren 11.7 (Collatz, 1960) Das modifizierte
benutzt die prognostizierte
Euler-Verfahren h
h
Steigung in der Intervallmitte: Mit Φ(x , y, f ) = f x + , y + f (x , y) erhalten wir
2
2
h
h
ηi+1 = ηi + h · f xi + , ηi + f (xi , ηi ) .
2
2
11.D
Das Schießverfahren
Das Schießverfahren löst ein explizites Randwertproblem zweiter Ordnung auf dem Intervall [a, b]
y ′′ (x ) = f (x , y, y ′ ) ;
y(a) = ya ; y(b) = yb
numerisch.
Beispiel 11.8 (Balkenlinie) Für einen mit einer Linienlast q(x ) belasteten Balken der Länge l, der
an seinen Enden mit einem Los- und einem Festlager gestützt ist, gelten für das Schnittmoment
My (x )
My (0) = 0 ;
My (l) = 0 ;
und die Biegelinie w (x )
w (0) = 0 ;
w (l) = 0 ;
My′′ (x ) = −q(x )
w ′′ (x ) = −
1
My (x ) .
E Iyy
⋄
Mit Hilfe des Taylorpolynoms zweiten Grades
h 2 ′′
y (xi−1 )
2
werden analog zum Eulerschen Streckenzug-Verfahren die Näherungen an die Funktion und ihre
Ableitung in den Stützstellen iterativ berechnet. Der Algorithmus verlangt jedoch eine Anfangssteigung y0′ , die nicht gegeben ist. In der Iteration wird als Steigung das arithmetische Mittel aus
der Steigung an der aktuellen und nächsten Stützstelle genommen.
T2 (y, xi−1 , xi ) = y(xi−1 ) + h · y ′ (xi−1 ) +
Verfahren 11.9 (Schießverfahren) Für eine explizite Differenzialgleichung zweiter Ordnung
y ′′ (x ) = f (x , y, y ′ ) ;
y(a) = ya ; y(b) = yb
und einen Startwert ya′ liefert das Verfahren
xi
= xi−1 + h ;
η0 = ya
ki
=
ηi′
=
η0′
=
′
ηi−1
+h ·
′
ηi−1 + ki
2
(i = 0, . . . , n)
ya′
′′
′
′
y (xi−1 ) = yi−1
+ h · f (xi−1 , ηi−1 , ηi−1
)
′
= ηi−1
+
h
′
f (xi−1 , ηi−1 , ηi−1
)
2
h2
f (xi−1 , ηi−1 , ηi′ )
(i = 1, . . . , n)
2
eine numerische Näherung an die Funktion, wenn S (f , ya , ya′ ) := ηn nahe an yb liegt.
ηi
= ηi−1 + h · ηi′ +
100
II Numerische Verfahren der Analysis
Bei einer Wahl einer Anfangssteigung ya′ als Startwert liefert der Prozess eine Näherung ηn für yb .
F (ξ) := yb − S (f , y0 , ξ) berechnet den Fehler, dessen Nullstelle mit Hilfe eines Nullstellenverfahrens
(Bisektion, Steffensen-Verfahren, Newton-Verfahren) berechnet werden kann.
11.E
Das Differenzenverfahren
Das Differenzenverfahren löst ein explizites Randwertproblem zweiter Ordnung auf dem Intervall
[a, b]
y ′′ (x ) = f (x ) ;
y(a) = ya ; y(b) = yb
numerisch. Die zweite Ableitung darf also weder vom Funktionswert noch von der Ableitung abhängen. Dies ist in Beispiel 11.8 der Fall. Mithilfe der Differenzenquotienten für die linksseitige erste
und rechtsseitige zweite Ableitung erhalten wir eine lineares Gleichungssystem für die unbekannten
Näherungswerte der Funktion:
Verfahren 11.10 (Differenzenverfahren) Für eine explizite Differenzialgleichung zweiter Ordnung
y ′′ (x ) = f (x ) ;
y(a) = ya ; y(b) = yb
liefert
xi
= xi−1 + h ;
(i = 0, . . . , n)
y(xi − h) − y(xi )
ηi − ηi−1
ηi′ ≈
≈
−h
h
′
′
′
η
− ηi′
y (xi + h) − y (xi )
f (xi ) = yi′′ ≈
≈ i+1
≈
h
h
die n − 1 Gleichungen
ηi+1 − 2ηi + ηi−1 = h 2 · f (xi ) ;
ηi+1 −ηi
h
−
h
ηi −ηi−1
h
=
ηi+1 − 2ηi + ηi−1
h2
(i = 1, . . . , n − 1) .
zur Bestimmung der n − 1 Unbekannten η1 , . . . , ηn−1 . Mit den bekannten Werten η0 = ya und
ηn = yb lautet das zu lösende lineare Gleichungssystem


−2
1
0 0
0
0
0
0 h 2 f (x1 ) − ya
 1 −2

1 0
0
0
0
0 h 2 f (x2 )


2
 0

1 −2 1
0
0
0
0 h f (x3 )




..

 .
.


2
 0

0
0 0
1 −2
1
0 h f (xn−3 )


2
 0

0
0 0
0
1 −2
1 h f (xn−2 )
2
0
0
0 0
0
0
1 −2 h f (xn−1 ) − yb
Es ist diagonaldominant6 und hat Tridiagonalgestalt.
Die genannten Eigenschaften des linearen Gleichungssystems erhöhen die Geschwindigkeit und
Genauigkeit der numerischen Lösung.
6
Der Betrag des Diagonalelements ist größer oder gleich der Summe der Beträge der anderen Elemente einer Zeile
12 Solving Optimization Problems
101
§ 12 Solving Optimization Problems
Literature: Engeln-Müllges/Niederdrenk [15], Preuß/Wenisch [41], Schwetlick/Kretschmar [48].
A history of the algorithms may be found in [18].
Finding the minimal or maximal point of a function f : Rn → R is a quite common problem
in engineering, economics and further areas applying mathematical tools. Replacing f by −f
interchanges maximal and minimal points, so we may restrict the investigation on minimal points.
In this section we explain several algorithms but nearly never state or proof their convergence.
They may be found in the literature.
Example 12.1
The underlying experiment from which we obtain a set of measurements
{(xi , fi ) | i = 1, . . . , n} obeys the law f (x ) = A · sin(ωx + ϕ) .
We would like to find a set of parameters satisfying the n equations in 3 unknowns
A · sin(ωxi + ϕ) = fi
(i = 1, . . . , n) .
(12.1)
This system is over-determined so we only can find a best fit, the best parameters A, ω and ϕ! As
these equations are non-linear Gauß’ least square method for an over-determined system of linear
equations [26, 4.D, Page 36] does not apply, see also 14.7.
We start with the sum of squared errors in (12.1) taken half for later convenience
n
1X
E (A, ω, ϕ) =
(A · sin(ωxi + ϕ) − fi )2 .
2
(12.2)
i=1




A
A · sin(ωx1 + ϕ) − f1




~


 we get
Setting w
~ =
and
d
(~
w
)
=
···

ω

ϕ
A · sin(ωxn + ϕ) − fn
E
1 D~
d(~
w ), ~d (~
w) .
E (~
w) =
2
We are looking for a minimum of this differentiable function, so its gradient is zero:
E (12.2)
1 −−→ D
−→
~0 = −
grad E (~
w ) = grad ~d(~
w ), ~d (~
w)
= ~d (~
w )T d ′ (~
w) .
2
(12.3)
(12.4)
Lemma 12.2 If ~f : Rn → Rm has a total derivative we get for the gradient
D
E
−−→ ~
grad f (~x ), ~f (~x ) = 2 · ~f (~x )T · f ′ (~x )
with the Jacobian f ′ (~x ).
Proof: Taking a constant vector ~c ∈ R we calculate
D
E
−−→ ~
−−→
grad f (~x ), ~c = grad
m
X
!
ci fi (~x )
i=1
 −−→

m
grad f1 (~x ) 
X

−−→

=
ci grad fi (~x ) = ~c T 
c T · f ′ (~x ) .

 =~
···
 −−→

i=1
grad fm (~x )
Applying the product rule and the commutativity of the scalar product we get the desired result.
⋄
12.A
Zeros of a function
We now go on to investigate methods to find zeros of a vector values function which will later on
be applied to the above situation.
Given a function ~f : Rn → Rm we are looking for a point ~x ∈ Rn satisfying ~f (~x ) = ~0. A well
known method to find zeros of a real valued function in one variable ist the Newton algorithm
which successively calculates the zero of the tangent line to the function. We are extending this
method to functions in higher dimensions.
102
II Numerische Verfahren der Analysis
From [26, 8.E, Page 61] we get the description of the tangent hyperplane to the point ~f (~xk ) to
be
~t(~xk , ~x ) = ~f (~xk ) + f ′ (~xk )(~x − ~xk )
(12.5)
with the Jacobian f ′ (~xk ) ∈ Rmn . To find a point ~xk +1 with ~t(~xk , ~xk +1 ) = ~0 we have to solve the
system of linear equations
f ′ (~xk ) · ~y = −~f (~xk )
with
~y = ~xk +1 − ~xk .
(12.6)
Method 12.3 (Newton-Raphson) Given a differentiable function ~f : Rn → Rm , a starting point
~x0 , an error bound R and a maximal number kmax of iterations we successively
(a) solve the system of linear equations f ′ (~xk ) · ~y = −~f (~xk ) , and
(b) set ~xk +1 = ~xk + ~y .
The algorithm stops, if either
(a) k~xk +1 − ~xk k ≤ m · R · k~xk k, or
(b) k~f (~xk +1 )k ≤ n · R, or
(c) k = kmax .
The last stop criteria means a non-successful termination of the algorithm, in general.
The critical question behind this algorithm is whether or not the system of linear equations
(12.6) is solvable!
Remark 12.4 We discuss some cases for the matrix f ′ (~xk ) ∈ Rmn :
(a) n = m: The matrix f ′ (~xk ) is quadratic:
If the functional determinant is non-zero it is uniquely solvable. Otherwise it may have no
solution or infinitely many.
(b) n < m: There are more equations than unknowns:
In general there is no solution. Using least square methods we find a best solution ~y minimizing the error, see [26, 4.D, Page 36] or 14.8.
(c) m < n: There are less equations than unknowns:
In general there are infinitely many solutions. We may choose a solution of minimal norm
(absolute value), see 14.10.
Example 12.5
−−→
(a) We look at a differentiable function f : R2 → R: Using its derivative f ′ (~x ) = grad f (~x ) the
system of linear equations Eq. 12.6 consists of one equation in the two unknowns x and y.
The set of solutions form a line, from which we may choose the point closest to the origin.
If we visualize this function in R3 by setting z = f (x , y) we get the tangent plane by
E:
~t(λ, µ) =









x
1
0






 + µ
.
+
λ
y 
0
1





f (x , y)
f,x (x , y)
f,y (x , y)
The set of zeros of this tangent plane is its intersection with Exy which forms a line. We
choose the orthogonal projection of the origin onto this line as a solution of Eq. 12.6.
(b) Next we look at a differentiable function ~f : R → R2 : The image f (R) of this function is
a curve in the plane which may contain the origin whose inverse image we are looking for.
The system Eq. 12.6 of linear equations consists of two equations in one unknown so 12.4(b)
applies.
12 Solving Optimization Problems
12.A.1
103
Gradient Descent
The gradient descent method applies to a function f : Rn → R. The gradient of this function always
shows in the direction in which the function rises most steeply. So if we are looking for a zero and
the function value is positive we have to go in opposite direction. This leads to
Method 12.6 (Gradient Descent for Finding Zeros)
Given a differentiable function f :
Rn → R, a starting point ~x0 ∈ Rn , an error bound R and a maximal number of iterations kmax
we successively calculate
−−→
~xk +1 = ~xk − σk · sign(f (~xk )) · grad f (~xk ) .
−4
σk starts with
1 or .5 and decreases to a small positive value, say 10 , we could use the formula
−4
k
· /kmax . If the function values change sign σk is taken half.
1 − 1 − 10
The iteration stops if
(a) the maximal number kmax of iterations has been done, or
(b) the absolute value of the function gets less than the error bound R, or
(c) the distance between iteration point gets less than the error bound R, or
(d) the norm of the gradient gets less than the error bound R.
Only case two yields a positive result: a zeros has been found! Cases three and four could mean
that the iteration point lies closed to a minimal (or maximal) point of the function.
In this algorithm we try to get the function value smaller until it is negative. Then we try to
get it bigger, and so on. If we only try to make it smaller we hope to finally find a minimal point!
12.B
Minimal Points
12.B.1
Gradient Descent
Method 12.7 (Gradient Descent for Finding Minimal Points) Given a differentiable function f : Rn → R, a starting point ~x0 ∈ Rn , an error bound R and a maximal number of iterations
kmax we successively calculate
−−→
~xk +1 = ~xk − σk · grad f (~xk ) .
−4
σ starts with
1 or .5 and decreases to a small positive value, say 10 , we again use the formula
−4
k
1 − 1 − 10
· /kmax .
The iteration stops if
(a) the maximal number kmax of iterations has been done, or
(b) the distance between iteration point relatively gets less than the error bound R, or
(c) the norm of the gradient gets less than the error bound R.
In general, the first case does not yield a positive result! The other cases give a minimal point
of the function. In general this is a local minimum!
12.B.2
Newton-Type Methods
To apply the Newton-Raphson algorithm 12.3 to Eq. 12.4 we need the second derivative of the
real-valued E which is called the Hesse-matrix. Applying the product rule we get
′
E ′′ (~x ) = ~d(~x )T d ′ (~x ) = d ′ (~x )T · d ′ (~x ) + d(~x )T · d ′′ (~x )
(12.7)
Assuming that the second derivative is small close to a minimal point the second summand may
be dropped:
E ′′ (~x ) ≈ d ′ (~x )T · d ′ (~x )
(12.8)
As a product of a matrix and its transpose E ′′ (~x ) is symmetric and semi-definit. We get the
104
II Numerische Verfahren der Analysis
Method 12.8 (Newton-Gauß) To find a minimal point of the function
E
1 D~
E (~x ) =
d(~x ), ~d(~x ) : Rn → R
2
for a given differentiable function ~d : Rn → Rm , a starting point ~x0 , an error bound R and a
maximal number kmax of iterations we successively
(a) solve the system of linear equations d ′ (~xk )T d ′ (~xk ) · ~y = −~d (~xk )T d ′ (~xk ) , and
(b) set ~xk +1 = ~xk + ~y .
The algorithm stops, if either
(a) k~y k ≤ m · R · k~xk k, or
(b) k~d (~x )T d ′ (~x )k ≤ n · R, or
(c) k = kmax .
The last stop criteria means a non-successful termination of the algorithm.
A problem may occur if d ′ (~xk )T d ′ (~xk ) is non-regular so the system of linear equations may be
non-solvable. As it is symmetric we may use a relaxation method:
Remark 12.9 If A is symmetric and −µ (µ ≥ 0) smaller than all eigenvalues of A then A + µ Id
is positive definit.
Proof: If A only has positive eigenvalues, this matrix is positive definit an µ may be chosen to
be 0.
Assuming the smallest eigenvalue of A being λ. For a vector ~x of unit length we have
−µ k ~x k2 < λ k ~x k2 ≤ hA~x , ~x i ,
which yields
h(A + µ Id)~x , ~x i = hA~x , ~x i + hµ Id ~x , ~x i = hA~x , ~x i + µ k ~x k2 > 0
following [26, 24.12, Page 155].
⋄
Using the above ideas we get
Method 12.10 (Levenberg-Marquardt Algorithm) To find a minimal point fo the function
E
1 D~
E (~x ) =
d(~x ), ~d(~x ) : Rn → R
2
for a given differentiable function ~d : Rn → Rm , a starting point ~x0 , an error bound R and a
maximal number kmax of iterations we successively
(a) choose a non-negative µ making d ′ (~xk )T d ′ (~xk ) + µ Id positive definit
(b) solve the system of linear equations d ′ (~xk )T d ′ (~xk ) + µ Id · ~y = −~d (~x )T d ′ (~x ) , and
(c) set ~xk +1 = ~xk + ~y .
The algorithm stops, if either
(a) k ~y k ≤ m · R, or
(b) ~d (~x )T d ′ (~x ) ≤ n · R, or
(c) k = kmax .
The last stop criteria means a non-successful termination of the algorithm.
Remark 12.11 We look at two special cases for µ:
(a) µ = 0: In this case the algorithm equals the Newton-Gauß method.
12 Solving Optimization Problems
105
(b) µ is very large, so that µ Id dominates d ′ (~xk )T d ′ (~xk ): In this case we get
1 −−→
~xk +1 = ~xk − grad E (~x ) ,
µ
so we obtain the gradient descent.
So the Levenberg-Marquardt algorithm is a mixture of gradient descent and Newton’s method used
to find a zero of the gradient.
These algorithms all need to solve systems of linear equations which we are going to have a
closer look in the next section.
Chapter III
Numerical Methods in Linear Algebra
§ 13 Numerical Solution of a System of Linear Equations
In this section we explain several algorithms but nearly never state or proof their convergence.
They may be found in the Literature: Engeln-Müllges/Niederdrenk [15], Preuß/Wenisch [41],
Schwetlick/Kretschmar [48]. A history of the algorithms may be found in [18].
13.A
Triangular Decomposition
13.A.1
LU-Factorization (LR-)
In [26, 2.15, Page 17] we introduced the LU-factorization1 of a square matrix:
Theorem 13.1 (LU-Factorization1 ) Every Matrix M ∈ Rnn factorizes into a product M =
PLRQ with permutation matrices P and Q , a lower left unitriangular2 matrix L and an upper
right triangular matrix R geschrieben werden.
If M is regular (or invertible) Q = Id may be chosen.
The permutation matrices P and Q are products of the permutation matrices which perform the
necessary interchanging of rows or columns.
R is the upper triangular matrix resulting in the Gauß-algorithm, L the inverse of the product
of all elementary lower triangular matrices each of which establishes one step of the Gauß-algorithm
by left-multiplication.
To simplify the presentation we assume that interchange of rows or columns is needed by the
Gauß3 algorithm, so we have P = Q = Id and A = LR.
Method 13.2 (Solution with the LU-factorization) Setting ~y = R~x the system of linear equations ~b = A~x = LR~x = L~y can be solved in two steps:
(a) the system L~y = ~b step by step starting with the last
(b) the system R~x = ~y step by step starting with the first
unknown variable.
1
LU: Lower left - Upper right (LR-Zerlegung)
triangular matrix the diagonal elements of which are all one
3
Carl Friedrich Gauß, german mathematician, 1777 - 1855
2
106
13 Numerical Solution of a System of Linear Equations
107
Apart from the Gauß-algorithm we may get the LU-factorization by directly calculating the
factorization:
Method 13.3 (Direct LU-factorization, Crout4 -Method) From presenting the factorization
A = LR using the falk-scheme


r11 · · · r1j · · · r1n



..
.. 
 0
.
. 



1
..
.





 l
 i1

 ..
 .

0
0
···
0
1
..
.
ln1 · · · lni
0
0
0
0
0
0
··· 1












=







0

a11
..
.
· · · a1j
..
.
· · · a1n
..
.
ai1
..
.
···
···
0
0











0
rjj
0
0
0
aij
..
.
an1 · · · anj
···
rjn
..
.
0
rnn













ain 

.. 

. 

· · · ann
we get
(a) 1 · r1j = a1j → r1j = a1j (j = 1, . . . , n) ,
ai1
(i = 2, . . . , n)
li1 · r11 = ai1 → li1 =
r11
(b) l21 · r1j + 1 · r2j = a2j → r2j = a2j − l21 · r1j (j = 2, . . . , n) ,
ai2 − li1 · r12
li1 · r12 + li2 · r22 = ai2 → li2 =
(i = 3, . . . , n)
r22
21 a12
requires 0 6= r22 = a22 − l21 · r12 = a22 − aa21
· a12 = a11 a22a−a
⇔
11
11
...
and in general für i = 1, . . . , n:
i−1
i−1
X
X
(a)
lik rkj + 1 · rij = aij → rij = aij −
lik rkj (j = i , . . . , n)
(b)
k =1
i
X
k =1
lrk rki = ari
→
lri =
ari −
Pi−1
requires a11 6= 0,
0 6= a11 a22 − a21 a12 ,
k =1
k =1 lrk rki
(r = i + 1, . . . , n)
rii
The last formula requires rii 6= 0 which leads to the condition that the upper central minors5 must
be non-zero, whereas the total determinant may be zero.
13.A.2
Cholesky Factorization of Positive Definit Matrices
If the matrix A = LU is symmetric
A = AT = (LU )T = U T LT
yields another lower-upper decomposition. To reduce calculation time one might want to get
U T = L but this is only possible if we skip the assertion that the L-part is unitriangular. These
ideas lead to the Cholesky6 factorization:
Method 13.4 (Cholesky factorization) From presenting the factorization A = LLT using the
falk-scheme


l11 · · · lj 1 · · · ln1



..
.. 
 0
.
. 









4
0
0
ljj
0
0
0
0
0
···
lnj
..
.
0
lnn







Prescott Durand Crout, US-american mathematician, 1907-1984
obere zentrale Unterdeterminanten
6
André-Louis Cholesky, french mathematician, 1875 (Montguyon) - 1918 (1st world war)
5
108
III Numerical Methods in Linear Algebra

l11

 .
 ..


 l
 i1

 ..
 .

0
···
0
0
lii
..
.
ln1 · · · lni
we get
0
0
0
0
0
0
· · · lnn













=











a11
..
.
· · · a1j
..
.
· · · a1n
..
.
ai1
..
.
···
···
aij
..
.
an1 · · · anj






ain 

.. 

. 

· · · ann
√
(a) l11 · l11 = a11 → l11 = a11
requires a11 ≥ 0,
ai1
li1 · l11 = ai1 → li1 =
(i = 2, . . . , n) ,
requires a11 > 0,
l11
s
q
2
a11 · a22 − a12
2
2
2 =
(b) l21
+ l22
= a22 → l22 = a22 − l21
requires a11 a22 − a12 a12 ≥ 0,
a11
l21 · lj 1
(j = 3, . . . , n) requires a11 a22 − a12 a12 > 0
l21 · lj 1 + l22 · lj 2 = a2j → lj 2 = a2j −
l22
...
min(i,j )
X
and in general for i = 1, . . . , n the equation
lik ljk = aij yields
k =1
v
u
i−1
X
u
(a) lii = taii −
lik ljk
k =1
(b)
i
X
lik ljk = aij = aji
k =1
Theses results require aii −
must be positive.
→
i−1
X
lji =
aji −
Pi−1
k =1 lik ljk
lii
(j = i + 1, . . . , n) .
lik ljk > 0 which leads to the condition that the upper central minors
k =1
According to [26, 9.3, Page 62] this property is equivalent to A being positive definit. For
convenience we state equivalent properties of a symmetric matrix being positive definit:
Theorem 13.5 The following properties of a symmetric matrix A are equivalent:
(a) A is positive definit, e.g. ∀ ~x ∈ Rn \{~0} : hA~x , ~x i > 0,
(b) All central upper minors are positive.[26, 9.3, Page 62]
(c) All eigenvalues are positive.
There are algorithms which work very well for positive definit matrices. The method of 12.9
sometimes allows to transfer results for positive definit matrices to semi definit matrices.
Remark 13.6 An extension of the Cholesky decomposition is a factorization
A = LDLT
where L is a unitriangular und D a diagonal matrix.
13.B
Iterative Solutions of Systems of Linear Equations
13.B.1
Improving a One-Step Iterative Method
Solving a system of linear equations A~x = ~b numerically yields an approximation ~x̃ to the true
solution ~x . Using
∆~x := ~x − ~x̃
13 Numerical Solution of a System of Linear Equations
109
we get
A∆~x = A ~x − ~x̃ = A~x − A~x̃ = ~b − A~x̃ ,
which is a system of linear equations to determine ∆~x . Using this we find ~x̄ + ∆~x to be a better
approximation to the true solution. This explains the following algorithm:
Method 13.7 (Improving the Solution of as System of Linear Equations) The solution of
a system of linear equations A~x = ~b is iteratively improved by the algorithm:
(a) Starting Value: ~x0 = ~0
(b) Iteration:
(b1) Solve the system of linear equations A∆~x = ~b − A~xi .
(b2) Put ~xi+1 := ~xi + ∆~x .
(c) Stop Criterion: Using an error bound R which
often is chosen to be R = 10−6 the algorithm
~ ~
stops when it reaches b − A~xi < R · b .
13.B.2
Successive Approximations
We decompose the matrix A into a sum A = L + D + R where L denotes its lower left part, D
its diagonal and U its upper right part. A system of linear equations ~b = A~x = (L + D + R)~x is
rewritten as
D~x = ~b − (L + R)~x .
This equation is used to define an iterative method to solve the A~x = ~b:
~xk +1 = D −1 (~b − (L + R)~xk ) .
(13.1)
Multiplying a vector with D −1 is just dividing its components by the elements of the diagonal D .
We write this calculation down for every component:
Method 13.8 (Jacobi7 -Method)


n
X
1 

xk +1,i =
aij xk ,j 
 bi −
aii
j =1
(i = 1, . . . , n)
(13.2)
j 6=i
xik +1 is already known when calculating xjk +1 j > i , so one could use xik +1 instead of xik . This
is used in the following iterative algorithm
Method 13.9 (Gauß8 -Seidel9 Method, Successive Displacement10 )


i−1
n
X
X
1 
xk +1,i =
bi −
aij xk +1,j −
aij xk ,j  (i = 1, . . . , n)
aii
j =1
j =i+1
The changes in the values of ~x are weighted by a factor normally just greater than 1, so instead
of
xk +1,i = xk ,i +

1 
bi −
aii
i−1
X
j =1
aij xk +1,j −
n
X
j =i

aij xk ,j 
(i = 1, . . . , n)
which is equivalent to the Gauß-Seidel method we calculate
7
Carl Gustav Jakob Jacobi, german mathematician, 1804-1851
Carl Friedrich Gauß, german mathematician, 1777 - 1855
9
Philipp Ludwig von Seidel, german mathematician, 1821 (Zweibrücken) - 1896 (München)
10
Einzelschrittverfahren
8
110
III Numerical Methods in Linear Algebra
Method 13.10 (Successive Over-Relaxation11 - SOR)


i−1
n
X
X
w 
aij xk +1,j −
aij xk ,j  (i = 1, . . . , n) .
xk +1,i = xk ,i +
bi −
aii
j =1
j =i
For w = 1 this formula reduces to the Gauß-Seidel method. In general w > 1 results in faster
convergence.
We summarize these result in matrix notation
Summary 13.11 Let A = L + D + R be the decomposition of a matrix in its lower left, diagonal
and upper right part. We have
(a) D~xk +1 + (L + R)~xk = ~b
(Jacobi),
(b) (L + D )~xk +1 + R~xk = ~b
(Gauß-Seidel),
~
− 1)D +wR)~xk =
(c) (wL + D )~xk +1 + ((w
w b , hence
1
1
L + D ~xk +1 +
1−
D + R ~xk = ~b
w
w
from which we get
(a) ~xk +1 = D −1 ~b − (L + R)~xk
(b) ~xk +1 = (L + D )−1 ~b − R~xk
−1 1
1
~
(c) ~xk +1 = L + D
D + R ~xk .
b−
1−
w
w
13.B.3
(SOR).
(Jacobi),
(Gauß-Seidel),
(SOR)
⋄
Convergence Theorem
Next we look at the convergence of the above algorithms. They all can be written in the form
Φ(~x ) = M ~x + ~c ;
with
where we have
(a) M = −D −1 (L + R) ,
M ∈ Rn,n , ~x , ~c ∈ Rn ,
~c = D −1~b
(Jacobi),
−1~
−1
(b) M = −(L + D ) R , ~c = (L + D ) b
−1 1
1
(c) M = − L + D
1−
D +R ,
w
w
(Gauß-Seidel),
~c =
L+
1
D
w
−1
~b
(SOR).
Remark 13.12 A successive iteration Φ(~x ) = M ~x + ~c has the following properties:
(a) It has a unique fixed point if and only if Id −M is a regular matrix.
(b) M determines the error behavior.
Proof:
(a)
Φ(~x ) = ~x
⇔
(Id −M )~x = ~c
If Id −M is regular the system of linear equations has a unique solution. Otherwise there is
no solution or there are infinitely many!
(b) If ~dk := ~x − ~xk with the fixed point ~x then
~dk +1 = ~x − ~xk +1 = M ~x + ~c − (M ~xk + ~c ) = M ~x − M ~xk = M (~x − ~xk ) = M ~dk .
(13.3)
What are the properties of the matrix which make the algorithm converge? If the matrix is
symmetric we expect the eigenvalues to have absolute value less than one:
11
Sukzessive Überrelaxation
13 Numerical Solution of a System of Linear Equations
111
For a symmetric matrix M ∈ Rn,n with eigenvalues
Definition 13.13 (Spectral Radius)
λ1 , . . . , λn we define
̺(M ) := max{|λ1 |, . . . , |λn |}
to be the spectral radius of the matrix.
Theorem 13.14 If the spectral radius ̺(M ) of a symmetric matrix M ∈ Rn,n is less than one, the
iteration
Φ(~x ) = M ~x + ~c
converges.
Proof: Let {êi | i = 1, . . . , n} be an eigenbasis of
Rn,n
and ~d0 =
n
X
ci êi . Then
i=1
n
n X
X
~ k~ ~ ci λki êi ≤
dk = M d0 = d0 ̺(M )k = n ~d0 ̺(M )k
i=1
13.C
⋄
i=1
Orthogonalization
Orthogonalization describes the process to transform a set of linearly independent vectors to orthogonal vectors spanning the same subspace. It is equivalent to a factorization A = QR of a
matrix A into a product of an orthogonal and an upper triangular matrix.
Method 13.15 (Gram12 -Schmidt13 ) The algorithm of Gram-Schmidt orthogonalizes the rows
of the matrix A one after the other:
~q1
(a)
~q1 = ~a1
(13.4)
and
q̂1 =
k~q1 k
(b) Assume the first k − 1 rows are orthogonalized. Now we have to find ~qk so that the two sets
{~q1 , . . . , ~qk −1 , ~ak }
and
{~q1 , . . . , ~qk −1 , ~qk }
span the same subspace (~ak will be replaced by ~qk ). The new vectors will be normalized:
~qk = ~ak −
k −1
X
j =1
h~ak , q̂j i q̂j
und
q̂k =
~qk
k~qk k
für k = 2, . . . , n
.
(13.5)
Defining
Q
= (q̂1 , . . . , q̂n )
R = (rij )
and
with
we get the desired factorization.
rii = k~qi k ,
(13.6)
rij = h~aj , q̂i i (j > i )
(13.7)
It turns out that changing the remaining rows as early as possible, contrary to gathering all the
necessary changes in 13.5. This lead to a numerically more stable algorithm
Method 13.16 (Gram-Schmidt, modified) After determining qk in Eq. 13.5 we will subtract
the term h~aj , q̂k i q̂k from the rows ~aj (j > k ):
(1)
(a) Initialization: ak
= ak für k = 1, . . . , n
(b) Calculating steps for k = 1, . . . , n:
(k )
q̂k
(k +1)
~aj
12
13
~a
k ,
(k ) ~ak D
E
(k )
(k )
= ~aj − ~aj , q̂k q̂k (j = k + 1, . . . , n) .
=
Jørgen Pedersen Gram, danish mathematician, 1850 (Haderslev) - 1916 (Kopenhagen)
Erhard Schmidt, german mathematician, 1876 (Dorpat (now Tartu, Estland) - 1959 (Berlin)
112
III Numerical Methods in Linear Algebra
Finally Eq. 13.6 and 13.7 yield the same factorization as the standard Gram-Schmidt method.
A method found by Householder14 transforms the matrix by applying Householder reflections
which reflect the first column of a matrix to the first axes, thereby creating zeros under beneath
the diagonal.
Method 13.17 (Householder) The Householder algorithm transforms a regular matrix into an
upper triangular matrix R. The transformation is achieved by applying reflections to the matrix A
thereby creating a factorization A = QR with Q to be the product of the inverses all used reflections:
R = Sn · . . . · S1 · A
yields
A = S1−1 · . . . · Sn−1 · R = S1 · . . . · Sn ·R = QR .
| {z }
Q:=
We demonstrate the idea of the algorithm on the first row of the matrix:
We are looking for a reflection which maps the first column ~a1 of A onto a vector k ê1 of the same
length. In addition the angle ∠(~a1 , k ê1 ) is chosen to be greater than 90◦ . So we need
k = − sign(a11 ) · k~a1 k .
A reflection S~v with a mirror plan perpenticular to ~v maps ~v onto −~v . It is given by the matrix
~v · ~v T
.
h~v , ~v i
In order to map the vector ~a1 of A onto k ê1 we must have
k ê1 − ~a1
~v =
.
2
Once this is done we go on with a partial matrix obtained by skipping the first row and column
and proceed in the same way. Geometrically we are working in ê1⊥ , the subspace orthogonal to the
subspace spanned by ê1 . A reflection in ê1⊥ does not change ê1 .
S~v = E − 2
Reflections are (symmetric and) orthogonal, so their product is orthogonal as well.
13.D
⋄
Tridiagonalization
In several numerical methods tridiagonal matrices are easier to handle. Therefore we look for an
algorithm to transform a symmetric matrix to this shape. We do so by rotating the axes of the
underlying space. The Jacobi method transform a symmetric matrix to tridiagonal shape and a
non-symmetric matrix to an upper Hessenberg15 matrix.
Definition 13.18 (Givens16 -Rotation) The matrix

1
0
0
0
0
0

..

.

 0
1
0
0
0
0

 0
0
cos(α)
0
0
−
sin(α)

 0
0
0
1
0
0


.
..
Drs (α) = 

 0
0
0
0
1
0

 0
0
sin(α)
0
0
cos(α)

 0
0
0
0
0
0



0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
..
0
.
1





















is identical to the identity matrix but in the r-th und s-th row and column. It rotates the plane Ers
with rotation angle α. Drs (α) is an orthogonal matrix.
14
Alston Scott Householder, US-american mathematician, 1904 (Rockford, Il. USA) - 1993 (Malibu, Ca. USA)
Gerhard Hessenberg, german mathematician and engineer, 1904 - 1959
16
Wallace Givens, US-american mathematician and computer scientist, 1910 (Alberene, US) - 1993
15
13 Numerical Solution of a System of Linear Equations
113
Method 13.19 (Jacobi17 , Givens) The Jacobi-Givens method aims to get the elements below
the secondary diagonal zero by successively conjugating A with Givens rotations.
A′ = Drs (α)−1 A Drs (α) = Drs (α)T A Drs (α) .
In every step the angle α and the rotating plane Ers has to be chosen so that a zero appears in a
wanted position. Using the abbreviations A = (aij ), Drs (α) = (dij ), Drs (α)T = (tij ) and c = cos(α),
s = sin(α) we calculate
n X
n
n X
n
X
X
aij′ =
tik akl dlj =
dki akl dlj .
k =1 l =1
Using

1




0




0



0
dij =
c





−s




s


c
k =1 l =1
i, j ∈
/ {r , s} ∧
i, j ∈
/ {r , s} ∧
i ∈ {r , s} ∧ j
i∈
/ {r , s} ∧ j
i =r ∧ j =r
i =r ∧ j =s
i =s ∧ j =r
i =s ∧ j =s
•
i, j ∈
/ {r , s}
:
aij′ = aij
:
•
i =r ∧ j =r
:
arj′
′
arr
•
i =r ∧ j =s
:
•
i =s ∧ j ∈
/ {r , s}
:
•
•
•
i =r ∧ j ∈
/ {r , s}
i =j
i 6= j
∈
/ {r , s}
∈ {r , s}























we get
(no change)
= drr arj + dsr arj = carj + sarj
= drr arr drr + drr ars dsr + dsr asr drr + dsr ass dsr
= c 2 arr + cs(ars + asr ) + s 2 ass
i =s ∧ j =r
:
i =s ∧ j =s
:
′ =d a d +d a d +d a d +d a d
ars
rr rr rs
rr rs ss
sr sr rs
sr ss ss
= cs(ass − arr ) + c 2 ars − s 2 asr
asj′ = drs arj + dss asj = −sarj + casj
′ =d a d +d a d +d a d +d a d
asr
rs rr rr
rs rs sr
ss sr rr
ss ss sr
= cs(ass − arr ) − s 2 ars + c 2 asr
′ = d a d +d a d +d a d +d a d
ass
rs rr rs
rs rs ss
ss sr rs
ss ss ss
= s 2 arr − sc(ars + asr ) + c 2 ass
′ = 0 below the secondary diagonal (p ≥ q +2) we may use the transformation
If we want to get apq
Dq+1,p (α). In the above formulas we have to choose (r = q + 1, s = p) and get
′
′
0 = apq
= as,r
−1 = −sar ,r −1 + cas,r −1 = −saq+1,q + cap,q
From tan(α) =
s
c
=
ap,q
aq+1,q
we conclude to have to choose α = arg(aq+1,q , ap,q ) as the rotation angle.
If we proceed column by column the elements made zero stay zero. So we get an upper Hessenberg
matrix in (n−2)(n−1)
steps.
2
Remark 13.20 The Jacobi algorithm transforms a symmetric matrix into a tridiagonal matrix.
Proof: The transformation conserves symmetry: (D T AD )T = D T AT D TT = D T AD .
⋄
There also exists a Householder transformation to transform a symmetric matrix into a tridiagonal matrix by conjugation with Householder reflections, compare [48]:
Method 13.21 (Householder) The Householder tridiagonalization transforms a symmetric matrix in a tridiagonal symmetric matrix by conjugating with a product of Householder reflections.
We demonstrate the idea of the algorithm on the first row of the matrix:
The first axis ê1 must belong to the reflection plane so that left multiplication does not change the
first row and right multiplication does not change the first column. Hence the first component of
the vector v must be zero.
17
Carl Gustav Jakob Jacobi, german mathematician, 1804-1851
114
III Numerical Methods in Linear Algebra
To ensure that the elements of the first column but the top two are zero the vector ~a1 = a11 ê1 +~b
n
X
ai1 êi must be mapped onto a vector a11 ê1 + k ê2 in the plane E12 of the same length
with ~b :=
i=2
ka11 ê1 + k ê2 k = k~a1 k
⇐⇒
2
a11
+ k2 =
As in 13.17 we set
n
X
i=1
2
ai1
⇐⇒
v
u n
uX
2
k =t
ai1
i=2
a11 ê1 + k ê2 − ~a1
k ê2 − ~b
~v · ~v T
=
and
S~v = E − 2
.
2
2
h~v , ~v i
Conjugation with this reflection yields the desired result.
~v =
Once the first row and column are done we go on with a partial matrix obtained by skipping the
first row and column and proceed in the same way as in 13.17. They are symmetric so conjugation
conserve symmetry by the argument of 13.20.
Reflections are orthogonal, so their product is orthogonal as well.
⋄
Applying this method to an non-symmetric matrix transforms it to an upper Hessenberg matrix.
13.E
Eigenvalues of a Matrix
Further literature: Saad [45]
13.E.1
Jacobi Algorithm
Method 13.22 (Jacobi) This algorithm rotates a coordinate plane to get the off-diagonal elements belonging to this plane zero. We use the matrices Drs from 13.D and choose α so that the
conjugation
A′ = Drs (α)−1 A Drs (α) = Drs (α)T A Drs (α)
′ zero. From the formulas in 13.19, case i = r ∧ j = r , we get for a symmetric
makes the element ars
matrix the equation
′
0 = ars
= cs(ass − arr ) + (c 2 − s 2 )asr .
Using t = tan(α) = s/c and dividing by −c 2 asr we get
ass − arr
t 2 − 2dt − 1 = 0
with
d=
.
2asr
p
From the solutions t1/2 = d ± d 2 + 1 we choose the t with smaller absolute value and achieve
1
t
und
s = tc = √
.
1 + t2
1 + t2
The product of all applied rotation matrices defines the transformation matrix to diagonal shape.
c=√
Unfortunately this process does not preserve the values of the components made zero. But when
always choosing the non-diagonal element of biggest absolute value an iterative process will approach
a diagonal matrix.
13.E.2
von Mises Algorithm
The symmetric matrix A admits an orthonormal basis {êi | i = 1, . . . , n}, the eigenvalues of
theseP
vectors are λi (i = 1, . . . , n) ordered with respect to their absolute value. For any vector
~x0 = ni=1 ξi êi ∈
/ ker A we successively may calculate
!
n
n X
X
λi k
k
k
k
~xk = A · ~xk −1 = A · ~x0 =
λi ξi êi = λ1 ξ1 ê1 +
ξi êi .
λ1
i=1
i=1
13 Numerical Solution of a System of Linear Equations
115
If λ1 has different absolute value from the other eigenvalues, the fractions
lim Ak ~x0 − λk1 ~x0 = ~0
λi
λ1
k
tend to zero so
k →∞
(13.8)
Method 13.23 (von Mises18 ) If all the eigenvalues of the symmetric matrix A ∈ Rnn are different the following algorithm calculates all eigenvalues and eigenvectors:
(a) Starting with a vector ~x0 ∈
/ ker A we successively calculate
~xk +1 =
A~xk
k A~xk k
k >0
until k ~xk +1 − ~xk k < n · R with an error bound R,
(b) ê := ~xk +1 and λ := hAê, ê i are the corresponding eigenvalue and eigenvector.
(c) Skip the eigenvalue λ; Replace A by A − λê · ê T (deflation).
(d) Start again, until n eigenvalues are found.
In a lot of situations one needs the smallest eigenvalue. The following idea using a spectral
shift generally allows to calculate for a given number the closest eigenvalue to that number and its
eigenvector:
Method 13.24 (Inverse Iteration, Wielandt19 -Iteration) For µ ∈ R and the eigenvalue λ
1
(with eigenvector ê) of the symmetric matrix A closest to µ the fraction
is the biggest
λ−µ
eigenvalue of the matrix (A − µ Id)−1 with the same eigenvector ê! So starting with a vector ~x0 and
successively
(a) solving (A − µ Id)~x = ~xk
(b) setting ~xk +1 =
we find the
1
λ−µ ,
~x
k~x k
from which it is easy to get the eigenvalue λ of A, and the eigenvector ê of A. ⋄
Working with non-symmetric matrices one uses the fact that A and AT have the same eigenvalues ([26, 24.2, Page 152]) and that knowledge on eigenvalues and eigenvectors may be taken from
the symmetric matrix AAT , see 14.E.
For iterative algorithms Wielandt developed a method to shift eigenvalues for non-symmetric
matrices extending the deflation used in 13.23, see [45]:
Theorem 13.25 (Wielandt-Deflation) Given a matrix A ∈ Rnn with spectrum
σ(A) = {λi , i = 1, . . . , n}
and corresponding eigenvectors
{êi , i = 1, . . . , n}
and an arbitrary vector ~v with hê1 , ~v i =
6 0. Then the matrix A − ê1 · ~v T has spectrum
σ(A − ê1 · ~v T ) = {λ1 − h~v , ê1 i , λ2 , . . . , λn } .
Proof:
(a) i = 1: (A − ê1 · ~v T )ê1 = Aê1 − ê1 (~v T ê1 ) = (λ1 − h~v , ê1 i) ê1
(b) i > 1: A and AT do have the same eigenvalues ([26, 24.2, Page 152]). If ĝi is an eigenvector
of AT corresponding to λi we get
(A − ê1 · ~v T )T ĝi = (AT − ~v · ê1T )ĝi = λi ĝi − ~v hê1 , ĝi i = λi ĝi .
18
19
Richard von Mises, austrian mathematician, 1883 (Lemberg, now Lviv/Ukraine) - 1953 (Boston/Mass.)
Helmut Wielandt, german mathematician, 1910 (Niedereggenen) - 2001 (Schliersee)
⋄
116
III Numerical Methods in Linear Algebra
To find a corresponding eigenvector of A − ê1 · ~v T one has to determine s from
(A − ê1 · ~v T )(êi − sê1 ) = λi (êi − sê1 ) :
The left hand side gets
λi êi − (sλ1 − h~v , êi i + s h~v , ê1 i) ê1 .
The bracket must be sλi , so s(λ1 − λi + h~v , ê1 i) = h~v , êi i and
h~v , êi i
.
λ1 − λi + h~v , ê1 i
To get a non-zero denominator one has to choose an appropriate vector ~v .
s=
14 Ausgleichsrechnung, Links- und Pseudoinverse
117
§ 14 Ausgleichsrechnung, Links- und Pseudoinverse
14.A
Problemstellung und Grundlagen
Problemstellung 14.1 (Ausgeglichene Lösung) Wir betrachten das lineare Gleichungssystem
A~x = ~b mit der Koeffizientenmatrix A ∈ Rmn , der rechten Seite ~b ∈ Rm und dem gesuchten Vektor
~x ∈ Rn . Existiert eine Lösung, so heißt diese exakt.
Als ausgeglichene Lösung bezeichnen wir einen Vektor x ∈ Rn mit der Eigenschaft
kA~x − ~bk2
ist minimal
(kleinste Fehlerquadrate).
(14.1)
Dieser ist eindeutig bestimmt, falls A keinen Rangdefekt hat. Existieren mehrere (ausgeglichene)
Lösungen, so wird auf eindeutige Weise eine dieser Lösungen durch die zusätzliche Forderung
k~x k2
ist minimal
(14.2)
ausgewählt.
Berechnungsmöglichkeiten für diese ausgeglichene Lösung werden vorgestellt.
Definition 14.2 (Rang und Rangdefekt eine Matrix) Die Anzahl der linear unabhängigen
Zeilen oder Spalten einer Matrix A ∈ Rmn heißt Rang r(A) der Matrix. Es gilt immer r(A) ≤
min(m, n). Bei Gleichheit hat die Matrix A vollen Rang, andernfalls besitzt sie einen Rangdefekt.
Für die algebraische Behandlung linearer Gleichungssystem sind die folgenden Aussagen wichtig,
die aus dem Isomorphiesatz für lineare Abbildungen (Rn / ker A ∼
= bil A) folgen:
Definition 14.3 (Bild und Kern einer Matrix) Für eine Matrix A ∈ Rmn ist die Abbildung
~v → A~v : Rn → Rm eine lineare Abbildung. Es werden definiert:
bil A := {A~v ∈ Rm | ~v ∈ Rn } heißt Bild von A.
ker A := {~v ∈ Rn | A~v = ~0} heißt Kern von A.
Satz 14.4 Bild A und Kern A sind Unterräume von Rm bzw. Rn . Für ihre Dimensionen gelten:
(a) dim bil A = dim bil AT = r(A)
(b) dim bil A + dim ker A = n
(c) dim bil AT + dim ker AT = m
Satz 14.5 (Lineare Gleichungssysteme, Kern und Bild) Für das lineare Gleichungssystem
A~x = ~b gelten:
(a) Es hat genau dann eine exakte Lösung, wenn ~b in Bild A liegt.
(b) Es besitzt für jeden Vektor ~b ∈ Rm genau dann (mindestens) eine Lösung, wenn der Rang
von A gleich m ist (r(A) = m).
(c) Die allgemeine (ausgeglichene) Lösung ist die Summe aus einer speziellen Lösung und einer
allgemeinen Lösung des homogenen linearen Gleichungssystems A~x = ~0. Die Lösungen des
homogenen linearen Gleichungssystems bilden genau den Kern von A.
Von zentraler Bedeutung für das weitere Vorgehen ist der folgende
Satz 14.6 (Kern und Bild der transponierten Matrix) Für A ∈ Rmn gelten:
(a) Rn = ker A ⊥ bil AT (orthogonale direkte Summe)
(b) Rm = ker AT ⊥ bil A
118
III Numerical Methods in Linear Algebra
Beweis: h , i bezeichne das Skalarprodukt. Für ~k ∈ ker A und AT w
~ ∈ bil AT gilt
D
~k , AT w
~
E
D
E
= A~k , w
~ =0.
Damit stehen ker A und bil AT orthogonal zu einander. Aufgrund von 14.4 ist
dim ker A + dim bil AT = n ,
womit a) nachgewiesen ist. b) folgt analog.
14.B
⋄
Algebraisch-geometrische Lösung
Der letzte Satz erlaubt eine Beschreibung und Berechnung der ausgeglichenen Lösung:
Satz 14.7 (Die ausgeglichene Lösung) Ist ~x
eine ausgeglichene Lösung des linearen Gleichungssystems A~x = ~b, so gelten:
(a) A~x ist die orthogonale Projektion von ~b auf
Bild A.
(b) A~x − ~b ∈ ker AT .
(c) AT A~x = AT ~b
Beweis:
(a) Die orthogonale Projektion (Lot fällen) liefert immer einen Punkt kürzesten Abstands.
(b) ker AT ist das orthogonale Komplement zu
Bild A nach 14.6
(c) AT A~x − AT ~b = AT (A~x − ~b) = ~0 nach
b).
⋄
Ist die Matrix AT A regulär, so kann sie invertiert
werden und eine ausgeglichene Lösung berechnet
werden:
Abb. 14.1: Lineare Abbildung ohne Rangdefekt
Satz 14.8 (Überbestimmte lineare Gleichungssysteme ohne Rangdefekt) Ist das lineare
Gleichungssystem A~x = ~b mit A ∈ Rmn überbestimmt (m > n) oder quadratisch (m = n) und hat
A vollen Rang r(A) = n, so gelten:
(a) ker A = {~0}
(b) AT A ∈ Rnn ist positiv definit und damit regulär.
(c) ~x = (AT A)−1 AT ~b ist die eindeutig bestimmte ausgeglichene Lösung.
Beweis:
(a) Nach 14.4 ist dim ker A = n − dim bil A = n − r(A) = n − n = 0.
(b) Für ~v 6= ~0 gilt : AT A~v , ~v = hA~v , A~v i = kA~v k2 > 0.
(c) folgt aus 14.7(c), die Eindeutigkeit aus (a).
⋄
Definition 14.9 (Die Linksinverse und die Rechtsinverse) Für eine Matrix A ∈ Rmn vollen
Ranges setzen wir:
(a) Für m ≥ n heißt die Matrix AL := (AT A)−1 AT ∈ Rnm Linksinverse von A. Sie erfüllt
AL A = Idn (Einheitsmatrix des Typs n,n).
(b) Für m ≤ n heißt die Matrix AR := AT (AAT )−1 ∈ Rnm Rechtsinverse von A. Sie erfüllt
AAR = Idm .
14 Ausgleichsrechnung, Links- und Pseudoinverse
119
Erwähnt sei, dass im Fall (b) AT eine Linksinverse hat und nach (a)
T
Idm = ((AAT )−1 A) · AT = A · AT (AAT )−1
und damit A · AT (AAT )−1 = Idm gilt.
AT A
⋄
Hat A einen Rangdefekt, so ist
nicht regulär und es existieren mehrere (ausgeglichene)
Lösungen! Gesucht ist nach Gl. 14.2 eine (ausgeglichene) Lösung kleinsten Betrags.
Satz 14.10 (Lineare Gleichungssysteme mit Rangdefekt) Die Koeffizientenmatrix A ∈ Rmn
des linearen Gleichungssystems A~x = ~b habe einen Rangdefekt. Mit r = r(A) = dim bil AT bestehe
die Matrix B = (~b1 , . . . , ~br ) ∈ Rnr spaltenweise aus den Basisvektoren von bil AT . Dann gelten:
(a) Die ausgeglichene Lösung kleinsten Betrags liegt in bil AT .
(b) AB ∈ Rmr hat vollen Rang und besitzt wegen m > r eine Linksinverse
−1
−1 T T
(AB)L = (AB)T (AB)
(AB)T = B T AT AB
B A ∈ Rrm .
(c) ~x = B(AB)L~b ist die ausgeglichene Lösung kleinsten Betrags.
Abb. 14.2: Lineare Abbildung mit Rangdefekt
Beweis:
(a) Für die orthogonale Zerlegung ~v = ~k + w
~ einer ausgeglichenen Lösung ~v ∈ Rn mit ~k ∈ ker A
T
und w
~ ∈ bil A gilt:
D
E D
E D
E D
E
k~v k2 = h~v , ~v i = ~k + w
~ , ~k + w
~ = ~k , ~k + ~k , w
~ + w
~ , ~k + h w
~, w
~i
k~k k2 + 0 + 0 + k~
w k2 .
Wegen ~b = A~v = A(~k + w
~ ) = A~k + A~
w = A~
w ist auch w
~ eine ausgeglichene Lösung.
~
~
Für k 6= 0 hat w
~ kleineren Betrag.
=
(b) Für ~v ∈ ker AB gelten
14.6
B~v ∈ bil B ∩ ker A = bil AT ∩ ker A = {~0}
und damit B~v = ~0. Wegen ker B = {~0} ist auch ~v = ~0.
(c) Wegen bil B = bil AT und (1) bleibt zu zeigen, dass ~x eine ausgeglichene Lösung ist. Hierzu
genügt nach 14.7(b) zu zeigen, dass A~x − ~b ∈ ker AT gilt:
AT A~x − AT ~b = AT AB(AB)L~b − AT ~b
14.11(a)
=
AT ~b − AT ~b = ~0 .
⋄
Die letzte Gleichheit wird im folgenden Hilfssatz bewiesen, dessen Beweis die zweite Aussage
des Satzes benutzt.
120
III Numerical Methods in Linear Algebra
Hilfssatz 14.11 Mit den Bezeichnungen von 14.10 gelten:
(a) AT AB(AB)L = AT
T
(c) B(AB)L AT A = A
Beweis:
(b) B(AB)L AAT = AT
T
(d) AAT B(AB)L
= A
(a) Sei ~v = ~k + w
~ die orthogonale Zerlegung von ~v ∈ Rm mit ~k ∈ ker AT und w
~ ∈ bil A. Dann
existiert, da AB vollen Rang hat, ein ~u ∈ Rr mit AB~u = w
~ und es folgen mit der Definition
der Linksinversen
AT AB(AB)L~v = AT AB(AB)L~k + AT AB(AB)L w
~
−1 T T
−1
= AT AB B T AT AB
B T AT ~k + AT AB B T AT AB
B A AB~u
−1
= ~0 + AT AB B T AT AB
B T AT AB ~u = AT AB~u
und
AT ~v
= AT ~k + AT w
~ = ~0 + AT AB~u = AT AB~u .
(b) Wählen wir ~v ∈ Rm , so liegt AT ~v in bil AT = bil B und es gibt ein w
~ ∈ Rr mit B w
~ = AT ~v .
Es folgt:
−1 T T
B(AB)L AAT ~v = B(AB)L AB w
~ = B B T AT AB
B A AB w
~ = Bw
~ = AT v .
T
T
= B(AB)L AT A.
(c) Aus a) folgt A = ATT = AT AB(AB)L
T
T
(d) Aus b) folgt A = ATT = B(AB)L AAT
= AAT B(AB)L .
⋄
Definition und Satz 14.12 (Die Pseudoinverse) Mit B ∈ Rnr nach 14.10 definieren wir die
Pseudoinverse à von A ∈ Rmn durch
−1 T T
à := B(AB)L = B B T AT AB
B A ∈ Rmn .
Es gelten:
(a) AÃA = A
(b) ÃAÃ = Ã
(c) AÃ ist symmetrisch
(d) ÃA ist symmetrisch
Diese Eigenschaften legen die Pseudoinverse eindeutig fest.
Beweis:
(a) Gleichheit muss lediglich für ~v ∈ bil AT = bil B nachgewiesen werden, also für ~v = B~u mit
~u ∈ Rr :
AÃA~v = AB(B T AT AB)−1 B T AT AB~u = AB~u = A~v .
(b) ÃAÃ = B(AB)L AB(AB)L = BE (AB)L = B(AB)L = Ã
(c) AÃ = AB(B T AT AB)−1 B T AT ist symmetrisch.
(d) Entsprechend der orthogonalen Summe Rn = ker A ⊥ bil AT wird der Vektor ~v = ~k + AT ~u
mit ~k ∈ ker A und ~u ∈ Rm zerlegt. Es gelten:
D
E
D
E
=
ÃA(k~1 + AT u~1 ), v~2
ÃAv~1 , v~2
=
ÃAAT u~1 , k~2 + AT u~2
E
D
E
D
14.11(b)
~ A(k~2 + AT u2)
~
=
AT u~1 , k~2 + AT u~2
=
u1,
=
u~1 , AAT u~2
= DAT u~1 , AT u~2
und
D
E
E
T
T
T
~
~
v~1 , ÃAv~2
=
v~1 , ÃA(k2 + A u~2 )
=
k1 + A u~1 , ÃAA u~2
D
E
D
E
14.11(b)
=
k~1 + AT u~1 , AT u~2
=
A(k~1 + AT u~1 ), u~2
= AT u~1 , AT u~2 .
=
AAT u~1 , u~2
Damit ist ÃA symmetrisch.
14 Ausgleichsrechnung, Links- und Pseudoinverse
121
Die Eindeutigkeit wird nach [12, Lemma 1.5.1] bewiesen: Zu A ∈ Rmn sei A+ ∈ Rnm eine weitere
Matrix mit den Eigenschaften a) - d). Es gelten:
(b)
(a)
ÃAÃ = Ã(AÃ)T = ÃÃT AT = ÃÃT AT A+T AT
T
T (c)
T
(b)
(b)
(d)
= Ã AÃ
AA+
= ÃAÃAA+ = ÃAA+ = ÃAA+ AA+ = ÃAT A+ A A+
T
(a)
(d)
(b)
= AT ÃT AT A+T A+ = AT A+T A+ = A+ A A+ = A+ AA+ = A+
⋄
20
21
Die Pseudoinverse wurde unabhängig von Moore [32] und Penrose [38, 39] eingeführt.
Ã
=
Satz 14.13 (Weitere Eigenschaften) Für die Pseudoinverse à ∈ Rmn von A ∈ Rmn gelten:
˜ =A
fT
(b) ÃT = A
(a) Ã
(c) AÃ ist symmetrische Projektion auf bil A.
(d) ÃA ist symmetrische Projektion auf bil AT .
(e) ÃAAT = AT AÃ = AT
(f ) AAT ÃT = ÃT AT A = A
Beweis:
(a), (b): A bzw. ÃT erfüllen alle vier aus 14.12, die die Pseudoinverse von à bzw. AT eindeutig
festlegen.
(c), (d): Die Symmetrie steht in 14.12(c) und (d), die Projektion folgt aus (a), (b):
(AÃ)2 = AÃAÃ = AÃ
und
(ÃA)2 = ÃAÃA = ÃA .
⋄
(e) und (f) sind aus 14.11 übernommen.
−1 T
−1
Die Linksinverse AL = AT A
A und die Rechtsinverse AR = AT AAT
von A erfüllen,
falls sie existieren, die Eigenschaften 14.12(a) - (d) Sie sind damit auch die Pseudoinverse von A.
Ist A invertierbar, so ist A−1 ebenfalls die Pseudoinverse von A.
Bemerkung 14.14 (Vollrangzerlegung und Pseudoinverse [12]) Hat die Matrix A ∈ Rmn
den Rang r, so heißt eine multiplikative Zerlegung A = BC mit B ∈ Rmr und C ∈ Rrn eine
Vollrangzerlegung von A. In diesem Fall haben alle Matrizen A, B und C den Rang r. B besitzt
eine Linksinverse B L und C eine Rechtsinverse C R . C R B L erfüllt alle Eigenschaften nach 14.12(a)(d), daher ist dieses Produkt die Pseudoinverse à = C R B L von A.
Werden die LR- und QR-Zerlegung einer Matrix des Ranges r mit Spaltentausch durchgeführt,
so sind alle Koeffizienten des R-Faktors ab der Zeile r+1 null. Man rechnet leicht nach, dass in
diesem Fall A das Produkt der ersten r Spalten des L- oder Q-Faktors und der ersten r Zeilen des
R-Faktors ist. Die Permutationsmatrizen für Zeilen- und Spaltentausch werden hierbei den beiden
Faktoren zugeschlagen. Auf diese Weise erhält man also Vollrangzerlegungen der Matrix A. Der
Q-Faktor ist ursprünglich orthogonal. Die Linksinverse der um einige Spalten verkleinerten Matrix
erhält man auch in diesem Fall durch Transponieren.
14.C
Analytische Lösung
Wir suchen die Minima nach den Regeln der Analysis: An der Minimalstelle einer reellwertigen
Funktion in mehreren Argumenten ist ihr Gradient, ein Zeilenvektor, ~0 T .
Satz 14.15 (Ableitungen des Skalarprodukts und der Norm) Für ~f , ~g : Rn → Rm gelten
mit den totalen Ableitungen (Fundamentalmatrizen) f ′ (~x ) = (fi,j (~x )) und g ′ (~x ) = (gi,j (~x )) aus
Rmn
D
E
D
E′
−−→
~f , ~g
(a) grad ~f (~x ), ~g (~x ) = ~g (~x )T ·f ′ (~x ) + ~f (~x )T ·g ′ (~x ) oder kurz
= ~g T ·f ′ + ~f T ·g ′
20
21
Eliakim Hastings Moore, US-am. Mathematiker, 1862-1932
Roger Penrose, engl. theor. Physiker, geb. 1931
122
III Numerical Methods in Linear Algebra
−−→
(b) grad k ~f (~x ) k2 = 2·~f (~x )T ·f ′ (~x )
Für ~f (~x ) = A~x : Rn → Rm mit A ∈ Rmn und ~b ∈ Rm gelten:
(c) f ′ (~x ) = A
T
−−→
(d) grad k A~x − ~b k2 = 2·(A~x − ~b)T ·A = 2· AT (A~x − ~b)
~x
−−→
(e) grad k A~x k =
T AT A
kA~x k
Beweis:
D
E
−−→ ~
−−→
grad f (~x ), ~g (~x )
= grad
(a)
!
fi (~x )gi (~x )
i=1
m
X
=
m
X
!
fi,j (~x )gi (~x ) + fi (~x )gi,j (~x )
i=1
j =1,...,n
= ~g (~x ) · f (~x ) + ~f (~x ) · g (~x )
T
′
′
T
D
E
−−→ ~
−−→
grad k f (~x ) k 2 = grad ~f (~x ), ~f (~x ) = 2·~f (~x )T ·f ′ (~x )
!
n
n
X
X
fi,j (~x ) =
aik ·xk
=
( aik ·xk ),j = aij
(b)
(c)
k =1
,j
k =1
(d) folgt offensichtlich aus (b) und (c).
(e) Ein Vergleich von
(d)
−−→
grad kA~x k2 = 2·(A~x )T ·A = 2~x
T
AT A
mit
−−→
−−→
grad kA~x k2 = (kA~x k2 )′ = 2kA~x k · grad kA~x k
liefert das Ergebnis.
⋄
Mit der Aussage (d) kann die Lösung des Ausgleichsproblems sofort charakterisiert werden:
Satz 14.16 (Lösung des Ausgleichsproblems) ~x ∈ Rn löst das Ausgleichsproblem A~x = ~b mit
A ∈ Rmn und ~b ∈ Rm genau dann, wenn AT A~x = AT ~b. Ist AT A invertierbar, so löst ~x =
(AT A)−1 AT ~b das Ausgleichsproblem eindeutig. Dies ist für eine Matrix A vollen Ranges nach 14.8
der Fall.
Hat A ∈ Rmn nicht vollen Rang, so besteht die Aufgabe der Ausgleichsrechnung im Finden
derjenigen Lösung ~x ∈ Rn , für die zusätzlich k~x k2 minimal wird. Wir betrachten jetzt den Fall
m ≥ n. Der andere Fall wird über die Transponierte gelöst [22, 39] :
Satz 14.17 (Regularisierungsverfahren)
(a) Für A ∈ Rmn und a ∈ R+ ist AT A + a · Id positiv definit.
(b) kA~x − ~bk2 + ak~x k2 ist genau für (AT A + a · Id)~x = AT ~b minimal.
(c) Es gilt à = lim (AT A + a · Id)−1 · AT
a→0
14 Ausgleichsrechnung, Links- und Pseudoinverse
123
Beweis:
(a) Für ~v ∈ Rn\{0} gilt:
T
(A A + a · Id)~v , ~v
= AT A~v , ~v + ha~v , ~v i
= hA~v , A~v i + a h~v , ~v i = kA~v k2 + ak~v k2 ≥ ak~v k2 > 0
(b) Nach 14.15 gilt: kA~x − ~bk2 + ak~x k2 ist minimal, genau dann wenn
−→
~0 T = −
grad kA~x − ~bk2 + ak~x k2 = 2(A~x − ~b )T ·A + 2a~x T
= 2 ~x T AT A + a · Id − ~b T A
gilt. Transponieren dieser Gleichung liefert die Aussage.
−1
(c) Der Vektor ~x (a) := AT A + a · Id AT ~b, der wegen a) für jedes a > 0 berechnet werden
kann, minimiert wegen b) kA~x − ~bk2 + ak~x k2 .
~x = lim ~x (a) = lim (AT A + a · Id)−1 · AT ~b
a→0
a→0
minimiert wegen a → 0 den quadrierten Betrag kA~x − ~bk2 . ~x ist der Vektor kleinsten
Betrags mit dieser Eigenschaft, da ~x (a) den Ausdruck kA~x − ~bk2 + ak~x k2 minimiert.
Eine weitere Berechnungsvariante benutzt die Eigenwerte und Eigenvektoren der symmetrischen
Matrizen AT A und AAT . Daher beschäftigen wir uns zunächst mit den Eigenvektoren symmetrischer Matrizen.
14.D
Hauptachsen symmetrischer Matrizen
Symmetrische Matrizen besitzen genügend Eigenvektoren, es gibt eine Basis des zugrunde liegenden
Vektorraums, die nur Eigenvektoren enthält und die zusätzlich paarweise orthogonal zueinander
stehen. Dies wird im Weiteren hergeleitet. Zunächst weisen wir die Existenz von Eigenwerten und
Eigenvektoren nach:
Satz 14.18 (Existenz von Eigenwerten symmetrischer Matrizen)
trisch und K = {~v ∈ Rn | k~v k = 1} die Einheitskugel in Rn . Dann gelten
A ∈ Rnn sei symme-
(a) Ist hA~
w, w
~ i ein Minimum oder Maximum in {hA~v , ~v i |~v ∈ K }, so ist hA~
w, w
~ i ein Eigenwert
zum Eigenvektor w
~.
(b) Ist kA~
w k ein Minimum oder Maximum in {kA~v k|~v ∈ K }, so ist kA~
w k oder −kA~
w k ein
Eigenwert. Ist w
~ nicht Eigenvektor zu diesem Eigenwert, so gibt es einen Vektor ~u ∈ K mit
folgenden Eigenschaften:
(b1) ~u ⊥ w
~ ,
(b2) ~u und w
~ spannen eine Ebene E auf, die invariant unter A ist (A(E ) ≤ E ),
(b3) A|E ist eine Drehung gefolgt von einer Spiegelung an der Winkelhalbierenden zwischen
w
~ und ~u ,
(b4) Die Ebene E enthält einen Eigenvektor zum Eigenwert kA~
w k und einen Eigenvektor zum
Eigenwert −kA~
w k.
Dieser Satz hat eine große Bedeutung für in der Mechanik auftretende symmetrische Matrizen.
Ist A zum Beispiel eine Spannungsmatrix (Spannungstensor), so ist hA~v , ~v i die in Richtung ~v auftretende Normalspannung und kA~v k der Betrag der in dieser Richtung auftretenden Spannung. Die
betragsmäßig größte Normalspannung und die größte Spannung liefern denselben Eigenwert und
sind damit gleich. Die Richtung maximaler/minimaler Normalspannung ist also auch die Richtung
maximaler/minimaler Spannung. In diesen Richtungen treten demnach keine Schubspannungen
auf. Diese Hauptrichtungen sind die Richtungen der Eigenvektoren des Spannungstensors, seine
Eigenwerte die Hauptspannungen. Richtungen maximaler/minimaler Spannung (Betrag des Spannungsvektors) können Richtungen maximaler Normalspannung sein. Sind sie es nicht, so gibt es
eine Spannungsebene mit einer Druck- und einer Zugspannung gleichen Betrags.
124
III Numerical Methods in Linear Algebra
Beweis:
(a) Wir suchen die Nullstellen des Gradienten der Funktion
hA~v , ~v i
f (~v ) :=
: Rn → R
k~v k2
und berechnen mit 14.15:
−−→
−−→
(grad hA~v , ~v i)k~v k2 − hA~v , ~v i · grad k~v k2
−→
~0 T = −
grad f (~v ) =
k~v k4
(~v T A + (A~v )T )k~v k2 − hA~v , ~v i · 2 · ~v T
=
k~v k4
T
2(A~v − (hA~v , ~v i /k~v k2 )~v )
=
k~v k2
⇐⇒
A~v = (hA~v , ~v i /k~v k2 ) · ~v .
w := ~v /k~v k erfüllt diese Gleichung ebenfalls, wegen k~
w k = 1 ist a) hiermit gezeigt.
vk
n
(b) Wir suchen die Nullstellen des Gradienten der Funktion g(~v ) := kA~
k~v k : R → R und berechnen
mit 14.15 und
−−→
−−→
(grad kA~v k)k~v k − kA~v k · grad k~v k
−−→
~0 T
=
grad g(~v ) =
k~v k2
2
~v T A2 k~v k
T A2 − kA~v k
~
vT
~v T
~
v
− kA~v k · k~v k
k~v k
14.15(e)
kA~v k
=
=
k~v k2
kA~v k · k~v k
2
kA~v k
⇐⇒ A2~v =
·~v
(Transponieren der Gleichung, A symmetrisch)
k~v k
Der normierte Vektor w
~ :=
A2 w
~ = kA~
w k2 · w
~ .
~
v
k~v k
erfüllt diese Gleichung ebenfalls, wegen k~
w k = 1 gilt
(14.3)
Ist jetzt w
~ nicht Eigenvektor zu A, so definieren wir die Ebene E als von w
~ und A~
w aufgespannten Unterraum und ~u als normiertes, orthogonales Komplement von w
~ in E . Es gibt
reelle α und β, mit der Eigenschaft 14.19
A~
w = α~
w + β~u .
(14.4)
Mit µ := kA~
w k liefert der Satz des Pythagoras
µ2 = α2 + β 2
(14.5)
Es folgt mit Gl. 14.3 und 14.4
µ2 · w
~ = A2 w
~ = A(α~
w + β~u ) = αA~
w + βA~u
2
2
also
2
βA~u = µ w
~ − α(α~
w + β~u ) = (µ − α )~
w − αβ~u
und mit Gl. 14.5 für das Bild von ~u schließlich
A~u = β w
~ − α~u
(14.6)
Damit sind (b1) und (b2) nachgewiesen. Zum Beweis von (b3) schreiben wir A|E als Matrix
bezogen auf die Basis {~
w , ~u }:
α β
0 1
β −α
A=
=
·
.
β −α
1 0
α β
Zum Nachweis von (b4) zeigen wir mit den Gl. 14.4 - 14.6, dass
(b1) (α − µ)~u − β w
~ ein Eigenvektor zum Eigenwert µ und
(b2) (α − µ)~
w + β~u ein Eigenvektor zum Eigenwert −µ ist:
~ ) = (α − µ)A~u − βA~
w = (α − µ)(β w
~ − α~u ) − β(α~
w + β~u )
(a): A((α − µ)~u − β w
2
= ((α − µ)β − αβ)~
w − ((α − µ)α + β )~u
= −µβ w
~ − (α2 − µα + β 2 )~u = −µβ w
~ − (µ2 − µα)~u
= µ((α − µ)~u − β w
~)
14 Ausgleichsrechnung, Links- und Pseudoinverse
125
w + β~u ) = (α − µ)A~
w + βA~u = (α − µ)(α~
w + β~u ) + β(β w
~ − α~u )
(b): A((α − µ)~
2
= ((α − µ)α + β )~
w + ((α − µ)β − αβ)~u
= (α2 − µα + β 2 )~
w − µβ~u = (µ2 − µα)~
w − µβ~u
= −µ((α − µ)~
w + β~u )
⋄
Hilfssatz 14.19 A ∈ Rnn sei symmetrisch.
(a) Eigenvektoren zu verschiedenen Eigenwerten von A stehen senkrecht zueinander.
(b) Ist ~v ∈ Rn ein Eigenvektor von A, so ist das orthogonale Komplement
~v ⊥ = {~
w ∈ Rn | h~v , w
~ i = 0}
ein A-invarianter Unterraum von Rn , d.h.: A~v ⊥ ≤ ~v ⊥ .
Beweis:
(a) Für Eigenvektoren ~v1 und ~v2 zu verschiedenen Eigenwerten λ1 und λ2 gilt
λ1 h~v1 , ~v2 i = hλ1~v1 , ~v2 i = hA~v1 , ~v2 i = h~v1 , A~v2 i = h~v1 , λ2~v2 i = λ2 h~v1 , ~v2 i .
Also folgt 0 = (λ1 − λ2 ) h~v1 , ~v2 i und aus λ1 6= λ2 folgt h~v1 , ~v2 i = 0 .
(b) Für A~v = α~v und w
~ ∈ ~v ⊥ gilt
hA~
w , ~v i = h w
~ , A~v i = h w
~ , α~v i = α h w
~ , ~v i = 0 .
Damit liegt A~
w in ~v ⊥ .
Mit Hilfe dieser Aussagen wird ein wichtiger Satz für symmetrische Matrizen bewiesen:
⋄
Satz 14.20 (Diagonalisierbarkeit symmetrischer Matrizen) A ∈ Rnn sei symmetrisch.
(a) Rn besitzt eine Orthonormalbasis {ê1 , . . . , ên } aus Eigenvektoren von A.
(b) Bezüglich dieser Basis hat A Diagonalgestalt. Diese Diagonalmatrix wird berechnet durch
O TAO , wobei O = (ê1 , . . . , ên ) diejenige Orthogonalmatrix ist, die spaltenweise aus den Eigenvektoren der Basis besteht.
n
P
(c) A besitzt die Singulärwertzerlegung A =
λi êi · êiT . Hierbei ist êi · êiT das Matrizenprodukt
i=1
des Spaltenvektors e~i mit dem Zeilenvektor êiT und stimmt mit dem dyadische Produkt eˆi ⊗ eˆi
der Tensorrechnung überein.
Beweis:
(a) Nach 14.18 besitzt A einen Eigenwert α mit zugehörigem Eigenvektor ~v und das orthogonale
Komplement ~v ⊥ ist nach 14.19 A-invariant. Führen wir den Beweis als Induktionsbeweis
nach n aus, so besitzt ~v ⊥ eine Orthonormalbasis {ê2 , . . . , ên }, die um ê1 := ~v/k~v k zu einer
Orthonormalbasis von Rn ergänzt wird.
(b) Wegen (O T O )ij = êi · êj = δij ist O T O = Id und O orthogonal. Mit den Eigenwerten
λi zu den Eigenvektoren êi gilt Aêi = λi êi . A hat also bezogen auf die Basis {ê1 , . . . , ên }
Diagonalgestalt:
k̂i (i = 1, . . . , n) bezeichne die kanonischen Basisvektoren, nur die i-te Komponente ist 1, die
anderen sind 0. Offensichtlich gilt O k̂i = ~ki und wegen O −1 = O T folgt
~
O T AO k̂i = O T A~ei = OT λi ~ei = λi O T ~ei = λi k̂i .
(c) Die Diagonalmatrix
D , deren Diagonale aus den Eigenwerten λ1 , . . . , λn besteht, kann in der
P
Form D = i λi k̂i · k̂iT geschrieben
werden. Dies wird durch Nachrechnen von D k̂i = λi k̂i
P
T
verifiziert. Ferner gilt O = i êi · êi und es folgt aus b)
!
n
n
X
X
T
T
A = ODO
= O·
λi k̂i · k̂i
· OT =
λi O · k̂i · k̂iT · O T
i=1
=
n
X
i=1
i=1
n
T
X
λi O · k̂i · O · k̂i
=
λi êi · êiT
i=1
⋄
126
III Numerical Methods in Linear Algebra
14.E
Singulärwertzerlegung einer Matrix
Symmetrische Matrizen können bezüglich ihrer Eigenwerte zerlegt werden. Einen vergleichbaren
Satz für eine beliebige Matrix erhält man über die Singulärwertzerlegungender symmetrischen Matrizen AT A und AAT .
Satz 14.21 Für eine Matrix A ∈ Rmn gelten:
(a) AT A ∈ Rnn und AAT ∈ Rmm sind semidefinit:
∀~v ∈ Rn : AT A~v , ~v ≥ 0 ∧ ∀~
w ∈ Rm : AAT w
~, w
~ ≥0.
(b) Ist λ ein positiver Eigenwert von AT A zum Eigenvektor ~v , so ist A~v ein Eigenvektor von
AAT zum selben Eigenwert λ. Ist µ ein positiver Eigenwert von AAT zum Eigenvektor w
~ , so
T
T
~ ein Eigenvektor von A A zum selben Eigenwert µ.
ist A w
AT A und AAT haben damit dieselben positiven und keine negativen Eigenwerte.
Beweis:
(a) Da AT A und AAT symmetrisch sind, gelten
T
A
A~
v
,
~
v
= hA~
v , A~v i
= kA~v k2
≥ 0
T
T
T
T
2
AA w
~, w
~
= A w
~, A w
~
= kA w
~k ≥ 0.
(AAT )A~v
(AT A)AT w
~
(b)
= A(AT A~v )
= Aλ~v
T
T
= A (AA w
~ ) = AT µ~v
und
= λA~v
und
T
= µA ~v .
⋄
Satz 14.22 (Singulärwertzerlegung einer Matrix und ihrer Pseudoinversen)
Für eine
mn
n
Matrix A ∈ R des Ranges r sei {v̂1 , . . . , v̂n } eine Orthonormalbasis des Raumes R aus Eigenvektoren von AT A zu den positiven Eigenwerten λ1 , . . . , λr und den Eigenwerten λr +1 = . . . = λn = 0.
Av̂i
Für i ≤ r setzen wir ŵi := kAv̂
. Nach 14.21 sind dies Eigenvektoren von AAT zu den Eigenwerten
ik
λi und stehen paarweise senkrecht zueinander. Sie können zu einer Basis {ŵ1 , . . . , ŵm } von Rm
ergänzt werden. Es gelten:
p
(a)
Av̂i = λi ŵi
für
i ≤r .
p
(b)
AT ŵi = λi v̂i
für
i ≤r .
r
Xp
(c)
A=
λi ŵi ·v̂iT
(Singulärwertzerlegung von A)
i=1
r p
X
AT =
(d)
(e)
à =
i=1
r
X
i=1
λi v̂i · ŵiT
(Singulärwertzerlegung von AT )
1
√ v̂i · ŵiT
λi
(Singulärwertzerlegung der Pseudoinversen)
Beweis:
(a) Wegen Av̂i = kAv̂i kŵi genügt es, kAv̂i k zu berechnen:
kAv̂i k2 = hAv̂i , Av̂i i = AT Av̂i , v̂i = hλi v̂i , v̂i i = λi kv̂i k2 .
√
(a)
(b) folgt aus λi AT ŵi = AT Av̂i = λi v̂i .
!
r p
r p
X
X
p
T
(c)
j ≤r :
λi ŵi · v̂i
v̂j =
λi ŵi · v̂iT · v̂j = λj ŵj = Av̂j
j >r :
i=1
r p
X
i=1
λi ŵi · v̂iT
!
i=1
v̂j = ~0 = Av̂j
Also stimmen beide Seiten auf einer Basis des Rn überein und sind damit gleich.
(d) wird analog zu (c) bewiesen.
14 Ausgleichsrechnung, Links- und Pseudoinverse
127
(e) Die rechte Seite erfüllt 14.12(a)-(d) und ist damit die Pseudoinverse Ã.
⋄
Zusatz 14.23 (Singulärwertzerlegung in Matrixform) Für eine Matrix A ∈ Rmn des Ranges
r sei V = (v̂1 , . . . , v̂n ) ∈ Rnn die Hauptachsentransformationsmatrix zu AT A und den positiven
Eigenwerten λ1 , . . . , λr und den Eigenwerten λr +1 = . . . = λn = 0 und W = (ŵ1 , . . . , ŵm ) ∈
Rmm die Hauptachsentransformationsmatrix zu AAT mit den positiven Eigenwerten λ1 , . . . , λr und
den Eigenwerten λr +1 = . . . = λm = 0. Ferner seien S , S ∗ ∈ Rmn die Diagonalmatrizen22 ,
deren Diagonalen aus den Wurzeln der positiven Eigenwerten λ1 , . . . , λr bzw. deren Kehrwerten
der positiven Eigenwerte und aus Nullen bestehen. Es gelten:
(a)
A = WSV T
(b)
à = VS ∗ W T
(Singulärwertzerlegung einer Matrix)
(Singulärwertzerlegung der Pseudoinversen)
⋄
Satz 14.24 (Polarzerlegung einer quadratischen Matrix) Eine quadratische Matrix A ∈ Rnn
kann in ein Produkt einer orthogonalen und einer symmetrischen Matrix zerlegt werden. Mit den
Bezeichnungen aus 14.22 und r = r(A) gilt:
!
!
n p
n
n p
X
X
X
T
T
T
λi ŵi · v̂i =
ŵi · v̂i
λi v̂i · v̂i
A=
·
i=1
i=1
Beweis:
r
X
i=1
ŵi · v̂iT
!
·
r p
X
i=1
i=1
λi v̂i ·
v̂iT
!
=
Der erste Faktor ist orthogonal:
!
!T
r
r
X
X
T
T
ŵi · v̂i
·
ŵi · v̂i
=
=
i=1
r X
r
X
i=1 j =1
i=1
ŵi ·
v̂iT
· v~j · w~j
T
=
r X
r
X
i=1 j =1
r X
r
X
i=1 j =1
r
X
i=1
ŵi ·
ŵi · v̂iT
v̂iT
!
·
ŵi · δij · w~j T =
·
p
λj v̂j ·
r
X
i=1
r
X
i=1
v̂i ·
v̂jT
ŵiT
=
r p
X
i=1
λi ŵi · v̂iT = A
!
ŵi · ŵiT = Id
Die letzte Summe wirkt identisch auf jedem Basisvektor w~1 , . . . , w~n , sie ist damit gleich der Einheitsmatrix. Der zweite Faktor ist offensichtlich symmetrisch.
⋄
Ist A regulär, so ist der symmetrische Faktor die eindeutig existierende, symmetrische Wurzel
W von AT A. Direktes Rechnen zeigt, dass dann AW −1 orthogonal ist:
T
AW −1 AW −1 = AW −1 W −1T AT = AW −2 AT = A(AT A)−1 AT = AA−1 AT −1 AT = Id
Dieser Satz findet seine Anwendung in der Technischen Mechanik. Für isotropes Material ist die Deformationsmatrix (oder Deformationsgradient), also die Ableitung der Verschiebung eines Punktes
nach der Ausgangslage, das Produkt aus einer Drehmatrix, die die Starrkörperrotation beschreibt,
und der symmetrischen Verzerrungsmatrix, die über das Materialgesetz mit der symmetrischen
Spannungsmatrix verbunden ist.
14.F
Ausgleichen von Messreihen
Die Ergebnisse der ersten Paragrafen werden zur Lösung der linearen Ausgleichsrechnung durch
Funktionen herangezogen.
Problemstellung 14.25 (Anpassen einer Funktion an eine Messreihe) Zu einer Messreihe {(xi , yi )|i = 1, . . . , m} und n linear unabhängigen Funktionen f1 , . . . , fn sollen Koeffizienten
a1 , . . . , an gefunden werden, für die die Funktion
f (x ) = a1 · f1 (x ) + . . . + an · fn (x )
22
nur auf den Diagonalen stehen von Null verschiedene Elemente
128
III Numerical Methods in Linear Algebra
die Messreihe am besten im Sinne der quadratischen Fehlerminimierung annähert. Präziser formuliert werden Koeffizienten a1 , . . . , an gesucht, für die
2
m
m X
n
X
X
2
|f (xi ) − yi | =
aj · fj (xi ) − yi minimal wird.
i=1
i=1 j =1
Verfahren 14.26 (Ausgegliche Lösung) Jede Messung liefert eine Gleichung für die gesuchten
Koeffizienten:
yi = a1 · f1 (xi ) + . . . + an · fn (xi ).
Mehr Messungen als unbekannte Koeffizienten (m > n) führen auf ein überbestimmtes lineares
Gleichungssystem A~a = ~y mit
a1


 .. 
~a =  . ;

A = (fj (xi )) i=1,...,m
j =1,...,n


an


~y = 



y1
..
.
ym





Nach 14.8 ist ~a = (AT A)−1 AT ~y die eindeutig bestimmte ausgeglichene Lösung dieses Gleichungssystems, die kA~a − ~y k2 minimiert. Wegen A~a = (fj (xi )) · (a1 , . . . , an )T folgt
2
2
n
m X
n
X
X
2
kA~a − ~y k = (
aj · fj (xi ))i=1,...,m − ~y =
aj · fj (xi ) − yi .
j =1
i=1 j =1
Damit löst die ausgeglichene Lösung ~a des linearen Gleichungssystems (fj (xi )) i=1,...,m · ~a = ~y die
j =1,...,n
gestellte Aufgabe. Die Funktion
f (x ) = a1 · f1 (x ) + . . . + an · fn (x )
nähert die Messwerte innerhalb der gewählten Funktionenklasse am besten an.
Im Falle m=n liefert dieses Verfahren die exakte Lösung.
⋄
Die wichtigsten Ansätze der Ausgleichsrechnung werden vorgestellt.:
Beispiel 14.27 (Polynom-Ansatz) Als wichtigstes Beispiel betrachten wir das Angleichen der
Messwerte durch ein Polynom vorgegebenen Grades. Mit fj (x ) = x j −1 (j = 1, . . . , n) erhalten wir
als Koeffizientenmatrix


1 x1 x12 · · · x1n−1


 1 x
x22 · · · x2n−1 
2




A=. .
.
.

.
.
.
.
.
.
 .

. .
.
.

1 xm
2
xm

n−1
· · · xm
Behauptung: A hat bei n verschiedenen Messstellen vollen Rang:
Hierzu nehmen wir an, dass die ersten n Zeilen zu verschiedenen Messstellen gehören und zeigen, dass diese Zeilen linear unabhängig sind. Im ersten Schritt subtrahieren wir das x1 -fache der
Vorgängerspalte von jeder Spalte, ziehen die Faktoren (xi − x1 ) vor die Determinate, wenden den
Kastensatz an und wiederholen diesen Prozess mehrfach:
n−1 2
1 x
1 0
0
··· 0
1 x1 · · · x1
n−1
n−2
n−1
2
2
1 x
− x1 x2
2 x2 · · · x2
1 x2 − x1 x2 − x1 x2 · · · x2
= .
.
.
.
.
.
.
..
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
. .
.
.
.
.
=
=
1 xn
x2 − x1
..
.
xn2 · · · xnn−1
x22 − x1 x2
..
.
xn − x1 xn2 − x1 xn
n
Y
···
..
.
···
x2
..
.
x22
..
.
1 xn
xn2
1
(xi − x1 ) · ...
i=2
1 xn − x1 xn2 − x1 xn
x2n−1 − x1 x2n−2
..
.
n−1
n−2
xn − x1 xn
· · · x2n−2 . . ..
. .
n−2
· · · xn
· · · xnn−1 − x1 xnn−2
14 Ausgleichsrechnung, Links- und Pseudoinverse
=
n
Y
(xi − x1 ) ·
i=2
n
Y
n
Y
(xi − x2 ) . . . =
(xi − xj ) 6= 0 .
i=3
i>j
Die eben berechnete Determinante heißt Vandermondesche Determinante.
129
⋄
Beispiel 14.28 (Ansatz mit beliebigen Exponenten)
Wir können auch
e
j
fj (x ) = (x − pj ) (j = 1, . . . , n) mit beliebigen verschiedenen Exponenten ej wählen und erhalten
auf die gleiche Art und Weise eine ausgleichende Funktion.
Das Beispiel (s. Abb. 14.3) enthält Werte, die qualitativ Messwerten eines Spannungs-Dehnungsversuchs oberhalb des linearen Materialverhaltens ähneln.
Als ausgleichende Funktion wählen wir
a1
+ a2 + a3 x + a4 x 2 + a5 x 3
f (x ) =
x + .1
und erhalten a1 = 2.2677; a2 = 297.9072; a3 = 71.4932; a4 = −33.7959; a5 = 5.5016.
Abb. 14.3 zeigt die Messergebnisse und die ausgleichende Funktion, Abb. 14.4 die Ausgleichsfehler, also die Differenzen zwischen Funktionswert und Mehrwert. Das Residuum ist die Wurzel
aus der Summe aller Fehlerquadrate, also gleich kA~a − ~y k.
Auffallend an den Fehlern ist ihr sinusförmiges Verhalten. Ursachen für derartige systematische
Fehler müssen ergründet werden. Sie weisen gegebenenfalls auf eine notwendige Änderung des
Ansatzes hin.
Abb. 14.3: gebrochen-rationale Ausgleichsfunktion
Abb. 14.4: Fehler der Ausgleichsfunktion
130
III Numerical Methods in Linear Algebra
Beispiel 14.29 (Fourier-Ansatz: trigonometrisches Polynom) Hier wird das Ausgleichen mit
einem trigonometrischen Polynom angestrebt. Der Ansatz lautet
n
X
f (x ) = a0 +
a2j −1 · sin(j ωx ) + a2j · cos(j ωx ) .
j =1
Beispiel 14.30 (Exponentialansatz) Logarithmieren des Ansatzes f (x ) = a1 · a2x führt zum
Ausdruck
ln(f (x )) = ln(a1 ) + ln(a2 ) · x ,
der für die transformierte Messreihe {(xi , ln(yi )) | i = 1, . . . , m} ein lineares Ausgleichsproblem in
den Koeffizienten ln(a1 ) und ln(a2 ) darstellt.23
Beispiel 14.31 (Potenzansatz) Logarithmieren des Ansatzes f (x ) = a1 ·x a2 führt zum Ausdruck
ln(f (x )) = ln(a1 ) + a2 · ln(x ) ,
der für die transformierte Messreihe {(ln(xi ), ln(yi )) | i = 1, . . . , m} ein lineares Ausgleichsproblem
in den Koeffizienten ln(a1 ) und a2 darstellt.24
23
Neben der rechnerischen Methode der linearen Ausgleichsrechnung kann dieser Ansatz auch zeichnerisch durch
Auftragen der Messreihe auf logarithmischem Papier gelöst werden. Man erhält eine Ausgleichsgerade durch den
Punkt (ln(a1 ); 0) mit der Steigung ln(a2 ).
24
Trägt man die Messreihe auf doppellogarithmischem Papier auf, so erhält man eine Ausgleichsgerade durch den
Punkt (ln(a1 ); 0) mit der Steigung a2 .
Kapitel IV
Statistik
§ 15 Grundlagen der Wahrscheinlichkeitsrechnung
15.A
Grundlagen
Beispiel 15.1 (Beispiele diskreter, gleichverteilter Zufallsexperimente)
(a) Werfen einer Münze: Der Ereignisraum, die Menge aller Ereignis, ist Ω = {Z , W } . Bei
1
einer idealen Münze ist die Wahrscheinlichkeit für jedes Ereignis P (Z ) = P (W ) = |Ω|
= 12 .
(b) Würfeln: Der Ereignisraum ist Ω = {1, 2, 3,4, 5, 6} . Die Wahrscheinlichkeitsverteilung
 Ω → [0, 1] 
eines idealen Würfels ist P = 
.
1

ω 7→
6
(c) Lotto spielen: Wie große ist die Wahrscheinlichkeit sechs Richtige zu tippen?
Die Wahrscheinlichkeitsrechnung baut auf der Mengentheorie und der Integrationstheorie auf.
Bei reellen Zahlen sind offene und abgeschlossene Intervalle und ihre Wahrscheinlichkeiten wichtig,
sie bilden eine σ-Algebra.
Definition 15.2 (σ-Algebra) Ω sei eine Menge, z.B. ein Ereignisraum und A ⊆ P(Ω) eine Menge
von Teilmengen von Ω. A heißt σ-Algebra oder Ereignisalgebra, falls
(a) Ω ∈ A ,
(b) A ∈ A
=⇒
∁Ω A = A ∈ A ,
(c) Ai ∈ A (i = 1, . . . , ∞)
=⇒
∞
[
i=1
Ai ∈ A .
Satz 15.3 Ist A ein σ-Algebra mit A, B, Ai (i = 1, . . . , ∞) ∈ A, so gelten
(a) A ∩ B ∈ A ,
(b)
∞
\
i=1
Ai ∈ A .
131
132
IV Statistik
Beweis:
(a) A ∩ B = A ∪ B ∈ A
(b)
∞
\
Ai =
i=1
∞
[
i=1
Ai ∈ A
Beispiel 15.4
∞ [
1
1
, 1−
= (0, 1)
(a)
i
i
i=2
(b) A = {∅, {1}, {2, 3}, {1, 2, 3}} ist eine σ-Algebra auf {1, 2, 3}.
Definition 15.5 (Wahrscheinlichkeitsraum) (Ω, A, P ) heißt Wahrscheinlichkeitsraum mit der
Wahrscheinlichkeit(sverteilung) P , falls
(a) A ⊆ P(Ω) eine σ-Algebra (der Ereignisse) ist und
(b) die (Kolmogorow1 -Axiome) für die Abbildung P : A → [0, 1] gelten:
(b1) P (Ω) = 1 ,
(b2) ∀A, B ∈ A : A ∩ B = ∅
=⇒
P (A ∪ B) = P (A) + P (B) .
Die Wahrscheinlichkeiten disjunkter, unvereinbarer Ereignisse werden addiert.
Definition und Satz 15.6 (Bedingte Wahrscheinlichkeit) (Ω, A, P ) sei ein Wahrscheinlichkeitsraum und A, B ∈ A. Dann ist die Wahrscheinlichkeit, dass das Ereignis A eintritt, wenn das
Ereignis B schon eingetreten ist
P (A ∩ B)
P (A|B) =
.
P (B)
Satz 15.7 Für A, B ∈ A gelten
(a)
P (A) = 1 − P (A)
(b)
A⊆B
(c)
=⇒
P (A) ≤ P (B)
P (A ∪ B) = P (A) + P (B) − P (A ∩ B)
Beweis:
(a) Dies folgt mit der disjunkten Zerlegung Ω = A ∪ A:
1 = P (Ω) = P (A ∪ A) = P (A) + P (A) .
(b) Aus der disjunkten Zerlegung B = A ∪ (B\A) folgt
P (B) = P (A ∪ B\A) = P (A) + P (B\A) ≥ P (A) .
(c) Aus den disjunkten Zerlegungen
(c1) A = (A\B) ∪ (A ∩ B)
(c2) B = (B\A) ∪ (A ∩ B)
(c3) A ∪ B = (A\B) ∪ (B\A) ∪ (A ∩ B)
folgen
P (A) = P (A\B) + P (A ∩ B) ,
P (B) = P (B\A) + P (B ∩ A) ,
also
also
P (A ∪ B) = P (A\B) + P (B\A) + P (A ∩ B)
P (A\B) = P (A) − P (A ∩ B) ,
P (B\A) = P (B) − P (A ∩ B) ,
= P (A) − P (A ∩ B) + P (B) − P (A ∩ B) + P (A ∩ B) .
1
Andrej Nikolajewitsch Kolmogorow, russ. Mathematiker, 1903-1987
⋄
15 Grundlagen der Wahrscheinlichkeitsrechnung
133
Beispiel 15.8 (Diskrete Wahrscheinlichkeiten) Ein endlicher Ereignisraum Ω mit voller σAlgebra A = P(Ω) heißt diskreter Wahrscheinlichkeitsraum. Häufig wird pω = P (ω) gesetzt. Es
gilt
X
pω = 1 .
ω∈Ω
Mit der zusätzlichen Eigenschaft
1
∀ω ∈ Ω pω =
(=: p) ,
|Ω|
heißt der Wahrscheinlichkeitsraum gleichverteilt. In diesem Fall gilt für A ⊆ Ω
X
X 1
|A|
=
P (A) =
pω =
|Ω|
|Ω|
ω∈A
ω∈A
Diese Formel wird als Anzahl der günstigen Fälle geteilt durch die Anzahl der möglichen Fälle“
”
gelesen.
Beispiel 15.9 (Würfeln)
(a) Einmal Würfeln:
Mit Ω = {1, 2, 3, 4, 5, 6} und A = P(Ω) ist P =



teilte Wahrscheinlichkeit für einen idealen Würfel.
A → [0, 1]
A 7→ |A|
6


die diskrete, gleichver-

(b) Zweimal Würfeln:
{1, 2, 3, 4, 5, 6}2 , P(Ω), P ist der diskrete, gleichverteilte Wahrscheinlichkeitsraum. Wegen
1
P ({(a, b)}) = P ({a}) · P ({b}) =
36


 P {1, 2, 3, 4, 5, 6}2
→ [0, 1] 
folgt P = 
.

A
7→ |A|
36
Sei S das Ereignis Summe der Augen ist 6“. Mit S = {(1, 5), (2, 4), (3, 3), (4, 2), (5, 1)}
”
5
|S |
=
.
folgt P (S ) =
36
36
15.B
Zufallsvariable
Als Beispiel einer Zufallsvariablen sei die Summe der Augen beim dreimaligen Würfeln genannt.
Dieser Begriff wird jetzt genauer definiert:
Definition 15.10 (Zufallsvariable) Eine Zufallsvariable X ist eine Abbildung der Wahrscheinlichkeitsräume
X : (Ω, A, P ) → (R, B, PX )
mit folgenden Eigenschaften:
(a) ∀ω ∈ Ω : X (ω) ∈ R ,
(b) ∀B ∈ B : X −1 (B) ∈ A ,
(c) ∀B ∈ B : PX (B) = P (X −1 (B)) .
Zur Vereinfachung wird häufig nur der Wahrscheinlichkeitsraum (R, B, PX ) betrachtet.
Beispiel 15.11 (Stichprobe) Bei Stichproben sind die Zufallsgrößen Xi der Wiederholungen unabhängig und identisch verteilt.
(a) Augenzahlen beim Würfeln:
Xi sei die Augenzahl beim i -ten Wurf, also eine Zufallsvariable auf Ω = {1, 2, 3, 4, 5, 6}.
Dann ist X = X1 + X2 + X3 eine Zufallsvariable auf Ω3 für die Summe der Augenzahlen bei
drei Würfen und P (X ≤ 7) = P (X1 +X2 +X3 ≤ 7) die Wahrscheinlichkeit für Die Augenzahl
”
bei drei Würfen ist kleiner oder gleich sieben.“
134
IV Statistik
(b) Messfehler: Xi sei der Messfehler bei der i -ten Messung. Xi ist eine Zufallsvariable auf R.
(c) Stichprobe: Xi sei das Ergebnis der i -ten Probe, also eine Zufallsvariable auf der Menge
{0, 1} = { kein Ausschuss“, Ausschuss“} .
”
”
Häufig wird die Wahrscheinlichkeit für Ausschuss“ mit p bezeichnet, also P (Xi = 1) = p
”
und P (Xi = 0) = 1 − p .
Definition 15.12 (Verteilungsfunktion und Wahrscheinlichkeitsdichte)
X : (Ω, A, P ) ↔ (R, B, PX ) sei eine Zufallsvariable.
(a) Die Funktion
F (x ) = P (X ≤ x )
heißt Verteilungsfunktion der Zufallvariablen X .
(b) X heißt stetige Zufallsvariable, wenn es eine Wahrscheinlichkeitsdichte f : R → R≥0 gibt mit
Z
PX (B) = P ({ω ∈ Ω | ; X (ω) ∈ B}) =
f (x ) dx .
B
Bemerkung 15.13 (Eigenschaften der Verteilungsfunktion)
(a) Die Verteilungsfunktion F ist monoton wachsend.
(b)
(c)
(d)
lim F (x ) = F (x0 ) : Die Verteilungsfunktion ist rechtsseitig stetig.
x →x0+
lim F (x ) = 0
x →−∞
lim F (x ) = 1
x →∞
Bemerkung 15.14 (Eigenschaften der Wahrscheinlichkeitsdichte)
lichkeitsdichte f einer stetigen Zufallsvariablen gelten:
Z ∞
(a)
f (x ) dx = 1 : Die Gesamtwahrscheinlichkeit ist eins.
(b)
Für die Wahrschein-
−∞
lim f (x ) = lim f (x ) = 0
x →∞
x →−∞
(c) Nach [25, 27.2, Seite 159] ist F stetig.
(d) Ist f stetig, so gilt F ′ = f .
Beispiel 15.15 (Normalverteilung: eine stetige Verteilung)
(a) Die Verteilungsfunktion
Z x
ξ2
1
F (x ) = P (X ≤ x ) = √
e− 2 dξ
2π −∞
heißt Standardnormalverteilung. Ihre Dichtefunktion ist die Gaußsche Glockenkurve.
(b) Die Verteilungsfunktion
Z x
(ξ−µ)2
1
F (x ) = P (X ≤ x ) = √
e− 2σ2 dξ
2π · σ −∞
heißt Normalverteilung. Ihre Dichtefunktion ist eine verschobene und gestreckte Gaußsche
Glockenkurve.
Beweis: Zu zeigen sind:
(a)
Z
∞
ξ2
e− 2 dξ =
√
2π .
−∞
Dies wird mit Hilfe ebener Polarkoordinaten nachgewiesen:
Z ∞
Z ∞
Z
Z
ξ2
η2
ξ2
η2
e− 2 dξ
e− 2 dη
=
e− 2 e− 2 dA =
−∞
−∞
R2
Z 2π
Z
∞
ξ2 +η 2
2
e−
2
R
dA
r2
=
e
r dr dϕ
u=
; du = r dr
2
0
0
Z ∞
∞
−u
−u = 2π
e du = 2π − e
= 2π
0
2
− r2
0
15 Grundlagen der Wahrscheinlichkeitsrechnung
(b)
Z
∞
e−
(ξ−µ)2
2σ 2
dξ =
√
−∞
135
2π · σ : Dies folgt mit der Substitution u =
Definition 15.16 (Erwartungswert, Varianz)
Wahrscheinlichkeitsdichte f : R → R≥0
Z ∞
µ = E (X ) =
xf (x ) dx
ξ−µ
1
, du = dξ .
σ
σ
Ist X eine reelle Zufallsvariable, so ist mit der
−∞
der Erwartungswert (Mittelwert) der Zufallsvariablen X . Im diskreten Fall gilt
n
X
µ = E (X ) =
xi P (xi ) .
i=1
Die Varianz ist definiert durch
σ 2 (X ) = V (X ) = E ((X − E (X ))2 ) ,
die Streuung durch
p
p
σ(X ) = V (X ) = E ((X − E (X ))2 ) .
Zur Berechnung der Varianz kann der Verschiebungssatz eingesetzt werden:
E ((X − E (X ))2 ) = E (X 2 ) − E (X )2
Satz 15.17 (Verschiebungssatz)
Beweis:
E ((X − µ)2 ) = E (X 2 − 2µX + µ2 ) = E (X 2 ) − 2µE (X ) + µ2 = E (X 2 ) − 2µ2 + µ2
⋄
Beispiel 15.18 (Binomialverteilung: eine diskrete Verteilung) Bei einer Stichprobe tritt das
Ereignis A (Ausschuss) mit der Wahrscheinlichkeit p = P (A), das Ereignis A mit der Wahrscheinlichkeit q = 1 − p = p(A) auf.
Beim n-maligem Wiederholen dieses Experiments ist die Wahrscheinlichkeit, dass das Ereignis
A k mal aufgetreten ist, gleich


n
P (A, n, k ) =  p k q n−k .
k
Nach dem Binomialsatz gilt
n
n  
X
X
n
 p k q n−k = (p + q)n = 1 ,
P (A, n, k ) =
k
k =0
k =0
wie es sein muss!
Mittelwert und Varianz werden berechnet:
 
n
n
X
X
n!
n
µ =
k  p k q n−k =
p k q n−k
k
(k − 1)!(n − k )!
k =0
= np
= np
k =1
n
X
k =1
n−1
X
k =0
σ
2
n−1
X
(n − 1)!
(n − 1)!
p k −1 q n−k = np
p k q n−1−k
(k − 1)!(n − k )!
k !(n − 1 − k )!
k =0
P (A, n − 1, k ) = np
2
2
2
= E ((X − µ) ) = E (X ) − µ =
= np
= np
n
X
k =1
n−1
X
k =0
n
X
k =0
(n − 1)!
k
p k −1 q n−k
(k − 1)!(n − k )!
!
!
 
2  n  k n−k
k
p q
k
− n 2p2
(n − 1)!
(k + 1)
p k q n−1−k
k !(n − 1 − k )!
!
− n 2p2
− n 2p2
136
IV Statistik
= np
= np
= np
= np
!
n−1
X
(n − 1)!
(n − 1)!
k n−1−k
k n−1−k
p q
p q
k
+
− n 2p2
k !(n − 1 − k )!
k !(n − 1 − k )!
k =1
k =0
! n−1
!
n−1
X
X
(n − 2)!
p k −1 q n−1−k +
(n − 1)p
P (A, n − 1, k ) − n 2 p 2
(k − 1)!(n − 1 − k )!
k =1
k =0
!
!
n−2
X
(n − 2)!
(n − 1)p
p k q n−2−k + 1 − n 2 p 2
k !(n − 2 − k )!
k =0
!
!
n−2
X
(n − 1)p
P (A, n − 2, k ) + 1 − n 2 p 2
n−1
X
k =0
= np ((n − 1)p + 1) − n 2 p 2 = np (np − p + 1) − n 2 p 2 = npq
Beispiel 15.19 (Standardnormalverteilung) Die Wahrscheinlichkeitsdichte ist eine gerade Funktion, daher ist der Erwartungswert 0. Dies folgt auch aus der Tatsache, dass der Integrand ungerade
x2
ist und mit der Substitution u =
; du = x dx
2
∞
Z ∞
Z
∞
2
− x2
−u
−u xe
dx =
e du = − e = 1
0
0
0
folgt, so dass
Z 0
Z ∞
Z ∞
2
2
2
1
1
1
− x2
− x2
− x2
xe
dx = √
xe
dx +
xe
dx = √ (−1 + 1) = 0
µ = √
2π −∞
2π
2π
−∞
0
gilt. Die Varianz wird mit Hilfe der partiellen Integration berechnet:
Z ∞
Z ∞
2
x2
1
1
2
2 − x2
σ = √
x e
dx = √
x · x e− 2 dx
2π −∞
2π −∞
∞
Z ∞
2
x
x2
x
1
15.15
= − √ · e− 2 +√
e− 2 dx = 0 + 1 = 1
2π
2π −∞
−∞
⋄
Beispiel 15.20 (Normalverteilung) Mit der Substitution u =
(a) E (X ) =
=
x −µ
1
; du = dx folgen
σ
σ
Z ∞
Z ∞
(x −µ)2
u2
1
σ
−
2
2σ
√
xe
dx =
(uσ + µ) e− 2 du
2πσ −∞
2πσ −∞
Z ∞
Z ∞
u2
u2
σ
µ
√
u e− 2 du + √
e− 2 du = 0 + µ = µ
2π −∞
2π −∞
√
2
(b) E ((X − E (X )) ) =
=
Z ∞
Z ∞
(x −µ)2
u2
1
σ
2 − 2σ 2
√
(x − µ) e
dx = √
(uσ)2 e− 2 du
2πσ −∞
2πσ −∞
Z ∞
2
2
u
σ
√
u 2 e− 2 du = σ 2
2π −∞
Diese Ergebnisse rechtfertigen das Benutzen der Variablen µ und σ in der Definition der Normalverteilung.
Bemerkung 15.21 Die Bedeutung der Streuung lässt sich durch die Angabe der Wahrscheinlichkeit für das Auftreten der Ereignisses in den Intervallen [µ − k σ, µ + k σ] ; k = 1, 2, 3 gut
veranschaulichen:
k
1
2
3
P (X ∈ [µ − k σ, µ + k σ])
.683
.954
.997
16 Grundlagen der Statistik
137
§ 16 Grundlagen der Statistik
16.A
Schätzfunktionen für statistische Größen
Häufig wird für ein Experiment“ eine Wahrscheinlichkeitsverteilung angenommen, die durch Stich”
proben belegt werden soll. Die statistischen Größen dieser Verteilung, z.B. µ und σ bei der Normalverteilung, sind unbekannt und müssen geschätzt“ werden. Diese Schätzfunktionen müssen
”
bestimmte Voraussetzungen erfüllen:
Definition 16.1 (Erwartungstreue, Konsistenz, Effizienz) Eine Schätzung F̄ (oder F̄ (n), bei
einer Stichprobe aus n Experimenten) für eine statistische Größe F heißt
(a) erwartungstreu, wenn E (F̄ ) = E (F ),
(b) konsistent, wenn lim E F̄ (n) = E (F ) gilt;
n→∞
(c) effizient, wenn es keine andere Schätzfunktion mit einer kleineren Varianz gibt.
Eine weitere Fragestellung ist natürlich die Genauigkeit dieser Schätzung. Dies wird mit Hilfe
von Konsistenz- oder Vertrauensintervallen angegeben.
Satz 16.2 (Schätzung bei Normalverteilung) Unterliegen die Messfehler einer Messreihe
{xi | i = 1, . . . , n} einer Normalverteilung, so sind
n
n
1X
1 X
2
x̄ :=
xi
und
S̄ :=
(xi − x̄ )2
n i=1
n − 1 i=1
erwartungstreue und konsistente Schätzungen für den Mittelwert und die Varianz der Zufallsvariablen X .
Vorausgesetzt wird hierbei natürlich, dass alle Messungen unabhängig voneinander und gleichverteilt sind, die Zufallsvariablen X1 , . . . , Xn also stochastisch unabhängig sind. Dies hat E (Xi Xj ) =
E (Xi )E (Xj ) zur Folge.
Beweis:
E (X̄ )
lim E X̄ (n)
n→∞
E (S̄ 2 )
=
E
n
1X
Xi
n
i=1
=
!
n
n
1X
1X
E (Xi ) =
µ = µ
=
n
n
i=1
n→∞
n
=
E
1 X
(Xi − X̄ )2
n −1
i=1
=
=
=
=
i=1
lim µ = µ = E (X )
1
n −1
n
X
i=1
!
n
=
1 X
E (Xi − X̄ )2
n −1
i=1
E (Xi2 ) − 2E (Xi X̄ ) + E (X̄ 2 )


2 
n
n
X
X
1
1
E (Xi2 ) − 2E Xi 1
Xj  + E 
Xj  
n −1
n
n
i=1
j =1
j =1


n
n
n
X
X
X
1
1
E (Xi2 ) − 2
E (Xi Xj ) + 2
E (Xj Xl )
n −1
n
n
i=1
j =1
j ,l =1

n
n
n
1 X
2
2X
1 X
2
2
E (Xi )E (Xj ) + 2
E (Xj2 )
E (Xi ) − E (Xi ) −
n −1
n
n j =1
n
n
X


i=1

n
X
1

+ 2
E (Xj )E (Xl )
n j ,l=1
l6=j
j 6=i
j =1
138
IV Statistik
n 1 X
2
1
2(n − 1) n 2 − n
2
2
2
(σ + µ ) 1 − +
+µ −
+
n −1
n
n
n
n2
i=1
n −1
n
n −1
(σ 2 + µ2 )
+ µ2 −
= σ2
n −1
n
n
15.17
=
=
lim E S̄ 2 (n)
lim σ 2 = σ 2 = E ((E (X ) − µ)2 )
=
n→∞
n→∞
⋄
Für die Varianz der Schätzung des Mittelwerts gilt

!2 
n
X
1
E ((X̄ − E (X̄ ))2 ) = E X̄ 2 − µ2 = E 
X i  − µ2
n
i=1


n
n
1 X X
=
E
X i X j  − µ2
n2
i=1 j =1


n
n
1 X
1 X

=  2
E Xi2 + 2
E (Xi )E (Xj ) − µ2
n
n i,j =1
i=1
j 6=i
n2
1
n −1−n 2
σ2
−n 2
2 15.17 1
2
2
E X2 +
µ
−
µ
=
(σ
+
µ
)
+
µ
=
.
n
n2
n
n
n
Für wachsendes n geht die Varianz der Schätzung gegen null. Auch dies ist ein Nachweis der
Konsistenz.
=
Satz 16.3 (Schätzung bei Binomialverteilung) Für die gesuchte Wahrscheinlichkeit p eines
Ereignisses A bei einer Stichprobe von n Experimenten (Bernoulli-Experiment) bezeichne X (n) die
Zufallsvariable für die Anzahl der aufgetretenen Ereignisse A. Dann ist
X (n)
P̄ :=
n
eine erwartungstreue und konsistente Schätzung für die Wahrscheinlichkeit.
Beweis:
Wegen E (X ) = np und σ 2 (X ) = np(1 − p) folgen
1
p(1 − p)
E (P̄ ) = np
und
σ 2 (P̄ ) = 2 σ 2 (X ) =
.
n
n
16.B
⋄
Vertrauensintervall für Mittelwert
Aufgabe 16.4 Für den Mittelwert µ einer normalverteilten Zufallsvariablen soll ein Vertrauensintervall angegeben werden, in dem µ mit der Wahrscheinlichkeit ε liegt. Bei vielen Anwendungen
wird ε = .95 oder ε = .99 gewählt.
Lösung: X̄ ist normalverteilt mit Erwartungswert µ und der Varianz
Verteilungsfunktion
√
n
P (X̄ ≤ x ) = √
2π · σ
Gesucht ist w mit
Z
x
e−
(ξ−µ)2 ·n
2σ 2
σ2
n
(Satz 16.2) mit der
dξ .
−∞
ε = P (X̄ − w ≤ µ ≤ X̄ + w ) = P (|X̄ − µ| ≤ w ) = P (µ − w ≤ X̄ ≤ µ + w )
√
Z µ+w
(ξ−µ)2 ·n
n
= √
e− 2σ2 dξ
2π · σ µ−w
r Z w √n
√
Z µ+w
/σ
(ξ−µ)2 ·n
u2
2n
2
= √
e− 2σ2 dξ =
e− 2 du
π 0
π·σ µ
(16.1)
(16.2)
(16.3)
16 Grundlagen der Statistik
139
√
n
mit der Substitution u = (ξ−µ)
. du =
σ
S̄ ersetzt. Hiermit ist auch gezeigt, dass
n
σ
dξ. Ist σ nicht bekannt, so wird es durch die Schätzung
√
n(X̄ −µ)
standardnormalverteilt ist und
σ
√
√
√
P (− w n/σ ≤ Z ≤ w n/σ) = P (|Z | ≤ w n/σ)
• die Zufallsvariable Z =
• ε = P (|X̄ − µ| ≤ w ) =
√
gilt.
Die Aufgabenstellung mit eine normalverteilten Zufallsvariablen ist damit äquivalent zu einer Aufgabenstellung mit einer standardnormalverteilten Zufallsvariablen. Da diese Verteilungsfunktion
tabelliert vorliegt, kann man Ihre Werte relativ einfach näherungsweise bestimmen. Wir werden die
Aufgabe mit Hilfe der numerischen Integration lösen:
√
Gesucht ist also eine Stelle v = w σ n mit
r Z
Z v
ξ2
1
2 v − ξ2
ε = P (−v ≤ Z ≤ v ) = √
e− 2 dξ =
e 2 dξ ,
π 0
2π −v
vσ
aus der w = √ berechnet werden kann.
n
(16.4)
(16.5)
Beispiel 16.5 Gegeben sei eine Messreihe für eine gegebene Größe
{11, 12, 11, 10, 9, 13, 14, 11, 12, 12, 11, 13, 15, 11, 12, 10, 9, 10, 11, 13} .
Gesucht ist das 99%-Konfidenzintervall für den wahren Mittelwert µ.
Der Schätzwert für den Mittelwert ist X̄ = 11.5, für die Streuung S̄ = 1.57. Der in
r Z
2 v − ξ2
0.99 =
e 2 dξ
π 0
gesuchte Wert v wird numerisch ermittelt.
Der MatLab-Aufruf der Romberg-Integration
Romberg(f,[0,2],5,2) liefert einen Näherungswert 0.9544997361 für v = 2. Dieser Wert wird durch das Newton-Verfahren verfeinert. Gesucht ist die Nullstelle der Funktion
r Z v
ξ2
2
e− 2 dξ − 0.99 ,
g(v ) =
π 0
die durch den MatLab-Aufruf des Newton-Verfahrens mit dem Anfangswert v = 2 und der RombergIntegration mit 5 Spalten berechnet wird, s. Abb. 16.1. Das Ergebnis ist 2.575824555, die gefundene
Näherung der Nullstelle. Damit ist das gesuchte Ergebnis v = 2.58 und aus Gl. 16.5 und 16.1 folgt
>> format compact
>> m=[11 12 11 10 9 13 14 11 12 12 11 13 15 11 12 10 9 10 11 13];
>> X=mean(m)
X =
11.5
>> S=std(m)
S =
1.5728
>> f=@(x)exp(-.5*x.^2)*sqrt(2/pi);
>> v=Newton(@(t)Romberg(f,[0,t],5,2)-.99,f,2)
v =
2.5758
>> konint=X+[-1,1]*S*v/sqrt(length(m))
konint =
10.594
12.406
Abb. 16.1: Berechnung mit MatLab
10.59 ≤ µ ≤ 12.41 mit einer Wahrscheinlichkeit von 99%.
140
IV Statistik
§ 17 Weibull-Verteilung
17.A
Definition
Die Weibull-Verteilung2 erlaubt, die Lebensdauer von Werkstücken statistisch zu modellieren. Die
Berechnung dieser Verteilung lässt sich mit Hilfe der Gamma-Funktion einfacher darstellen. Daher
wird an deren Definition und einige Eigenschaften erinnert, s. [25, 30.7(a), Seite 178].
Definition und Satz 17.1 (Gamma-Funktion) Für x ∈ R>0 wird die Gamma-Funktion als uneigentliches Integral definiert durch
Z ∞
t x −1 e−t dt .
Γ(x ) =
0
Es gelten
(a) Γ(1) = 1 ,
(b) Γ(x + 1) = x · Γ(x ) für x ≥ 0 und
(c) Γ(m) = (m − 1)! für m ∈ N.
Die Weibull-Verteilungen werden durch ihre Wahrscheinlichkeitsdichte definiert:
Definition 17.2 (Weibull-Wahrscheinlichkeitsdichte) Die Weibull-Wahrscheinlichkeitsdichte
zu den Parametern λ und k ist definiert durch



 0

x <0 
k
f (x , λ, k ) =
k −1
− x

 k x

e λ
x ≥0 
λ λ
λ wird charakteristische Lebensdauer und k Ausfallsteilheit genannt.
Satz 17.3 Für die Weibull-Dichtefunktionen gelten:
(a) Die Weibull-Wahrscheinlichkeitsverteilung ist
k
Z x
Z x k −1 t k
k t
−
− x
λ
P (x , λ, k ) =
f (t, λ, k ) dt =
e
dt = 1 − e λ .
λ
0
0 λ
k
R(x , λ, k ) = e−( λ ) gibt die Überlebungswahrscheinlichkeit“ an.
Z ∞ ” k −1 t k
k t
−
(b)
P (∞, λ, k ) =
e λ dt = 1
λ
λ
0
Damit ist die Weibull-Dichte wirklich eine Wahrscheinlichkeitsdichte.
x
Beweis:
(a) Mit der Substitution
k
t
k t k −1
u=
, du =
dt
λ
λ λ
folgt
( x/λ)k
k
Z x k −1 t k
Z ( x/λ)k
k t
−
− x
−u
−u λ
e
dt =
e du = − e = 1−e λ
λ
0 λ
0
0
(b) Diese Aussage folgt direkt aus (a).
Abb. 17.1 und 17.2 enthalten die Grafen einiger Weibull-Dichtefunktionen.
(17.1)
⋄
1
e
Alle Verteilungskurven zu einem festen Wert λ verlaufen für alle k durch den Punkt (λ, 1 − 1/e) ≈
(λ, 0.6321).
Zusatz 17.4
P (λ, λ, k ) = 1 −
17 Weibull-Verteilung
141
Abb. 17.1: Weibull-Dichte, k variiert
Abb. 17.3: Weibull-Dichte, k = λ
Abb. 17.2: Weibull-Dichte, λ variiert
Abb. 17.4: Weibull-Verteilung, λ konstant
Für λ = 1 sind einige Verteilungen in Abb. 17.4 dargestellt.
Abb. 17.5 enthält die Kodierung der Weibull-Dichte und -Verteilung in MatLab und den Kode
zur Generierung einer zu Abb. 17.3 analogen Grafik in MatLab.
>> format compact
>> weibulld=@(x,k,l) (k/l)*(x/l)^(k-1)*exp(-(x/l)^k)
weibulld =
@(x,k,l)(k/l)*(c/l)^(k-1)*exp(-(x/l)^k)
>> weibullv=@(x,k,l) 1-exp(-(x/l)^k)
weibullv =
@(x,k,l)1-exp(-(x/l)^k)
>>
>>
>>
>>
>>
>>
>>
>>
hold on
fplot(@(x)
fplot(@(x)
fplot(@(x)
fplot(@(x)
fplot(@(x)
fplot(@(x)
hold off
weibulld(x,1,1),[0,6],’b’)
weibulld(x,1,1),[0,6],’g’)
weibulld(x,2,2),[0,6],’r’)
weibulld(x,3,3),[0,6],’c’)
weibulld(x,4,4),[0,6],’m’)
weibulld(x,5,5),[0,6],’k’)
Abb. 17.5: Kodierung in MatLab
17.B
Momente
Satz 17.5 (Erwartungswert und Varianz) Erwartungswert und Varianz einer Zufallsvariablen
X , die Weibull-verteilt ist, werden berechnet:
k
Z ∞
Z ∞
k t k −1 − λt
(17.1)
1
E (X )
=
t·
e
dt =
λ u /k e−u du
λ λ
0
0
2
Ernst Hjalmar Waloddi Weibull, schwedischer Mathematiker und Ingenieur, 1887 - 1979 (Annecy)
142
IV Statistik
λ Γ (1 + 1/k ) ,
=
E ((X − E (X ))2 )
k
Z ∞
k t k −1 − λt
(15.17)
E (X 2 ) − (E (X ))2 =
t2 ·
e
dt − (E (X ))2
λ
λ
0
Z ∞
2
λ2 u /k e−u du − (E (X ))2 = λ2 Γ (1 + 2/k ) − (Γ (1 + 1/k ))2 .
=
(17.1)
=
0
Der Erwartungswert ist streng monoton wachsend in λ. Da die Gamma-Funktion nach Abb. 17.6
im Bereich (0, 1.5] streng monoton fällt, wächst der Erwartungswert streng monoton in k für k > 2.
Die Varianz ist streng monoton wachsend in λ. Da die Γ(1 + 2x ) − (Γ(1 + x )2 ) nach Abb. 17.7
im Bereich (0, 1] streng monoton wächst, fällt sie wegen x = 1/k streng monoton in k .
3
1
0.9
2.5
0.8
2
0.7
Γ(x)
Γ(1+2x)−(Γ(1+x))
2
1.5
0.6
0.5
0.4
0.3
1
0.2
0.1
0.5
0.5
1
1.5
2
2.5
3
0
0
0.1
0.2
0.3
x
Abb. 17.6: Gamma-Funktion
0.4
0.5
x
0.6
0.7
0.8
0.9
1
Abb. 17.7: Γ(1 + 2x ) − (Γ(1 + x ))2
17.C
Approximation einer Messreihe durch Weibull-Verteilungen
17.C.1
Approximation durch eine Weibull-Verteilung
Aufgabe 17.6 Liegt eine Messreihe {(xi , Pi )|i = 1, . . . , m} zu einer Weibull-verteilten Zufallsvariablen vor, so müssen die Parameter λ und k der besten Approximierenden Funktion P (x , λ, k ) =
x k
1 − e−( /λ) gefunden werden.
Als Anwendungsbeispiel betrachte man den Anteil Pi von Werkstücken, die bis zum Zeitpunkt xi
ausgefallen oder zerstört sind. Umstellen und Logarithmieren der Funktion liefert einen Lösungsansatz:
P = 1 − e−(
⇐⇒ 1 − P =
x/λ)k
(17.2)
x k
e−( /λ)
⇐⇒ ln(1 − P ) = − ( x/λ)k
x k
1
⇐⇒ − ln(1 − P ) =
= k · xk
λ
λ
⇐⇒ y(x ) = a · x k
mit
y(x ) = − ln (1 − P (x , λ, k )) ,
(17.3)
a=
1
,
λk
yi = − ln(1 − Pi )
(17.4)
Lösung 17.7 Für die Messreihe {(xi , yi )|i = 1, . . . , m} und den Ansatz y(x ) = a · x k können die
Parameter a und k z.b. auf folgende Arten gewonnen werden:
(a) Auftragen der Messreihe auf doppelt-logarithmischem Papier und Bestimmen der Parameter
nach [27, 7.F, Seite 38]
17 Weibull-Verteilung
143
(b) Nach Logarithmieren des Potenzialansatzes y(x ) = a · x k zu
ln(y(x )) = ln(a) + k · ln(x )
(17.5)
können ln(a) und k durch eine lineare Ausgleichsrechnung mit den Monomen
gewonnen werden, s. 14.30, Seite 130 oder [24, 4.22, Seite 41].
x0
und x 1
Es sei darauf hingewiesen, dass dieses Vorgehen nicht die optimale Lösung für den Potenzialansatz liefert, sondern die optimale Lösung für das logarithmisierte Problem. Dieses ist aber eine
gute Näherung an das Optimum.
Beispiel 17.8 Zur Messreihe
x
1
2
3
4
5
6
7
8
9
10
11
12
P 0.075 0.204 0.357 0.481 0.667 0.774 0.883 0.902 0.948 0.968 0.995 0.999
soll die zugrunde liegende Weibull-Verteilung
gefunden
werden. Nach 17.6 und 17.7 ist A = (1, ln(~x ))
~
~
die Koeffizientenmatrix und b = ln − ln(1 − P ) der Konstantenvektor der zu lösenden Ausgleichsaufgabe A~z = ~b, deren Lösung durch
T
−1
~z = (A A)


−2.6969 
A b=
1.7574
T~
berechnet wird, s. Lösung mit MatLab in Abb. 17.8. Hieraus ergeben sich
1 (17.5) − z (1)/k
(17.5)
(17.4)
k = z (2) = 1.757 , λ = √
= e
= 4.642 .
k
a
Abb. 17.8 beinhaltet die MatLab-Lösung mit Hilfe der Funktion WeibullOpt, s. Abb. 17.9. Abb. 17.10
stellt die gefundene Lösung mit den Messungen dar.
>>
>>
>>
>>
kl
format compact
x=[1:12];
P=[0.075 0.204 0.357 0.481 0.667 0.774 0.883 0.902 0.948 0.968 0.995 0.999];
[kl,err,std]=WeibullOpt(x,P)
=
1.7574
4.6423
err =
0.0097185
std =
0.018478
Abb. 17.8: Lösung in MatLab
17.C.2
Approximation durch Überlagerung zweier Weibull-Verteilungen
Die Ausfallwahrscheinlichkeit eines Werkstücks hat häufig ein Maximum am Anfang und gegen
Ende der erwarteten Lebenszeit. Dies kann durch die Überlagerung zweier Weibull-Dichtefunktionen
(oder mehrerer) modelliert werden.
Bei einer Überlagerungen zweier Weibull-Dichtefunktionen muss wieder eine Wahrscheinlichkeitsdichte entstehen, daher muss die Summe der beiden Faktoren eins ergeben:
s(x , λ1 , k1 , λ2 , k2 , a) = a · f (x , λ1 , k1 ) + (1 − a) · f (x , λ2 , k2 )


 0
=
k1 −1 − x k1
k2 −1 − x k2

 a k1 x
e λ1
+ (1 − a) k2 x
e λ2
λ1 λ1
λ2 λ2


x <0 

x ≥0 
(17.6)
144
IV Statistik
function [kl,e,s]=WeibullOpt(x,P)
% WeibullOpt berechnet die beste Weibull-Verteilung zu den Eingaben x, P
% V1.1 29.12.2013 D. Kilsch
% x
V
Zeitpunkte
% P
V
Anteil defekter Teile zum Zeitpunkt x
% kl
V[1] Exponent der Weibull-Verteilung (k, Ausfallsteilheit)
%
[2] Nenner der Weibull-Verteilung (lambda, char. Lebensdauer)
% e
S
mittlerer Fehler
% s
S
Standardabweichung der Fehler
%
% Methode: Auf die Gleichung P(x) = 1-exp(-(x/lambda)^k) in logarithmi% scher Form -ln(1-P) = (1/lambda)^k * x^k wird das halblogarithmische
% Ausgleichsverfahren angewandt: ln(-ln(1-P)) = ln((1/lambda)^k) + k*ln(x).
% Die Koeffizienten ln((1/lambda)^k) und k werden durch die
% Ausgleichsrechnung, in MatLab durch die Linksmultiplikation / berechnet.
%==========================================================================
Weibullv=@(x,kl) 1-exp(-(x/kl(2)).^kl(1));
%
A=[repmat(1,length(P),1),log(x)’];
z=A\log(-log(1-P))’;
kl=[z(2),exp(-z(1)/z(2))];
%
z=Weibullv(x,kl)-P;
% Fehler
e=mean(z);
s=std(z);
%
fplot(@(x)Weibullv(x,kl),[0,max(x)]);
hold on;
plot(x,P,’+r’);
xlabel(’x’)
ylabel(sprintf([’P, Weibullv(%7.4f,%8.4f)’],kl))
title(’Approximation durch Weilbull-Verteilung’)
hold off;
Abb. 17.9: Die MatLab-Funktion WeibullOpt
Approximation durch Weilbull−Verteilung
1
0.9
P, Weibullv( 1.7574, 4.6423)
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0
2
4
6
x
8
10
Abb. 17.10: Gefundene Lösung: k = 1.7573, λ = 4.6423
12
17 Weibull-Verteilung
145
Abb. 17.11: Überlagerungen mit k1 = λ1 = 1 und k2 = λ2 = 5 (W-Dichte)
Abb. 17.11 zeigt Beispiele für Überlagerungen bei variierendem Parameter a.
Die analoge Formel für die Überlagerungen der Weibull-Verteilungsfunktionen lautet



 0

x <0 
k1 k2 P (x , λ1 , k1 , λ2 , k2 , a) =
(17.7)
x
x
−
−

 a 1 − e λ1

+ (1 − a) 1 − e λ2
x ≥0 
Die Bestimmung der Parameter der beiden Verteilungen und des Überlagerungskoeffizienten
wird als Optimierung des Fehlers in den Messpunkten“ durch ein Gradientenabstiegsverfahren
”
ausgeführt. Die Anfangswerte erhalten wird durch zwei Weibull-Approximation nach 17.C.1 für die
Anfangswerte und die Endwerte der Messungen.
Für eine Messreihe {(xi , Pi )|i = 1, . . . , m} müssen die Koeffizienten λ1 , λ2 , k1 , k2 und a so
gefunden werden, dass sie den Fehler
m
1X
|P (xi , λ1 , k1 , λ2 , k2 , a) − Pi |2
E (λ1 , k1 , λ2 , k2 , a) =
2
i=1
minimieren. Hierzu stehen das Newton-Raphson-Verfahren, die Gradientenabstiegsmethode und
das Levenbergh-Marquardt-Verfahren nach 12.B zur Verfügung.
Beispiel 17.9 Als Beispiel betrachten wir die folgende in der Datei SkrStWe5.dat enthaltene
Messreihe
x
P
1
2
3
4
5
6
7
8
9
10
11
12
13
0.101 0.159 0.192 0.212 0.231 0.254 0.275 0.287 0.289 0.289 0.289 0.3 0.318
...
...
... x 14
15
16
17
18
19
20
21
22
23
24
25
26
27
... P 0.337 0.352 0.368 0.396 0.444 0.511 0.588 0.666 0.74 0.811 0.878 0.937 0.979 0.995
Abb. 17.12 enthält die Lösung in MatLab mit der Funktion WeibullOpt2, die in Abb. 17.13
dargestellt ist.
Die wichtigen Schritte dieser Lösung sind:
(a) Bestimmen eines Anfangsvektors (k1 , λ1 , k2 , λ2 , a):
(a1) Mit den ersten beiden Punkten werden wie in 17.C.1 die Parameter k1 und λ1 einer ersten
Weibull-Verteilung bestimmt, s. Abb. 17.14. Die ersten drei Punkte, oder noch weiterer,
liefern schlechte Startwerte, die das Gradientenverfahren nicht zu guten Ergebnissen
konvertieren lassen.
(a2) Mit den letzten sieben Punkten werden analog die Parameter k2 und λ2 bestimmt einer
zweiten Weibull-Verteilung bestimmt, s. Abb. 17.15.
(a3) Ferner wird a = 1/2 gesetzt.
146
IV Statistik
>> format compact
>> [param,mse,err,std,ergan]=WeibullOpt2(’SkrStWe5.dat’,2,7,.5,3,.01,1,.01,4000,20)
param =
0.82986
3.1489
7.0846
22.064
0.31144
mse =
4.3183e-005
err =
-0.00027455
std =
0.0066907
ergan =
3
3386
13 9.8788e-006 4.1832e-006 -2.6455e-011
Abb. 17.12: Lösung in MatLab
(b) Mit diesen Startwerten wird ein Gradientenabstiegsverfahren gestartet. Als Zielfunktion wird
die Summe der quadratischen Fehler benutzt. Mit der Geradensuche konvergiert das Verfahren
gut. Abb. 17.16 enthält die Fehlerkurve während der Iteration.
Das Ergebnis lautet


 0
P (x ) =
x )0.8297
x )7.085
−( 3.149
−( 22.06

+ 0.6886 1 − e
 0.3114 1 − e


x <0 
x ≥0 

Es ist in Abb. 17.17 dargestellt. Nach Abb. 17.12 beträgt der mittlere quadratische Fehler 4.3·10−5 ,
der mittlere Fehler −0.00275 und die Standardabweichung der Fehler 0.0067. Die Bedeutung der
Ausgabe ergan ergibt sich aus dem Kopf der Funktion WeibullOpt2 in Abb. 17.13.
function [param,mse,e,s,ergan]=...
WeibullOpt2(datei,aanf,aend,a,method,h,lrmax,lrmin,anzlauf,halbmax)
% WeibullOpt2 berechnet die beste Überlagerung zweier Weibull-Verteilungen.
% V1.1 29.12.2013 D. Kilsch
% datei
TV Datei mit Messdaten, zeilenweise
% aanf
S
Anzahl Punkte (vom Anf.) für Optierung der ersten Verteilung
% aend
S
Anzahl Punkte (vom Ende) für Optierung der zweiten Verteilung
% a
S
Anteil der ersten Weibull-Verteilung
[DEF.: .5]
% method S
Methode des Gradientenverfahrens, s. GradientenVerf.[DEF.: 1]
% h
S
Schrittweite für Gradientberechnungen
[DEF.: 1E-3]
% lrmax
S
maximale Lernrate
[DEF.: 1]
% lrmin
S
minimale Lernrate
[DEF.: .001]
% anzlauf S
maximale Iterationschritt
[DEF.: 200]
% halbmax S
maximale Anzahl der Schrittweitenhalbierungen
%
für Gradientberechnungen
[DEF.: 30]
% param
V
gefunde optimale Werte der Optimierung, wie aparam
%
[1] Nenner der ersten Weibull-Verteilung (char. Lebensdauer)
%
[2] Exponent der ersten Weibull-Verteilung (Ausfallsteilheit)
%
[3] Nenner der zweiten Weibull-Verteilung (char. Lebensdauer)
%
[4] Exponent der zweiten Weibull-Verteilung (Ausfallsteilheit)
%
[5] Anteil der ersten Weibull-Verteilung
% mse
S
Fehler laut Ziefunktion: mittlerer quadratischer Fehler
% e
S
mittlerer Fehler
% s
S
Standardabweichung der Fehler
% ergan
V
Ergebnisanalyse
%
(1): Abbruchgrund:
17 Weibull-Verteilung
147
%
1: max. Anzahl der Epochen erreicht
%
2: max. Anzahl der Schrittweitenhalbierung erreicht
%
3: Minimale Betragsnorm des Gradienten unterschritten
%
4: Min. Betragsnorm der Diff. der Änderung unterschr.
%
5: rel. Änderung in Fkt.-wert 50 Mal kleiner 10^-8
%
(2): Epochenzahl
%
(3): Schrittweitenhalbierung
%
(4): Norm des Gradienten
%
(5): Norm Betragsdifferenz
%
(6): Differenz der letzten Funktionswerte
%
% Beispiel:
% [param,err]=WeibullOpt2(’SkrStWe5.dat’,2,7,.5,3,.01,1,.01,4000,40)
%
% x
V
Messstellen (Zeitpunkte)
% P
V
Anteilo defekte Teile
% fkt
FH
Zielfunktion
%
fkt(NaN): M(1,:) Zeitpunkte x
%
M(2,:) Anteil der defekten Teile zur Zeit x
%
% Methode: Auf die Gleichung
% P(x) = a*(1-exp(-(x/lambda1)^k1))+(1-a)*(1-exp(-(x/lambda2)^k2))
% wird die Gradientenabstiegsmethode angewandt.
%==========================================================================
Weibullv2=@(x,k) k(5)*(1-exp(-(x/k(2)).^k(1)))+(1-k(5))*(1-exp(-(x/k(4)).^k(3)));
WeibullZiel2=@(k,t,P) sum((Weibullv2(t,k)-P).^2);
%
if nargin<10;
halbmax=30;
end;
if nargin<9;
anzlauf=200;
end;
if nargin<8;
lrmin=0.001;
end;
if nargin<7;
lrmax=1;
end;
if nargin<6;
h=1e-3;
end;
if nargin<5;
method=1;
end;
if nargin<4;
a=.5;
end;
%
P=textread(datei);x=P(:,1)’;P=P(:,2)’;
%
close all;figure(1);
param=WeibullOpt(x(1:aanf),P(1:aanf));
figure(2);
param=[param,WeibullOpt(x(end-aend:end),P(end-aend:end))];
[param,mse,ergan]=GradientenVerf(method,@(k)WeibullZiel2(k,x,P),...
[param,a],h,lrmax,lrmin,anzlauf,halbmax,’Weibull_2’,1E-5,1E-10);
mse=mse/length(x);
%
z=Weibullv2(x,param)-P;
% Fehler
e=mean(z);s=std(z);
%
figure(4);
fplot(@(x)Weibullv2(x,param),[0,max(x)]);
hold on;
plot(x,P,’+r’);
xlabel(’x’)
148
IV Statistik
ylabel(sprintf([’P, Weibullv2(%7.4f,%8.4f,%8.4f,%8.4f,%8.4f)’],param))
title(’Approximation durch zwei Weilbull-Verteilungen’)
hold off;
Abb. 17.13: Die MatLab-Funktion WeibullOpt2
Approximation durch Weilbull−Verteilung
Approximation durch Weilbull−Verteilung
0.16
1
0.9
0.14
P, Weibullv( 5.8625, 20.7731)
P, Weibullv( 0.7017, 24.3432)
0.8
0.12
0.1
0.08
0.06
0.04
0.7
0.6
0.5
0.4
0.3
0.2
0.02
0
0.1
0
0.5
1
x
1.5
0
2
0
20
25
Approximation durch zwei Weilbull−Verteilungen
2
P, Weibullv2( 0.8299, 3.1489, 7.0846, 22.0642, 0.3114)
0.18
0.16
Fehlerquadratsumme
15
Abb. 17.15: Approximation für k2 und λ2
Gradientenverf. mit Geradensuche:Weibull 201401101344
0.2
0.14
0.12
0.1
0.08
0.06
0.04
0.02
0
10
x
Abb. 17.14: Approximation für k1 und λ1
0
5
500
1000
1500
2000
2500
3000
(Verfahren 3, Schritt 3386: 0.001166) Epochen
3500
Abb. 17.16: Fehlerkurve während der Iteration
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0
5
10
15
20
25
x
Abb. 17.17: Messpunkte und Approximation
Bemerkung 17.10 Ausfälle von Bauteilen durch unabhängige Schäden an zwei verschiedenen
Bauteilen können ebenfalls durch eine Überlagerung zweier Weibull-Verteilungen dargestellt werden, deren Parameter auf analoge Weise zu bestimmen sind.
Literaturverzeichnis
[1] Andrié, M. und P. Meier: Analysis für Ingenieure. VDI-Buch. Springer, Heidelberg, 3.
Aufl., 1996. ISBN 3-540-62296-9, FHBib: P940120 111620 (A2), e22.95.
[2] Andrié, M. und P. Meier: Lineare Algebra und Geometrie für Ingenieure. VDI-Buch. Springer, Heidelberg, 3. Aufl., 1996. ISBN 3-540-62294-2, FHBib: P940120 111620(A2), e22.95.
[3] Bajpai, A. C., L. R. Mustoc, and D. Walker: Advanced Engineering Mathematics. John
Wiley, Chichester, 2. ed., 1990. ISBN 0-471-92595-0, FHBib: 940118 111340.
[4] Bajpai, A. C., L. R. Mustoc, and D. Walker: Engineering Mathematics. John Wiley,
Chichester, 2nd ed., 1990. ISBN 0-471-92283-8, FHBib: 940119 111340.
[5] Barthold, F.-J. und D. Materna: Einführung in die Informationsverarbeihttp://www.bauwesen.tu-dortmund.de/nmi/Medienpool/Skripte/
tung: MATLAB.
NMI-Grundlagen-Matlab-28-05-2013.pdf, 13.11.2014.
[6] Bartsch, H.-J.: Taschenbuch mathematischer Formeln. Fbv, Leipzig, 20. Aufl., 2004. ISBN
3-446-22891-8, FHBib: 060759 111001, e19.90.
[7] Brauch, W., H.-J. Dreyer und W. Haacke: Mathematik für Ingenieure. Teubner, 11.
Aufl., 2006. ISBN 3-8351-0073-4, FHBib: P900325 111340(A8), http://gwv-mailing.wsberlin.
de/gwv/redirect.jsp?id=5002675&pnlid=5008152, e39.90.
[8] Bronstein, I. N. und K. A. Semendjajew: Taschenbuch der Mathematik . Harri Deutsch,
Thun, 25. Aufl., 1991. vergriffen, ISBN 3-87144-492-8, 3-8154-2000-8, FHBib: 941013 111001.
[9] Bronstein, I. N., K. A. Semendjajew, G. Musiol und H. Mühlig: Taschenbuch der
Mathematik . Harri Deutsch, Frankfurt am Main, 6. Aufl., 2005. ISBN 3-8171-2006-0, FHBib:
041425 111001(A5), e39.95.
[10] Bugl, P.: Differential Equations: Matrices and Models. Prentice Hall, 1995. ISBN 0-02316540-5, FHBib: 950875 111622.
[11] Bungartz, H.-J., S. Zimmer, M. Buchholz und D. Pflüger: Modellbildung und Simulation: Eine anwendungsorientiert Einführung. eXamen.press. Springer, Berlin, 2009. ISBN
978-3-540-79809-5, 32.99.
[12] Bunse, W. und A. Bunse-Gerstner: Numerische lineare Algebra. Teubner Studienbücher
Mathematik. Teubner, Stuttgart, 1985. ISBN 3-519-02067-X, FHBib: 980684 111602, DM 38.-.
[13] Burg, K., H. Haf und F. Wille: Höhere Mathematik für Ingenieure, Bd. 3: Gewöhnliche Differentialgleichungen, Distributionen, Integraltransformationen. Teubner, 2. Aufl., 1990.
ISBN 3-519-12957-4, FHBib: 900922 111310.
[14] Cevore, J. L. and K. N. Berk: Modern Mathematical Statistics with Applications. Springer
Texts in Statistics. Springer, New York, 2nd ed., 2012. ISBN 978-14614-0390-6.
[15] Engeln-Müllges, G., K. Niederdrenk und R. Wodicka: Numerik-Algorithmen. Springer, Berlin, 9. Aufl., 2005. ISBN 3-540-62669-7, e9.95.
[16] Gramlich, G. M.: Anwendungen der Lineare Algebra mit MATLAB. Mathematik Studienhilfe. Fachbuchverlag Leipzig, München, 2004. ISBN 3-446-22655-9, FHBib: 060776/111602,
http://www.rz.fh-ulm.de/˜gramlich, e9.90.
149
150
LITERATURVERZEICHNIS
[17] Gramlich, G. M.: Eine Einführung in MATLAB. Hochschule Ulm, 2007.
hs-ulm.de/users/gramlich/EinfMATLAB.pdf, 5.8.2009.
http://www.
[18] Grcar, J. F.: Mathematicians of Gaussian Elimination. Notices of the AMS, 58(6):782–792,
2011. http://www.ams.org/notices/201106/rtx110600782p.pdf.
[19] Gustafson, G. B. and C. H. Wilcox: Advanced Engineering Mathematics. Springer, New
York, 1998. ISBN 0-387-98265-5.
[20] Hahn, W. und K. Mohr: APL/PCXA. Hanser, München, 1988. ISBN 3-446-15264-4, FHBib:
880302/273510.
[21] Haußer, F. und Y. Luchko: Mathematische Modellierung mit MATLAB. Spektrum Akademischer Verlag, Heidelberg, 2011. ISBN 78-3-8274-2398-6, e22.99.
[22] Hecht-Nielsen, R.: Neurocomputing. Addison Wesley, 1991. ISBN 0-201-09355-3, DM 90.50.
[23] Heuser, H.: Gew. Differentialgleichungen. Teubner, 1989. ISBN 3-519-02227-3, FHBib:
890765 111622.
[24] Kilsch, D.: Mathematik 2 .
lehrvera/Math/Skd2.pdf.
FH Bingen, SoSe 2006.
http://www.fh-bingen.de/˜kilsch/
[25] Kilsch, D.: Mathematik A. FH Bingen, WS 2007/08.
lehrvera/Math/Skr1.pdf.
http://www.fh-bingen.de/˜kilsch/
[26] Kilsch, D.: Mathematik B. FH Bingen, SoSe 2008.
lehrvera/Math/Skr2.pdf.
http://www.fh-bingen.de/˜kilsch/
[27] Kilsch, D.: Mathematik Vorkurs. FH Bingen, WS 2009/10.
˜kilsch/lehrvera/Math/Skrv.pdf.
http://www.fh-bingen.de/
[28] Knorrenschild, M.: Numerische Mathematik. Eine beispielorientierte Einführung. Hanser,
München, 2. Aufl., 2005. ISBN 3-446-40440-6, e9.90.
[29] Ludewig, J.: Sprachen für die Programmierung. BI Htb 622, 1985. ISBN 3-411-00622-6,
FHBib: B901054 273500, DM 22.80.
[30] The MathWorks: MatLab User’s Guide, 2007.
[31] Meyer, B.: Objektorientierte Softwareentwicklung. Hanser / Prentice Hall, 1990. ISBN 3446-15773-5, DM 78.
[32] Moore, E. H.: On the reciprocal of the general algebraic matrix .
26:394–395, 1920.
Bull.Amer.Math.Soc.,
[33] O’Neil, P. V.: Advanced Engineering Mathematics. CL-Engineering, Samutprakarn, Thailand, 6. ed., 2006. ISBN 978-0534552084, $ 176.05.
[34] Papula, L.: Mathematik für Ingenieure und Naturwissenschaftler 1 . Vieweg, Wiesbaden, 10.
Aufl., 2001. ISBN 3-528-94236-3, FHBib: P890498 111340(A3).
[35] Papula, L.: Mathematik für Ingenieure und Naturwissenschaftler 2 . Vieweg, Wiesbaden, 10
Aufl., 2001. ISBN 3-528-94237-1, FHBib: P890496 111340(A3).
[36] Papula, L.: Mathematik für Ingenieure und Naturwissenschaftler 3 . Vieweg, Wiesbaden, 4
Aufl., 2001. ISBN 3-528-34937-9, FHBib: P950597 111340(A3).
[37] Papula, L.: Mathematische Formelsammlung. Vieweg, Wiesbaden, 9. Aufl., 2006. ISBN
3-834-80156-9, FHBib: P890106(A1) 050588 111001, e25.90.
[38] Penrose, R.: A generalized inverse for matrices.
51:406–413, 1955.
Proc. of the Cambridge Phil. Soc.,
[39] Penrose, R.: On best approximate solution of linear matrix equations. Proc. of the Cambridge Phil. Soc., 52:17–19, 1956.
[40] Pomberger, G.: Softwaretechnik und Modula-2 . Hanser, 1987. ISBN 3-446-15056-0, FHBib:
890730 273530, DM 48.
LITERATURVERZEICHNIS
151
[41] Preuß, W. und G. Wenisch (Hrsg.): Lehr- und Übungsbuch Numerische Mathematik . Fbv
Leipzig, Hanser, Leipzig, 2001. ISBN 3-446-21375-9, e34.90.
[42] Quarteroni, A. und F. Saleri: Wissenschaftliches Rechnen mit MATLAB. Springer, 2008.
ISBN 3-540-25005-0, FHBib: 100585 111601, e29.95.
[43] Rembold, U. u.: Einführung in die Informatik . Hanser, 1987. ISBN 3-446-14982-1, FHBib:
870305, DM 48.
[44] Rießinger, T.: Mathematik für Ingenieuere. Springer Lehrbuch. Springer, Berlin, 4. Aufl.,
2003. ISBN 3-540-40244-6, e29.95.
[45] Saad, Y.: Numerical methods for large eigenvalue problems. Classics in Applied Mathematics
66. SIAM, Philadelphia, 2nd ed., 2011. ISBN 978-1-611970-72-2, http://www.ec-securehost.
com/SIAM/CL66.html, $ 70.
[46] Schauer, H. und G. Barta: Konzepte der Programmiersprachen. Springer, 1986. ISBN
3-211-81865-0, FHBib: 890430 273500.
[47] Schwarz, H. R. und N. Klöckler: Numerische Mathematik . Vieweg+Teubner, Wiesbaden,
7. Aufl., 2009. ISBN 978-3-8348-0683-3.
[48] Schwetlick, H. und H. Kretzschmar: Numerische Verfahren für Naturwissenschaftler
und Ingenieure. Mathematik für Ingenieure. Hanser, München, 1991. (alt: Fbv Leipzig, 3-34300580-0), ISBN 3-446-00580-3, FHBib: 020592 111330, e24.90.
[49] Spindler, K.: Höhere Mathematik - Ein Begleiter durch das Studium. Harri Deutsch, 2010.
Kommenar in Math. Semesterberichte 58/2, 2011, 240-242, ISBN 978-3-8171-1872-4.
[50] Stingl, P.: Mathematik für Fachhochschulen (Technik und Informatik). Hanser, München, 6.
Aufl., 1999. ISBN 3-446-21077-6, FHBib: P921031 111340(A5), A3, DM 29,90.
[51] Stoer, J.: Numerische Mathematik I . HTB 105. Springer, Berlin, 3. Aufl., 1979. ISBN
3-540-09346-X, FHBib: 790797 111330.
[52] Stoer, J. und R. Bulirsch: Numerische Mathematik II . HTB 114. Springer, Berlin, 1978.
ISBN 3-540-08840-7, FHBib: 790798 111330.
[53] Swokowski, E. W., M. Olinick, and D. D. Pence: Calculus. PWS, Boston, 6. ed., 1994.
ISBN 0-534-93624-5, FHBib: 941483 111621.
[54] Walter, W.: Gewöhnliche Differentialgleichungen. HTB 110. Springer, 1972. ISBN 3-54005867-2, FHBib: 790804 111622.
[55] Zeidler, E. (Hrsg.): Teubner-Taschenbuch der Mathematik - Band I . Teubner, Stuttgart, 2.
Aufl., 2003. ISBN 3-519-20012-0, e34.90.
[56] Zill, D. G.: A First Course in Differential Equations: The Classic Fifth Edition. PWS,
Boston, 5. ed., 2002. ISBN 0-534-37388-7, GBP 32.40.
Als Formelsammlung sind [6, 8, 9, 55, 37] geeignet. Ergänzungen und tiefere Einblicke ermöglichen [13, 23, 54, 51, 52]. Hier finden Sie auch fehlende Beweise, die nicht oder nur skizzenhaft
in der Vorlesung vorgetragen wurden. Weiterführende Themen zur Modellbildung und Simulation
finden Sie in [21] oder [11].
Eine Dokumentation zur MatLab -Umgebung ist in [30] enthalten.
Für die Preise übernehme ich natürlich keine Gewähr.
Abbildungsverzeichnis
1
Nicht-formales Problem – formales Programm
.
.
.
.
.
.
vi
2.1
2.2
2.3
Feinentwurf
Elemente eines Flussdiagramms
Elemente eines Struktogramms
3.1
Nummerierung der Bits
4.1
4.2
4.3
4.4
4.5
4.6
4.7
cat-Funktion .
.
.
.
Zugriff auf mehrachsige Felder
.
Einträge einer Adressdatenbank
MatLab-Protokoll: Abfrage Verbund
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
8
13
15
.
.
.
.
.
.
.
.
.
.
24
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
38
38
39
40
41
47
47
.
.
.
.
.
.
.
.
.
.
.
Darstellung des geschachtelten Felds mit cellplot
MatLab-Protokoll: Funktionsgriff
Graf der Funktion p(x ) = 1 + 2x + 3x
2
5.1
5.2
5.3
5.4
Die
Die
Die
Die
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
54
54
55
56
6.1
6.2
6.3
6.4
6.5
6.6
6.7
Datenkapsel Admini
.
Admini.dat
.
.
BLOCK DATA Bdadmini
Adpush
.
.
.
Adlpop
.
.
.
Adlset
.
.
.
Adeset
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
67
68
68
69
69
69
70
7.1
7.2
7.3
7.4
7.5
7.6
Satellit auf seiner Erdumlaufbahn
Bereich, in dem die Düse brennt
sin(x ) = 0.8x
.
.
.
sin(x ) − 0.8x = 0
.
.
Bisektion .
.
.
.
Regula falsi
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
71
71
72
72
74
74
8.1
8.2
Tangentenverfahren nach Newton
Zur Lage der Nullstellen
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
76
81
9.1
9.2
9.3
Sukzessive Approximation, |φ′ | < 1
Sukzessive Approximation, |φ′ | > 1
Beispiel f (x ) = log10 (x ) − cos(2x )
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
83
83
88
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
89
89
89
11.1 Eulersches Streckenzugverfahren
11.2 Verfahren von Runge-Kutta
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
96
96
Datei
Datei
Datei
Datei
skrfeia1.dat
skrfeia2.dat
skrfeia1.csv
skrfeia3.dat
10.1 Äquidistante Partition
10.2 Trapezregel
.
∗
10.3 T -Regel .
.
.
.
.
152
ABBILDUNGSVERZEICHNIS
14.1
14.2
14.3
14.4
153
Lineare Abbildung ohne Rangdefekt .
Lineare Abbildung mit Rangdefekt
.
gebrochen-rationale Ausgleichsfunktion
Fehler der Ausgleichsfunktion
.
16.1 Berechnung mit MatLab
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
118
119
129
129
.
.
.
.
.
.
.
.
139
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
141
141
141
141
141
142
142
143
144
144
145
146
148
148
148
148
148
17.1 Weibull-Dichte, k variiert
.
.
.
17.2 Weibull-Dichte, λ variiert
.
.
.
17.3 Weibull-Dichte, k = λ .
.
.
.
17.4 Weibull-Verteilung, λ konstant
.
.
17.5 Kodierung in MatLab
.
.
.
.
17.6 Gamma-Funktion
.
.
.
.
17.7 Γ(1 + 2x ) − (Γ(1 + x ))2
.
.
.
17.8 Lösung in MatLab
.
.
.
.
17.9 Die MatLab-Funktion WeibullOpt
.
.
17.10 Gefundene Lösung: k = 1.7573, λ = 4.6423
17.11 Überlagerungen mit k1 = λ1 = 1 und k2 = λ2 = 5
17.12 Lösung in MatLab
.
.
.
.
17.13Die MatLab-Funktion WeibullOpt2
.
17.14 Approximation für k1 und λ1 .
.
.
17.15 Approximation für k2 und λ2 .
.
.
17.16 Fehlerkurve während der Iteration
.
.
17.17 Messpunkte und Approximation
.
.
(W-Dichte)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Tabellenverzeichnis
3.1
3.2
3.3
3.4
3.5
3.6
Wortgrößen der Prozessoren
.
.
.
.
.
Darstellungsbereich der Festkommazahlen
.
.
.
Gleitkommaformate des math. Koprozessors
.
.
Einfache Datentypen
.
.
.
.
.
.
.
.
.
.
Variable“ Konstanten in MatLab
”
Einfache Datentypen in MatLab und erlaubte Operationen
4.1
4.2
Numerische Verknüpfungen von Matrizen
Funktionen zur Bearbeitung von Mengen
.
.
.
.
5.1
5.2
5.3
5.4
5.5
5.6
5.7
Konvertierungsroutinen (Kodierung)
Formatierungszeichen
.
.
.
Spezielle Formatierungszeichen
.
Spezielle Formatierungszeichen
.
Konvertierungsfunktionen (Dekodierung)
Bearbeiten von Textvariablen .
.
Formatierungszeichen
.
.
.
.
.
.
.
.
.
.
9.1
Nullstellenverfahren als Iterationen
.
.
154
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
23
24
29
30
32
32
.
.
.
.
.
.
.
.
.
.
.
.
35
39
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
48
49
50
50
51
53
55
.
.
.
.
.
.
.
83
Algorithmenverzeichnis
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
4.1
4.2
4.3
4.4
4.5
6.1
Die wohlstrukturierte Prozedur Pruefprim (Pascal)
Die wohlstrukturierte Prozedur Pruefprim (Fortran 77)
Die Prozedur Pruefpr0 (Fortran)
.
.
.
Flussdiagramm der Routine Pruefpr0 .
.
.
Struktogramm der Routine Pruefprim
.
.
Kein Struktogramm der Routine Pruefpr0
.
.
Struktogramm der verbesserten Routine Pruefprim
Addition von Zahlen aus einer Datei
.
.
.
Meldung auf alle angemeldeten Bildschirme .
.
Die verbesserten Routine Pruefprim in der Metasprache
Die Funktion Cel2Num
.
.
.
.
.
Die Funktion Mat2Cel
.
.
.
.
.
Die Funktion Cel2Mat
.
.
.
.
.
Die Funktion TakeInCel
.
.
.
.
Die Funktion DropInCel
.
.
.
.
BLOCK DATA-Anweisung
.
.
.
.
155
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9
9
10
14
16
16
17
20
20
21
42
42
43
45
46
60
Stichwortverzeichnis
A
Ablaufpläne, 5
abweisende Schleife, 11
Adaptierbarkeit, 2
Adressdatenbank, 39
Adressübergabe, 62
äquidistante Partition, 89
σ-Algebra, 131
Algorithmus, 7
allgemeine Schleife, 11
alternative
Anweisung, 19
einfache, 19
Wertzuweisung, 18
Alternative, 11
einfache, 11
mehrfache, 11
Alternativen, 3
alternativer
Ausdruck, 18
einfacher, 18
Anforderungsanalyse, 3
Angebot, 3
Anweisung, 11
alternative, 19
einfache, 19
bedingte, 19
Anweisungen
parallele, 11
Anweisungsteil, 10, 11
APL, 62
Approximation
sukzessive , 72
Assembler, 58
Assemblersprache, 58
Aufruf
hierarchischer, 3
Aufrufparametern, 60
Aufrufzeile, 10
Aufstellpläne, 5
Ausdruck, 18
alternativer, 18
einfacher, 18
bedingter, 18
Ausführen, 59
Ausführungsaspekt, vii
Ausgangsparameter, 61
ausgeglichene Lösung, 117, 118, 128
B
Basiskomplementärdarstellung, 25
Bedienungskomfort, 2
Bedienungsvorschriften, 4
bedingte
Anweisung, 19
Wahrscheinlichkeit, 132
Wertzuweisung, 18
bedingte Verarbeitung, 11
bedingte Wertzuweisung, 11
bedingter
Ausdruck, 18
benutzbar, vii
Benutzerfreundlichkeit, 2
Betrieb
irregulärer, 2, 4
regulärer, 2, 4
Bild, 117
Binder, 58
Bisektion, 72, 100
Bisektionsverfahren, 73
Bit, 23
Block, 11
BLOCK DATA, 60
Byte, 23
C
Call by Name, 62
Call by Reference, 62
Call by Value, 61
cellplot, 41
charakteristische Lebensdauer, 140
Cholesky factorization, 107
COMMON, 60
Compiler, 58
Cramersche Regel, 93
D
Darstellung
doppeltgenaue, 28
156
STICHWORTVERZEICHNIS
normalisierte, 28
Dateigriff, 55
Dateiidentifikator, 55
Daten
globale, 67
lokale, 67
Datenbit, 23
Datenkapsel, 60, 64, 67
Definitionsphase, 2, 3
Deflation, 115
Deformationsmatrix, 127
Deklarationsteil, 10
Determinante
Vandermondesche, 129
diagonaldominant, 100
Diagonalgestalt, 125
Differenzenverfahren, 100
direkte Summe
orthogonale, 117
Division
Links-, 36
Matrix-, 36
Rechts-, 36
Dokumentationsaspekt, vii
doppeltgenaue Darstellung, 28
Dualdarstellung, 27
duale Komplementärdarstellung, 25
duales Stellenkomplement, 26
Dualpunktdarstellung, 29
Durchgangsparameter, 61
E
effizient, vii, siehe Schätzfunktion
Effizienz, 2
Eigenvektoren, 123
Eigenwert, 108
Eigenwerten, 123
Ein/Ausgabe-Einheit, 58
einfache Alternative, 11
Eingangsparameter, 61
Einschrittverfahren, 96
einzeilige Matrizen, 34
Entwicklungsphase, 4
Entwurf
hierarchischer, 3
Ereignisalgebra, 131
Ereignisraum, 131
Ergebnisparametern, 60
erwartungstreu, siehe Schätzfunktion
Erwartungswert, 135
Erweiterbarkeit, 2
Euler-Verfahren
modifiziertes, 98
Eulersches Streckenzugverfahren, 96
157
exakte Lösung, 117
Exakte Polynom-Integration, 91
Exponentialansatz, 130
F
factorization
Cholesky, 107
LU-, 106
Fakultätsfunktion, vii
Falk
-Schema, 107
Fassformel
Keplersche, 91
Fehlerabschätzung
A posteriori -, 73
A priori -, 73
Fehlerquadrate, 117
Fehlerschranke, 73
Feinentwurf, 7
Felder
geschachtelte, 40
numerische, 34
Festkommazahlen, 23
Fixpunkt, 83
Flussdiagramm, 12
FOR, 11
formaler Parameter, 61
Formatieren, 48
Fortran, 62
Fourier-Ansatz, 130
fplot, 46
Fundamentalmatrizen, 121
Funktionen, 60
Funktionsgriff, 46
G
Gamma-Funktion, 140
geschachtelte Felder, 40
Gewährleistung, 5
Gleitkommazahl, 28
globale Daten, 67
GOTO-freie Programmierung, 3
Gradient, 121, 124
Grobentwurf, 4
Größen
skalare, 34
H
Heun, 99
Hexadezimaldarstellung, 27
hierarchischer Aufruf, 3
hierarchischer Entwurf, 3
I
INCLUDE Admini.dat, 68
158
Installieren, 59
Integration, 5
Romberg-, 94
Integrationstest, 5
Integrität, 3
Interpolationsformel
Lagrangesche, 93
Interpreter, 59
Inverse
Links-, 119
Rechts-, 119
irregulärer Betrieb, 2, 4
Ist-Zustand, 3
Iteration, 11
Iterationsverfahren, 72
K
Kabelpläne, 5
Keller, 64
Keplersche Fassformel, 91
Kern, 117
Kodieren, 48
Kodierungsphase, 7
Kompatibilität, 2
Komplementärdarstellung
duale, 25
Konfigurationskontrolle, 5
konsistent, siehe Schätzfunktion
konstante Schrittweite, 89
kontrahierend, 84
Konvergenzgeschwindigkeit, 72
korrekt, vii
Korrektheit, 2
L
Lader, 58, 59
Lagrangesche Interpolationsformel, 93
Lastenheft, 3
Laufzeit, vii
Laufzeitstapel, 64
Lebensdauer
charakteristische, 140
lifo, 64
Linksdivision, 36
Linksinverse, 118
lokale Daten, 67
LU-factorization, 106
LU-Zerlegung, 106
Lösung
ausgeglichene, 117, 118, 128
exakte, 117
M
Mantisse, 28
Maschinengenauigkeit, 29
STICHWORTVERZEICHNIS
Maschinenkode, 58
Maschinensprache, 58
Matrix
-division, 36
-multiplikation, 36
Matrizen, 34
einzeilige, 34
mehrfache Alternative, 11
Mengenschleife, 11
Messreihe, 127
Metasprache, 12
Mittelwert, 135
Mittelwertsatz
der Differenzialrechnung, 74, 76, 90
Modul, 3
Modula-2, 62
Modularisierung, 3
Modulkopf, 10
N
nachfolgende Prüfung, 11
Namensvereinbarung, 18
Namensübergabe, 62
Nebeneffekt, 61, 62
Nebenwirkung, 63
Negative, 26
von-Neumann-Architektur, 58
Newton-Verfahren, 72, 100
normalisierte Darstellung, 28
Normalspannung, 123
Normalverteilung, 134
Nullstelle, 101
Nullstellenproblem, 72
Nullstellenverfahren, 72
numerische Felder, 34
O
Objekte, 58
Oktaldarstellung, 27
orthogonale
direkte Summe, 117
orthogonale Projektion, 118
Orthonormalbasis, 125
P
parallele Anweisungen, 11
Parameter
formaler, 61
Partition, 89
äquidistante, 89
Pascal, 62
Pflichtenheft, 3
Phasenmodell, 1
plot, siehe fplot
Polarzerlegung, 127
STICHWORTVERZEICHNIS
Polynom-Ansatz, 128
Polynom-Integration
Exakte, 91
portabel, vii
Portabilität, 2
Potenzansatz, 130
Programm, 61
Programmierung
GOTO-freie, 3
Projektion
orthogonale, 118
Prozedur, 60
Prozeduraufruf, 11
Prüfung
nachfolgende, 11
vorausgehende, 11
Pseudoinverse, 120, 126
Pseudokode, 12
R
Radius
Spektral-, 111
Rang, 117
voller, 118
Rangdefekt, 117, 119
Rechenwerk, 58
Rechnerkern, 58
Rechtsinverse, 118
Regel
Cramersche, 93
SimpsonIntervallhalbierung, 93
Trapez-, 89
Register, 58
Regula falsi, 72, 74
regulärer Betrieb, 2, 4
Rekursion, 65
rekursiv, vii
robust, vii
Robustheit, 2
Romberg-Integration, 94
Runge-Kutta, 97
S
Schießverfahren, 99
Schleife, 11, 19
abweisende, 11
allgemeine, 11
nachfolgende Prüfung:, 19, 22
nicht abweisend, 11
vorausgehende Prüfung:, 19, 22
Schleifen, 3
Schnittstelle, 60
Schnittstellenbeschreibungen, 5
159
Schrittweite
konstante, 89
Schubspannungen, 123
Schätzfunktion, 137
effizient, 137
erwartungstreu, 137
konsistent, 137
semidefinit, 126
Sequenz, 11
Simpson
-Regel, 91, 92
Intervallhalbierung, 93
Singulärwertzerlegung, 126, 127
Singulärwertzerlegungen, 126
skalare Größen, 34
Software-Lebenszyklus, 1
Softwarepflege, 6
Soll-Zustand, 3
Sortieralgorithmus, 65
Spannung
Normal-, 123
Schub-, 123
Spannungsmatrix, 123, 127
Spannungstensor, 123
Speichereinheit, 23, 58
Speichergröße, 23
Speicherplatz, vii
Spektralradius, 111
Spektralverschiebung, 115
Spiegelung, 112
Sprunganweisung, 11
stack, 64
Standardnormalverteilung, 134
Stapel, 64
Steffensen-Verfahren, 72, 100
Stellenkomplement, 26
duales, 26
stetige Zufallsvariable, 134
Steuerwerk, 58
Stichprobe, 133
Streckenzug, 96
Streckenzugverfahren
Eulersches, 96
Streuung, 135
struct, 39
Struktogramm, 12
Strukturierung, 3
Studie, 3
Stützstellen, 89
Summe
direkte
orthogonale, 117
160
T
Testplan, 4
Textzeichens, 23
Top Down Methode, 1
Trapezregel, 89
bei äquidistanter Partition, 90
einfache, 89
Tridiagonalgestalt, 100
U
Überlauf, 24
Übersetzer, 58
unitriangular, 106
Unterprogramme, 60
UNTIL, 11
V
Vandermondesche Determinante, 129
Varianz, 135
Vektor, 34
Verarbeitung
bedingte, 11
Verbund, 39
Verfahren
Differenzen-, 100
modifiziertes Euler-, 98
Schieß-, 99
Verifizierbarkeit, 3
Verschiebungssatz, 135
Verschlüsseln, 48
Verteilungsfunktion, 134
Verträglichkeit, 2
Verzerrungsmatrix, 127
voller Rang, 118
Vollständigkeit, 4
vorausgehende Prüfung, 11
Vorzeichen, 23, 28
vorzeichenlose Zahl, 23
W
Wahrscheinlichkeit
-sraum, 132
-sverteilung, 132
bedingte, 132
diskret, 133
gleichverteilt, 133
Wahrscheinlichkeitsdichte, 134
Weibull-, 140
Wahrscheinlichkeitsverteilung, 131
Weibull-, 140
Wartbarkeit, 2
Wartbarkeitsaspekt, 2
Wartungskosten, vi
Weibull
STICHWORTVERZEICHNIS
-Wahrscheinlichkeitsdichte, 140
-Wahrscheinlichkeitsverteilung, 140
Wertzuweisung, 11, 18
alternative, 18
bedingte, 11, 18
Wertübergabe, 61
WHILE, 11
Widerspruchsfreiheit, 4
Wiederverwendbarkeit, 2
Wirtschaftlichkeitsaspekt, 2
Wort, 23
Z
Zahl
ganze
vorzeichenlose, 23
Zerlegung
LR-, 121
LU-, 106
Polar-, 127
QR-, 121
Vollrang-, 121
Zufallsvariable, 133
stetige, 134
Zugriffsfunktion, 67
Zählschleife, 11