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
© Copyright 2025 ExpyDoc