Klassische Mechanik mit C++: Basics und Anwendungen 9783662609040, 9783662609057, 3662609045

Das vorliegende Buch gibt Studierenden der Physik und der Ingenieurwissenschaften einen pragmatischen und anwendungsorie

197 32 4MB

German Pages 516 [502] Year 2020

Report DMCA / Copyright

DOWNLOAD PDF FILE

Table of contents :
Vorwort
Inhaltsverzeichnis
Teil I C++
1 Eine Tour durch C++
1.1 Einleitung
1.2 Standardein- und -ausgabe
1.2.1 Beispielanwendungen
1.3 Fehlerbehandlung durch Exceptions
1.3.1 Beispielanwendungen
1.4 STL-Container und Iteratoren
1.4.1 Beispiele
1.5 Teilaufgaben mit Funktionen lösen
1.5.1 Beispielanwendungen
1.6 λ-Funktionen
1.6.1 Beispiele
1.6.2 Abschätzung von Zwischenwerten für einen vorgegebenen Datensatz
1.7 Rechnen mit komplexen Zahlen
1.7.1 Beispielanwendungen
1.8 Benutzerdefinierte Literale
1.8.1 Umrechnen in SI-Einheiten
1.8.2 Beispielanwendungen
1.9 Statische Variablen und Funktionen
1.9.1 Beispielanwendungen
1.9.2 Statische Variablen und Funktionen innerhalb von Strukturen
1.9.3 Speicherung von Konfigurationsdaten
1.9.4 Mathematische Hilfsfunktionen
1.9.5 Physikalische Konstanten und Hilfsfunktionen
1.9.6 Beispielanwendungen
1.10 Präprozessor-Anweisungen
1.10.1 Ein Beispielprogramm mit Makros und Makrofunktionen
1.10.2 Vordefinierte Makros
1.10.3 Beispielanwendungen
1.11 Schreiben und Lesen von Daten in Dateien
1.11.1 Beispielanwendungen
1.12 Aufzählungen
1.13 Zeichenketten in C++
1.13.1 Beispielanwendungen
1.14 Übungsaufgaben
2 Klassen in C++
2.1 Einleitung
2.2 Einfache Klassen
2.2.1 Zugriff auf Elemente der Klassen
2.2.2 Eine Klasse für das mathematische Pendel
2.2.3 Die Beschreibung einer Hook’schen Feder
2.2.4 Eine Klasse für rationale Zahlen
2.2.5 Eine Klasse zur Beschreibung von rechtwinkligen Dreiecken
2.2.6 Abbildung von Prozessen mit Klassen
2.2.7 Klasse als interaktive Benutzerschnittstelle
2.3 Klassentemplates
2.3.1 Eine Klasse zur Darstellung von Polynomen
2.3.2 Erzeugen von Zwischenspeicher für Funktionswerte mit Klassentemplates
2.3.3 Rechnen mit Rationalen Zahlen
2.3.4 Beispiele
2.4 Vererbung
2.4.1 Berechnung von Potenzreihen bekannter Funktionen
2.4.2 Nullstellen eines quadratischen Polynoms mit reellen Koeffizienten
2.5 Programmieren mit Komponenten
2.5.1 Ein Test mit rationalen Zahlen
2.6 Schnittstellen für Klassen mithilfe von Templates definieren
2.6.1 Beispielanwendung
2.7 Eigene Werkzeuge bauen
2.7.1 Fehlerbehandlung
2.7.2 Eine Klasse zum Formatieren von Daten
2.7.3 Schreiben von Daten in Dateien
2.8 Übungsaufgaben
3 Tabellen und Views
3.1 Einleitung
3.2 Eine Klasse für Zahlentabellen
3.3 Eine Klasse für Sichten auf Tabellen
3.4 Erstellen von Views auf Zahlentabellen
3.5 Beispiele
3.5.1 Generieren einer Tabelle und Speicherung in eine Datei
3.5.2 Speicherung einer veränderten Tabelle in eine Datei
3.5.3 Bearbeitung einer Tabelle
3.5.4 Suchen und Bearbeiten von Elementen einer Tabelle
3.5.5 Laden einer Tabelle aus Datei
3.5.6 Sichten auf Tabellen
3.5.7 Kopie einer Spalte
3.6 Beispiele aus der Physik
3.6.1 Teilchen wird vertikal nach oben geworfen
3.6.2 Kraft beschleunigt eine Masse auf reibungsfreiem Boden
3.6.3 Geschoss trifft auf ruhenden Holzblock
3.6.4 Kraft und potenzielle Energie im Gravitationsfeld der Erde
3.6.5 Massenschwerpunkt einer diskreten Massenverteilung
3.7 Übungsaufgaben
4 Klassen zur Modellierung von physikalischen Systemen
4.1 Einleitung
4.2 Eine Basisklasse für Computermodelle
4.3 Eine Komponente zur Speicherung von Rechenergebnissen
4.4 Beispiele
4.4.1 Stab lehnt gegen eine senkrechte Wand
4.4.2 Das ballistische Pendel
4.5 Übungsaufgaben
Teil II Schnittstellen zur GNU Scientific Library
5 Die Vektor-Klasse
5.1 Einleitung
5.2 Vom gsl-Programm zur Klasse
5.3 Entwurf
5.4 Kommunikation zwischen gsl und Komponenten
5.5 Komponente zum Lesen und Schreiben von Vektoren
5.6 Komponente zum Rechnen mit Vektoren
5.7 Schnittstellen zur stl
5.8 Minima und Maxima
5.9 Eigenschaften von Vektoren
5.10 BLAS-Schnittstelle
5.11 Sicht auf einen Vektor
5.12 Die Vektor-Klasse
5.13 Beispiele
5.13.1 Einsatz von Konstruktoren
5.13.2 Einsatz von Views
5.13.3 Mathematische Operationen mit Vektoren
5.13.4 Zugriff auf einzelne Elemente, Minima und Maxima
5.13.5 Beispiele aus der Vektorrechnung
5.13.6 Drehmoment durch Kraft auf Teilchen bezüglich des Ursprungs
5.13.7 Drehimpuls eines Teilchens bezüglich des Ursprungs
5.13.8 Kräfte wirken auf Massenpunkt (in kartesischen Koordinaten)
5.13.9 Kräfte wirken auf Massenpunkt (in Polarkoordinaten)
5.13.10 Gravitationsfeld zweier Massen
5.14 Übungsaufgaben
6 Die Matrix-Klasse
6.1 Einleitung
6.2 Ein C-ähnliches Beispiel
6.3 Basisfunktionalität
6.4 Rechnen mit Matrizen
6.5 Minimales und maximales Element einer Matrix
6.6 Austausch von Reihen und Spalten
6.7 Sichten und Kopien von Reihen und Spalten
6.8 Schnittstelle zur BLAS
6.9 Eigenschaften von Matrizen
6.10 Die Matrix-Klasse
6.11 Beispiele
6.11.1 Initialisierungen und Zuweisungen
6.11.2 Direktes Aufrufen von GNU Scientific Library Funktionen
6.11.3 Eigenschaften der Matrix, Zugriff auf Elemente und Zuweisung von Werten
6.11.4 Algebraische Operationen
6.11.5 Euler’sche Drehmatrizen
6.11.6 Manipulation von Reihen und Spalten einer Matrix
6.12 Übungsaufgaben
7 Lösung von linearen Gleichungssystemen
7.1 Einleitung
7.2 LU-Zerlegung mit der GNU Scientific Library
7.3 Entwurf einer C++-Klasse
7.4 Beispielanwendungen
7.4.1 Lösung eines 3 × 3-linearen Gleichungssystems mit der LU-Zerlegung
7.4.2 Lösung eines 3 × 3-linearen Gleichungssystems mit der Cramer’schen Regel
7.4.3 Lösung eines 3 ×3-linearen Gleichungssystems mit der inversen Matrix
7.5 Beispiele aus der Physik
7.5.1 Masse an drei Seilen
7.5.2 Massen befestigt an Seilen und Haftreibung
7.5.3 Beschleunigte schiefe Ebene
7.6 Übungsaufgaben
8 Nullstellenberechnung reeller Funktionen
8.1 Einleitung
8.2 Zwei Beispielprogramme
8.3 Eine Klasse für das Bisektionsverfahren
8.4 Eine Klasse für das Newton-Verfahren
8.5 Beispiele
8.5.1 Berechnung von √5 mit dem Bisektionsverfahren
8.5.2 Berechnung von √5 mit dem Newton-Verfahren
8.5.3 Zwei sich aufeinander zubewegende Teilchen
8.6 Übungsaufgaben
9 Numerische Integration
9.1 Einleitung
9.2 Numerische Integration mit der GNU Scientific Library
9.2.1 Vom C-Programm zu C++
9.3 Klassen als Schnittstellen zur GNU Scientific Library
9.4 Berechnung von Beispielintegralen
9.5 Beispiele aus der Physik
9.5.1 Teilchen bremst auf geradliniger Strecke
9.5.2 Zwei Blöcke und eine Feder
9.5.3 Geschwindigkeitsänderung durch Kraftstoß
9.5.4 Teilchen bewegt sich geradlinig mit zeitabhängiger Beschleunigung
9.5.5 Teilchen bewegt sich geradlinig mit einer geschwindigkeitsabhängigen Beschleunigung
9.5.6 Perle bewegt sich reibungsfrei entlang einer Schiene unter dem Einfluss einer Feder
9.5.7 Massenschwerpunkt bei kontinuierlichen Massenverteilungen
9.5.8 Potenzielle Energie einer Masse im Gravitationsfeld der Erde
9.6 Übungsaufgaben
10 Anfangswertprobleme für gewöhnliche Differenzialgleichungen
10.1 Einleitung
10.2 Ein gsl-Programm zur numerischen Lösung einer Differenzialgleichung
10.3 Die Schnittstelle zur GNU Scientific Library
10.4 Beispiele
10.5 Beispiele aus der Physik
10.5.1 Konstante Kraft wirkt auf Holzblock
10.5.2 Der schiefe Wurf ohne Luftwiderstand
10.5.3 Bewegung einer Rakete in einem konstanten Gravitationsfeld
10.6 Übungsaufgaben
11 Interpolation
11.1 Einleitung
11.2 Interpolation mit der GNU Scientific Library
11.3 Die Schnittstelle zur GNU Scientific Library
11.4 Beispiele
11.4.1 Interpolation diskreter Daten
11.4.2 Beschreibung einer geradlinigen Bewegung durch Interpolation
11.5 Übungsaufgaben
Teil III Klassische Mechanik mit C++
12 Eindimensionale Bewegungen
12.1 Geradlinige Bewegung mit konstanter äußerer Kraft und Gleitreibung
12.2 Teilchen bewegt sich unter dem Einfluss einer ortsabhängigen Kraft
12.3 Teilchen bewegt sich unter dem Einfluss einer zeitabhängigen Kraft
12.4 Übungsaufgaben
13 Bewegung in einem Medium mit Reibung
13.1 Bewegung mit Reibung nach Stokes
13.2 Bewegung mit Reibung nach Newton
13.3 Übungsaufgaben
14 Schwingungen
14.1 Harmonische Schwingung
14.2 Schwingung in vertikaler Richtung eines Systems aus zwei Massen
14.3 Harmonische Schwingungen mit Dämpfung
14.4 Übungsaufgaben
Literaturverzeichnis
Index
Recommend Papers

Klassische Mechanik mit C++: Basics und Anwendungen
 9783662609040, 9783662609057, 3662609045

  • 0 0 0
  • Like this paper and download? You can publish your own PDF file online for free in a few minutes! Sign Up
File loading please wait...
Citation preview

Elias Posoukidis

Klassische Mechanik mit C++ Basics und Anwendungen

Klassische Mechanik mit C++

Elias Posoukidis

Klassische Mechanik mit C++ Basics und Anwendungen

Elias Posoukidis Essen, Deutschland

Ergänzendes Material zu diesem Buch finden Sie auf http://www.springer.com/978-3-662-60904-0. ISBN 978-3-662-60904-0 ISBN 978-3-662-60905-7  (eBook) https://doi.org/10.1007/978-3-662-60905-7 Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar. © Springer-Verlag GmbH Deutschland, ein Teil von Springer Nature 2020 Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Jede Verwertung, die nicht ausdrücklich vom Urheberrechtsgesetz zugelassen ist, bedarf der vorherigen Zustimmung des Verlags. Das gilt insbesondere für Vervielfältigungen, Bearbeitungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Verarbeitung in elektronischen Systemen. Die Wiedergabe von allgemein beschreibenden Bezeichnungen, Marken, Unternehmensnamen etc. in diesem Werk bedeutet nicht, dass diese frei durch jedermann benutzt werden dürfen. Die Berechtigung zur Benutzung unterliegt, auch ohne gesonderten Hinweis hierzu, den Regeln des Markenrechts. Die Rechte des jeweiligen Zeicheninhabers sind zu beachten. Der Verlag, die Autoren und die Herausgeber gehen davon aus, dass die Angaben und Informationen in diesem Werk zum Zeitpunkt der Veröffentlichung vollständig und korrekt sind. Weder der Verlag, noch die Autoren oder die Herausgeber übernehmen, ausdrücklich oder implizit, Gewähr für den Inhalt des Werkes, etwaige Fehler oder Äußerungen. Der Verlag bleibt im Hinblick auf geografische Zuordnungen und Gebietsbezeichnungen in veröffentlichten Karten und Institutionsadressen neutral. Planung/Lektorat: Lisa Edelhäuser Springer Spektrum ist ein Imprint der eingetragenen Gesellschaft Springer-Verlag GmbH, DE und ist ein Teil von Springer Nature. Die Anschrift der Gesellschaft ist: Heidelberger Platz 3, 14197 Berlin, Germany

Vorwort Möchte man ein physikalisches Problem quantitativ beschreiben, bedeutet dies, seine charakteristischen Eigenschaften zu identifizieren und diese als Parameter von Gleichungen in einem mathematischen Modell darzustellen. Ist eine analytische Lösung der Gleichungen nicht möglich, werden numerische Methoden eingesetzt und Näherungslösungen berechnet. Wie gut diese Lösungen bzw. das Modell sind, hängt davon ab, wie gut die Vorhersagen des Modells mit den experimentellen Ergebnissen übereinstimmen. Ein Computermodell ist die Abbildung des mathematischen Modells mithilfe von Computerprogrammen. Betrachtet man Physikaufgaben als Beschreibungen von stark idealisierten physikalischen Prozessen, tragen sie dazu bei, ein Gespür dafür zu entwickeln, welche Parameter für die Modellierung eines Prozesses relevant sind, was Voraussetzung für die Lösung eines Problems ist. Sie bilden deshalb eine ideale Basis, um die Konstruktion von Modellen zu üben. Ein Lehrbuch über Computerphysik muss Methoden vorstellen, die zeigen, wie Computeralgorithmen zur Lösung physikalischer Probleme entworfen werden. Hier gibt es zwei Alternativen bezüglich der Themenauswahl: Eine ist, aus dem Spektrum der Aufgaben diejenigen herauszusuchen, für die keine analytische Lösung existiert oder bekannt ist und diese dann mittels numerischer Methoden zu lösen. Eine andere ist, Aufgaben, so wie sie in den meisten Lehrbüchern zu finden sind, zu nehmen und diese neben den analytischen auch mit numerischen Methoden zu untersuchen. An dieser Stelle setzt dieses Buch an. Es zeigt, wie aus analytisch hergeleiteten Formeln ein Computermodell entworfen wird und wie neben den analytischen Lösungen der Gleichungen auch mittels numerischer Verfahren Daten generiert werden. Jede der behandelten Aufgaben wird detailliert gelöst. Dies soll Zeit und Nerven sparen und, was noch wichtiger ist, den Übergang zum Computermodell durch die Gegenüberstellung von Lösung und Quelltext verständlich machen. Die Auswahl der Aufgaben wurde so getroffen, dass ein gewisser Grad an Komplexität vorhanden ist, sodass die dazugehörigen Algorithmen nicht mit wenigen Zeilen umzusetzen sind. Am Ende soll der Leser in der Lage sein, das Erlernte in eigene Arbeiten einfließen zu lassen. Der vorliegende erste Band ist in drei Teile gegliedert und beginnt mit einer Tour durch C++. Auf eine allgemeine Einführung in C++ wurde wegen des Umfangs der Sprache verzichtet. Stattdessen werden anhand von Beispielen ausgewählte Elemente der Sprache vorgestellt, welche für das Verständnis der Programme im weiteren Verlauf des Buches wichtig sind. Jedes Kapitel wird mit Beispielen aus der Mathematik oder Physik begleitet. Der zweite Teil des Buches befasst sich mit numerischen Algorithmen. Hier wurde der Versuchung widerstanden, die Algorithmen selbst zu programmieren, denn dies hätte eine weitere Hürde für den Leser bedeutet und die Einarbeitungszeit verlängert. Statt dessen wird die GNU Scientific Library (in diesem Buch auch gsl abgekürzt) eingesetzt. Es handelt sich hierbei um eine in C geschriebene Bibliothek numerischer Algorithmen, die fast alles auf diesem Gebiet abdeckt. Die Verwandtschaft von C++ und C wird genutzt und gezeigt, wie durch das Kapseln der C-Funktionen in C++-Klassen das Programmieren mit

vi

Vorwort

der Bibliothek vereinfacht wird. Nicht die ganze Funktionalität der gsl wird abgedeckt, sondern nur die Teile, die für das Lösen der Aufgaben des Buches notwendig sind. Der Aufbau der Klassen orientiert sich an Beispielen, die auf der Webseite der GNU Scientific Library zu finden sind. Am Anfang von jedem Kapitel wird gezeigt, wie der Übergang von einem solchen Beispiel zu einer C++-Klasse durchgeführt wird. Am Ende sind Beispiele aus der Physik zu finden. Der dritte und letzte Teil baut auf das Wissen der beiden ersten Teile auf und zeigt, wie Computermodelle auf Basis von Physikaufgaben konstruiert werden, was im zweiten Band mit weiteren Beispielen fortgesetzt wird. Die Entscheidung modernes C++ einzusetzen folgt nicht dem derzeitigen Trend, Programme mit Skript-Sprachen zu erstellen. C++ wurde und wird immer noch als schwer zu erlernen betrachtet. Die Sprache hat sich in den letzten Jahren jedoch gewandelt. Ideen aus anderen Programmiersprachen sind in die neuen Versionen eingeflossen und das Programmieren mit C++ ist einfacher geworden. Die Länge der Quelltexte ist deutlich kürzer geworden und unterscheidet sich nicht wesentlich vom Umfang der Quelltexte anderer Sprachen, wenn diese nicht nur zur Demonstration eines Konzepts gedacht sind. Besonderer Wert wurde darauf gelegt, dass die Programme in diesem Buch nicht monolithisch aufgebaut sind, sondern aus wiederverwendbaren Komponenten bestehen. Gleichzeitig wurde auf tiefe Vererbungshierarchien verzichtet, um das Verständnis der Quelltexte zu vereinfachen. Die Quelltexte sind ausführlich kommentiert und werden in kleinen Abschnitten im Text eingebunden. Sie sollen genau wie mathematische Formeln als Fortsetzung des Textes gesehen werden. Die Kommentare in den Quelltexten ergänzen den laufenden Text. Das Buch richtet sich an Studierende der Physik und verwandter naturwissenschaftlicher Fächer, die bereits einen Grundkurs in klassischer Mechanik absolviert haben und mit der Differenzial- und Integralrechnung vertraut sind. Der Leser sollte über Grundkenntnisse in C++ verfügen oder bereit sein, sich diese anzueignen. Für die Übersetzung der Quelltexte ist ein C++-Compiler erforderlich, der den Standard C++17 unterstützt. Als IDE wurde der Qt Creator und als Compiler clang in der Version 6.0 unter Linux Mint 19 eingesetzt. Alle Quelltexte stehen unter www.springer.com/978-3-662-60904-0 zum Download bereit. Dieser Text wurde mit LATEX und dem TeXstudio-Editor erstellt. Obwohl dieses Buch mit höchster Sorgfalt geschrieben wurde, kann es trotzdem Fehler enthalten. Verbesserungsvorschläge, Bemerkungen und Hinweise sind stets willkommen. Dem Springer Verlag und insbesondere Frau Dr. Lisa Edelhäuser und Frau Anja Dochnal möchte ich für die freundliche Unterstützung danken. Mein besonderer Dank gilt meiner Familie, die während der Entstehung dieses Buches große Geduld bewiesen hat. Dezember 2019, Elias Posoukidis

Inhaltsverzeichnis Vorwort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

v

I

C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1

1 Eine Tour durch C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Standardein- und -ausgabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Fehlerbehandlung durch Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . 1.4 STL-Container und Iteratoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5 Teilaufgaben mit Funktionen lösen . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6 λ-Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.7 Rechnen mit komplexen Zahlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.8 Benutzerdefinierte Literale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.9 Statische Variablen und Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . 1.10 Präprozessor-Anweisungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.11 Schreiben und Lesen von Daten in Dateien . . . . . . . . . . . . . . . . . . 1.12 Aufzählungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.13 Zeichenketten in C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.14 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 3 4 7 10 14 19 30 32 34 44 47 51 51 60

2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8

Klassen in C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einfache Klassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Klassentemplates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vererbung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programmieren mit Komponenten . . . . . . . . . . . . . . . . . . . . . . . . . . Schnittstellen für Klassen mithilfe von Templates definieren . . . . Eigene Werkzeuge bauen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

61 61 62 87 102 111 119 128 143

3 3.1 3.2 3.3 3.4 3.5 3.6 3.7

Tabellen und Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Klasse für Zahlentabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Klasse für Sichten auf Tabellen . . . . . . . . . . . . . . . . . . . . . . . . Erstellen von Views auf Zahlentabellen . . . . . . . . . . . . . . . . . . . . . . Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Beispiele aus der Physik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

145 145 145 152 157 159 166 176

viii

Inhaltsverzeichnis

4 4.1 4.2 4.3 4.4 4.5

Klassen zur Modellierung von physikalischen Systemen . Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Basisklasse für Computermodelle . . . . . . . . . . . . . . . . . . . . . . Eine Komponente zur Speicherung von Rechenergebnissen . . . . . Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

177 177 178 180 183 193

II

Schnittstellen zur GNU Scientific Library . . . . . . . . . . . . . . 195

5 Die Vektor-Klasse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Vom gsl-Programm zur Klasse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Entwurf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4 Kommunikation zwischen gsl und Komponenten . . . . . . . . . . . . . . 5.5 Komponente zum Lesen und Schreiben von Vektoren . . . . . . . . . . 5.6 Komponente zum Rechnen mit Vektoren . . . . . . . . . . . . . . . . . . . . 5.7 Schnittstellen zur stl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.8 Minima und Maxima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.9 Eigenschaften von Vektoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.10 BLAS-Schnittstelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.11 Sicht auf einen Vektor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.12 Die Vektor-Klasse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.13 Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.14 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

197 197 198 200 201 204 206 211 212 213 214 216 217 222 240

6 Die Matrix-Klasse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 Ein C-ähnliches Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3 Basisfunktionalität . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4 Rechnen mit Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5 Minimales und maximales Element einer Matrix . . . . . . . . . . . . . . 6.6 Austausch von Reihen und Spalten . . . . . . . . . . . . . . . . . . . . . . . . . 6.7 Sichten und Kopien von Reihen und Spalten . . . . . . . . . . . . . . . . . 6.8 Schnittstelle zur BLAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.9 Eigenschaften von Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.10 Die Matrix-Klasse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.11 Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.12 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

243 243 244 246 249 252 254 255 258 262 263 268 283

Inhaltsverzeichnis

ix

7 7.1 7.2 7.3 7.4 7.5 7.6

Lösung von linearen Gleichungssystemen . . . . . . . . . . . . . . . Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LU-Zerlegung mit der GNU Scientific Library . . . . . . . . . . . . . . . . Entwurf einer C++-Klasse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Beispielanwendungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Beispiele aus der Physik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

285 285 287 289 295 300 319

8 8.1 8.2 8.3 8.4 8.5 8.6

Nullstellenberechnung reeller Funktionen . . . . . . . . . . . . . . . Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zwei Beispielprogramme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Klasse für das Bisektionsverfahren . . . . . . . . . . . . . . . . . . . . . Eine Klasse für das Newton-Verfahren . . . . . . . . . . . . . . . . . . . . . . Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

321 321 322 327 331 335 340

9 9.1 9.2 9.3 9.4 9.5 9.6

Numerische Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Numerische Integration mit der GNU Scientific Library . . . . . . . . Klassen als Schnittstellen zur GNU Scientific Library . . . . . . . . . Berechnung von Beispielintegralen . . . . . . . . . . . . . . . . . . . . . . . . . . Beispiele aus der Physik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

341 341 342 346 353 358 375

10 Anfangswertprobleme für gewöhnliche Differenzialgleichungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2 Ein gsl-Programm zur numerischen Lösung einer Differenzialgleichung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3 Die Schnittstelle zur GNU Scientific Library . . . . . . . . . . . . . . . . . 10.4 Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.5 Beispiele aus der Physik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Interpolation mit der GNU Scientific Library . . . . . . . . . . . . . . . . . 11.3 Die Schnittstelle zur GNU Scientific Library . . . . . . . . . . . . . . . . . 11.4 Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.5 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

377 377 379 382 386 389 411 413 413 414 416 420 423

x

Inhaltsverzeichnis

III Klassische Mechanik mit C++ . . . . . . . . . . . . . . . . . . . . . . . . . . 425 12 Eindimensionale Bewegungen . . . . . . . . . . . . . . . . . . . . . . . . . . 12.1 Geradlinige Bewegung mit konstanter äußerer Kraft und Gleitreibung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2 Teilchen bewegt sich unter dem Einfluss einer ortsabhängigen Kraft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3 Teilchen bewegt sich unter dem Einfluss einer zeitabhängigen Kraft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

427

440 446

13 Bewegung in einem Medium mit Reibung . . . . . . . . . . . . . . 13.1 Bewegung mit Reibung nach Stokes . . . . . . . . . . . . . . . . . . . . . . . . . 13.2 Bewegung mit Reibung nach Newton . . . . . . . . . . . . . . . . . . . . . . . 13.3 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

449 449 456 464

427 434

14 Schwingungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467 14.1 Harmonische Schwingung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467 14.2 Schwingung in vertikaler Richtung eines Systems aus zwei Massen475 14.3 Harmonische Schwingungen mit Dämpfung . . . . . . . . . . . . . . . . . . 482 14.4 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501

Teil I C++

1 Eine Tour durch C++

Übersicht 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14

1.1

Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Standardein- und -ausgabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fehlerbehandlung durch Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . STL-Container und Iteratoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Teilaufgaben mit Funktionen lösen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . λ-Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rechnen mit komplexen Zahlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Benutzerdefinierte Literale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Statische Variablen und Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Präprozessor-Anweisungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Schreiben und Lesen von Daten in Dateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aufzählungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zeichenketten in C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 4 7 10 14 19 30 32 34 44 47 51 51 60

Einleitung

Eine so mächtige Programmiersprache wie C++ in wenigen Seiten vorzustellen, ist unmöglich. Das Angebot an Funktionen und Programmiermethoden ist so groß, dass zwangsläufig eine Auswahl stattfinden muss. Doch welche Teile der Sprache sind wichtig und welche nicht? Eine eindeutige Antwort auf diese Frage gibt es nicht, denn die Sprache wird von einem Systemprogrammierer anders als von einem Naturwissenschaftler und nochmal anders von einem Spielentwickler genutzt. Es macht deswegen Sinn, sich auf Themen zu konzentrieren, die für eigene Projekte nützlich sind, was Gegenstand dieses Kapitels ist. Ziel des Buchs ist, mithilfe von C++ eine Sammlung von Komponenten zu programmieren, welche die Erstellung von physikalischen Modellen vereinfacht. Dies ist dann erreicht, wenn z.B. die Lösung eines linearen Gleichungssystems mit 3-4 Programmzeilen implementiert ist. Idealerweise entsteht am Ende keine lose Sammlung von Komponenten, sondern nur solche die Wiederholungen von Quelltexten minimieren. Wir wollen dabei nicht das Rad neu erfinden, sondern nur die eigene Kreativität in den Aufbau von Programmen einfließen lassen. (Seit C++17 können Funktionen, Klassen usw.

© Springer-Verlag GmbH Deutschland, ein Teil von Springer Nature 2020 E. Posoukidis, Klassische Mechanik mit C++, https://doi.org/10.1007/978-3-662-60905-7_1

4

1 Eine Tour durch C++

direkt in Header-Dateien geschrieben werden, ohne die One Definition Rule zu verletzen, wovon wir Gebrauch machen werden. Der Begriff Programm wird oft als Synonym für eine Funktion gebraucht, wenn diese durch Kompilierung eine ausführbare Datei erzeugen kann. Die Verwendung von englischen Begriffen in der Computerliteratur hat sich so durchgesetzt, das es sich teilweise nicht vermeiden lässt, bestimmte Wörter im Text einfließen zu lassen, wie z.B. Compiler an Stelle von Übersetzer oder View für Sicht usw.)

1.2

Standardein- und -ausgabe

Eine typische Aufgabe von Computerprogrammen ist, Daten über die Tastatur einzulesen, diese zu verarbeiten und anschließend auf dem Bildschirm anzuzeigen. Die Ein- und Ausgabe der Daten basiert auf der Idee, eine Folge von Bytes von einem Eingabemedium, hier die Tastatur, in einem Ausgabemedium wie den Bildschirm «fließen» zu lassen. In C++ wird dies mit Elementen der iostream-Bibliothek umgesetzt. Die Kombination aus std::cout, einem globalen Objekt dieser Bibliothek, und des überladenen Operators Daten an Variablen weiterleitet.

1.2.1

Beispielanwendungen

Ausgabe von Zahlen auf dem Bildschirm Wir wollen in diesem Abschnitt mit einem Programm beginnen, welches statt eines Hello World Zahlen und ihre Quadrate in die Standardausgabe schreibt. Wir durchlaufen in einer Schleife die Werte von -2 bis 2 und geben diese und ihre Quadrate in jeweils einer neuen Zeile aus. Die Breite jeder Ausgabe wird über std::setw festgelegt. /** * @brief ex1 Zahlen und ihre Quadrate werden in die Standardausgabe * geschrieben */ inline void ex1 () { for ( double x = -2; x