1 Einführung
Dieses Kapitel gibt Ihnen einen kurzen Überblick über die Inhalte des Buches. Es stellt außerdem zwei Entwicklungsumgebungen vor und beschreibt die Problematik der Rundungsfehler. Eine Übersicht über die Schlüsselwörter von Python soll die erste Orientierung erleichtern. Zum Ende des Kapitels werden verschiedene Aspekte des Algorithmusbegriffs analysiert.
Wenn Sie in die Welt der Algorithmen eintauchen wollen, dann möchten Sie sicherlich auch lernen, wie Sie Algorithmen in ein Computerprogramm umsetzen können. Dazu müssen Sie eine Programmiersprache beherrschen. Bei der Auswahl einer Programmiersprache haben Sie unglaublich viele Möglichkeiten, denn es gibt inzwischen Hunderte Sprachen für unterschiedliche Einsatzgebiete.
Die Entscheidung ist zwar mit dem Titel des Buches bereits gefallen, sie lässt sich aber leicht begründen, denn Python ist laut PYPL-Index (PopularitY of Programming Languages) die aktuell beliebteste Programmiersprache (Juni 2024). Dafür gibt es gute Gründe, denn:
-
Python ermöglicht als interpretierende Programmiersprache eine interaktive Entwicklung von Programmen. Python ist deshalb für den Einstieg in das Programmieren besser geeignet als Compilersprachen, die erst in einem zweiten Schritt ausführbar gemacht werden.
-
Die Syntax von Python ist im Vergleich zu anderen Programmiersprachen relativ einfach zu erlernen.
-
Python ist durch Module (Softwarebibliotheken) erweiterbar. Das gilt zwar auch für viele andere Programmiersprachen. In Python gestaltet sich die Einbindung von Erweiterungsmodulen aber einfacher. Für numerische und symbolische Berechnungen sowie Computergrafik werden spezifische Module bereitgestellt, die ich Ihnen in diesem Buch vorstellen möchte.
-
Python steht kostenlos zur Verfügung und läuft auf den Betriebssystemen Windows, Linux und macOS.
Das Konzept
Wenn Sie eine Programmiersprache erlernen wollen, dann gibt es verschiedene Wege, die zum Ziel führen. Sie könnten die Dokumentation der Programmiersprache durcharbeiten und versuchen, mit den so erworbenen Kenntnissen eigene Programme zu schreiben. Dieser Weg ist zwar denkbar, aber dann müssen Sie sich durch eine unübersichtliche Vielfalt an Informationen arbeiten, denn die Python-Dokumentation und die Unterlagen der Zusatzmodule haben einen Umfang von mehreren Tausend Seiten. Tutorials für den Programmiereinstieg können dieses Problem zwar abfedern, die dort behandelten Beispiele haben aber in der Regel keinen direkten Bezug zu dem konkreten Programmierproblem, für das Sie sich gerade interessieren, und verlangen von Ihnen damit eine ziemlich schwierige Transferleistung.
Ich habe die Erfahrung gemacht, dass ein anderer Lernweg besser ist: Konzentrieren Sie sich auf konkrete Inhalte aus der Praxis des wissenschaftlichen Arbeitens, und üben Sie damit das Programmieren. Das Lernen orientiert sich dann nicht an der Fachsystematik der Programmiersprache, sondern an der Fachsystematik einer wissenschaftlichen Disziplin, die Sie idealerweise bereits kennen.
Doch welche Wissenschaft sollte man aus dem reichhaltigen Angebot wählen? Hier bietet sich die Mathematik an, weil sie als Grundlagenwissenschaft der Natur- und Ingenieurwissenschaften von allen Fachkundigen ohnehin beherrscht werden muss. Wenn Sie also das Erlernen einer Programmiersprache mit den Inhalten der Mathematik verknüpfen, dann beherrschen Sie am Ende nicht nur das Programmieren, sondern haben auch noch Ihre Mathematikkenntnisse vertieft.
Dieser Weg hat jedoch auch einen Nachteil: Wenn sich das Erlernen einer Programmiersprache an den Inhalten der Mathematik orientiert, dann werden zwangsläufig nicht alle Möglichkeiten erfasst, die die Syntax einer Programmiersprache bietet. Es gibt hier aber einen einfachen Ausweg: Sollten beim Programmieren Probleme auftreten, dann schlagen Sie gezielt die fehlenden Informationen in den entsprechenden Dokumentationen oder in einem einschlägigen Fachbuch nach. Wenn Sie bereits über grundlegendes Wissen verfügen, lässt sich nämlich viel zielgerichteter mit diesen Informationsquellen arbeiten.
Weil dieses Buch sich an der Fachsystematik der Mathematik orientiert, wiederholen sich zwangsläufig viele Programmierkonstruktionen, z. B. Summenalgorithmen in Schleifen oder Fallunterscheidungen in Verzweigungsstrukturen. Das muss jedoch kein Nachteil sein, denn durch die vielen Wiederholungen wird eine Schwäche unseres Gedächtnisses, nämlich das Vergessen, kompensiert.
Die Quelltexte werden, bis auf wenige Ausnahmen, vollständig mit der zugehörigen Ausgabe abgedruckt, damit sie auch ohne Nutzung des Computers analysiert werden können. Für das Verstehen des Codes eines Programms ist es besonders wichtig, die Ausgabe der Ergebnisse mit in die Quelltextanalyse einzubeziehen, denn nur durch die Einsicht in den kausalen Zusammenhang zwischen Struktur des Quelltextes und Ausgabe der Resultate kann der Quelltext vollständig verstanden werden.
Der Lernprozess beginnt mit der Analyse von zunächst einfachen Programmquelltexten. Es wird nicht immer die hinsichtlich Rechenaufwand effizienteste Lösung gewählt, sondern eher Wert auf Nachvollziehbarkeit des Algorithmus gelegt.
Erst wenn Sie einige Beispielprogramme vollständig verstanden und auch getestet haben, sollten Sie mit eigenen Programmierprojekten beginnen. Beim Testen von Programmbeispielen ist es mitunter sinnvoll, bewusst Fehler in den Quelltext einzubauen und nach dem Programmstart die Fehlermeldungen zu analysieren. Auch das Einfügen von eigenen Ergänzungen in bestehende Quelltexte kann den Lernfortschritt unterstützen. Zögern Sie also nicht, den Code zu verändern und sich z. B. Zwischenergebnisse auf der Kommandozeile ausgeben zu lassen, wenn Sie den Ablauf eines Programms besser verstehen möchten.
Die Zielgruppe
Dieses Buch wendet sich an alle, die Python als erste Programmiersprache erlernen wollen. Als Leserkreis werden dabei besonders Studierende der Natur- und Ingenieurwissenschaften und der Informatik angesprochen. Das Buch kann aber auch für den Mathematikunterricht von großem Nutzen sein, wenn mathematische Begriffe, z. B. Grenzwertprozesse, durch Visualisierung dynamisch veranschaulicht werden sollen. Im Informatikunterricht könnten Programmierprojekte, die sich an den aktuellen Themen des Mathematikunterrichts orientieren, mathematische Lernprozesse unterstützen und zusätzlich das Lernen in der Programmierausbildung durch einen sinnhaften Anwendungsbezug stärker motivieren. Angesprochen werden auch Schülerinnen und Schüler der gymnasialen Oberstufe mit den Leistungskursen Mathematik und Informatik. Durch Synergieeffekte könnten Verständnisprobleme in beiden Fächern überwunden werden. Die Notwendigkeit, präzise Unterscheidungen zu treffen, könnte auch dazu beitragen, die Begriffsbildungen in den beiden Lerngebieten zu präzisieren.
Als Voraussetzung für das Verständnis der Inhalte des Buches sind Mathematikkenntnisse erforderlich, wie sie auf einem Gymnasium oder auf einer Fachoberschule vermittelt werden. Sie sollten die mathematischen Grundbegriffe Funktion, Konvergenz, Grenzwert, Ableitung und Integral kennen. Bei Verständnisschwierigkeiten können Sie Ihr Wissen mithilfe der Lehrbücher [Bossek] oder [Kammermeyer] auffrischen. Eine (ganz) kurze Zusammenfassung finden Sie auch im Anhang dieses Buches.
Ein kurzer Überblick über die Inhalte
Sie können bis auf die Kapitel 2 und 3 alle anderen Kapitel unabhängig voneinander lesen. Kapitel 2 und 3 sollten Sie jedoch intensiv studieren und die zugehörigen Aufgaben bearbeiten. Denn dort werden die Grundlagen für das Verständnis der nachfolgenden Kapitel gelegt.
In Kapitel 2, »Datentypen und Datenstrukturen«, werden die grundlegenden Datenstrukturen von Python behandelt, wie Tupel, Sets (Mengen), Listen und Dictionarys. Bis auf Sets werden diese Datenstrukturen in allen folgenden Kapiteln wieder verwendet.
Kapitel 3, »Programmstrukturen«, beschreibt die Programmstrukturen Sequenz, Verzweigung und Wiederholung anhand einfacher Beispiele. Hier wird auch der Begriff der Laufzeitkomplexität eingeführt.
In Kapitel 4, »Die Python-Erweiterungsmodule NumPy, Matplotlib, SymPy und SciPy«, werden die Module numpy, matplotlib, sympy und scipy kurz vorgestellt. Funktionen dieser Module, z. B. solve(), dsolve(), diff(), integrate() und quad(), werden später benutzt, um zu überprüfen, ob die selbst erstellten Algorithmen korrekte Berechnungen ausführen. Das Modul matplotlib wird verwendet, um 2D- und 3D-Funktionsplots zu erstellen.
Kapitel 5, »Zahlen«, handelt von Algorithmen mit Zahlen. Hier beschreibe ich, wie Sie mit dem euklidischen Algorithmus den größten gemeinsamen Teiler berechnen. Es wird gezeigt, wie das Sieb des Eratosthenes Primzahlen findet. Mit der Implementierung des RSA-Algorithmus wird die praktische Bedeutung der Primzahlen herausgestellt. Der Heron-Algorithmus berechnet näherungsweise Werte für irrationale Zahlen als Quadrat- und Kubikwurzeln. Die Kreiszahl π wird näherungsweise mit den Algorithmen von Archimedes, Viète, Wallis, Brent und Salamin berechnet. Das Kapitel endet mit einem Überblick über die Eigenschaften der eulerschen Zahl e.
Kapitel 6, »Gleichungssysteme«, behandelt die numerische Lösung linearer und nichtlinearer Gleichungssysteme. Mit dem klassischen Gauß-Algorithmus und iterativen Verfahren wie dem Jakobi- und dem Gauß-Seidel-Verfahren werden lineare Gleichungssysteme gelöst. Nichtlineare Gleichungssysteme werden mit der SciPy-Funktion fsolve() und der SymPy-Methode nonlinsolve() gelöst.
In Kapitel 7, »Folgen«, wird gezeigt, wie mit der Matplotlib-Methode scatter() arithmetische und geometrische Folgen visualisiert werden können. Im Mittelpunkt steht die grafische Veranschaulichung des Grenzwertbegriffs. Abschließend wird demonstriert, wie sich der Grenzwert einer Folge mit der SymPy-Methode limit() symbolisch berechnen lässt.
Kapitel 8, »Nullstellen berechnen«, behandelt die Algorithmen des Bisektions-, des Fixpunkt- und des Newton-Verfahrens für die Berechnung von Nullstellen. Konvergenzgeschwindigkeiten sowie A-priori- und A-posteriori-Fehlerabschätzungen sind ebenfalls Thema des Kapitels.
Kapitel 9, »Numerische Differenziation«, behandelt die klassischen Themen der Differenzialrechnung: Differenzenquotient, Differenzialquotient und Kurvendiskussion. Der Übergang einer Sekanten- zur Tangentensteigung wird als Grenzwertprozess mit dem Slider-Steuerelement simuliert. Es werden sowohl selbst erstellte Algorithmen als auch die Methoden Derivative() und diff() der Module Numdifftools und SymPy genutzt.
In Kapitel 10, »Reihen«, werden Reihenentwicklungen visualisiert. Veranschaulicht wird die Divergenz und Konvergenz von Reihen. Summen und Grenzwerte von Reihen werden mit den SymPy-Methoden Sum() und limit() symbolisch berechnet. Die SymPy-Methode series() berechnet Taylor-Reihen symbolisch. Das Konvergenzverhalten von Potenz- und Taylor-Reihen wird durch Funktionsplots veranschaulicht.
Kapitel 11, »Numerische Integration«, behandelt die numerische Berechnung von bestimmten Integralen. Die Rechteckapproximation und deren numerischer Fehler werden mithilfe des Slider-Steuerelements veranschaulicht. Von den numerischen Integrationsverfahren werden das Rechtecksummen-, das Trapezsummen- und das Simpson-Verfahren ausgewählt. Bogenlängen, Mantelflächen, Volumina von Rotationskörpern und Zweifachintegrale werden mit selbst erstellten Algorithmen und den SciPy-Funktionen quad() bzw. dblquad() numerisch berechnet.
Kapitel 12, »Differenzialgleichungen«, beschreibt, wie Differenzialgleichungen numerisch mit dem Euler-Verfahren, der SciPy-Funktion solve_ivp() und mit der SymPy-Methode dsolve() gelöst werden können. Die Genauigkeit des Euler-Verfahrens wird mit jener der Verfahren von Heun und Runge-Kutta verglichen.
Kapitel 13, »Ausgleichsrechnungen«, behandelt ausgewählte Themen der Ausgleichsrechnung wie lineare, exponentielle und potenzartige Regression. Für die Speicherung der Messdaten, für die Lösung der linearen Gleichungssysteme und für die erforderlichen Operationen auf Matrizen werden NumPy-Funktionen verwendet.
In Kapitel 14, »Algorithmen für die Berechnung statistischer Kennzahlen«, werden Algorithmen für die Berechnung von Mittel- und Streuwerten sowie Formparameter wie Schiefe und Wölbung entwickelt. Da für die Berechnung des Medians die Messdaten sortiert vorliegen müssen, werden in einem Exkurs zwei einfache Sortieralgorithmen kurz beschrieben. Für die Berechnung der Spannweite wird in einem weiteren Exkurs gezeigt, wie das Maximum und Minimum aus einer Messreihe bestimmt werden kann.
In Kapitel 15, »Fraktale«, zeige ich Ihnen, wie Sie mithilfe der Turtle-Grafik von Python die Koch-Kurve, das Sierpinski-Dreieck und den Pythagoras-Baum zeichnen können. Bei der Darstellung der Mandelbrot- und Julia-Menge wird demonstriert, wie aus einer einfachen rekursiven Gleichung mit komplexen Variablen komplizierte Fraktale entstehen.
Am Ende des Buches werden Sie in der Lage sein, Algorithmen zur Lösung Ihrer eigenen praktischen Problemstellungen in Python zu programmieren. Den Code für einen Algorithmus tatsächlich selbst zu schreiben und sein Verhalten unter verschiedenen Anfangsbedingungen zu beobachten, hilft enorm dabei, das Verständnis seiner Funktionsweise zu vertiefen.
1.1 Entwicklungsumgebungen
Eine Python-Entwicklungsumgebung (IDE, kurz für Integrated Developer Environment) besteht aus einem Editor, einem Interpreter und einem Debugger. Im Editor wird der Quelltext des Programms eingegeben. Durch einen Mausklick auf den Start- bzw. Run-Button oder durch Betätigung der Funktionstaste (F5) wird das Python-Programm mit einem Interpreter übersetzt. Das Resultat wird in einem Ausgabefenster, in der Shell oder in einer anderen Konsole angezeigt. Wenn das Programm Syntaxfehler enthält, dann wird eine Fehlermeldung ausgegeben. Der Debugger hilft Ihnen bei der Suche nach Programmierfehlern. In der Praxis werden Programme oft debuggt, indem man Zwischenergebnisse in der Kommandozeile ausgeben lässt und überprüft, ob diese die Werte haben, die man erwartet. Es lohnt sich dennoch, den Umgang mit einem Debugger zu erlernen, da dieser oft viele hilfreiche Werkzeuge mitbringt, die Ihnen die Suche nach Fehlern deutlich erleichtern.
Es gibt eine Vielzahl von Python-Entwicklungsumgebungen. Für den Einstieg empfehle ich, eine einfach zu bedienende Umgebung wie IDLE oder Thonny zu benutzen. Selbstverständlich gibt es auch professionelle Entwicklungsumgebungen, die Sie vielseitig unterstützen, aber wegen ihres Funktionsumfangs machen sie den Einstieg eher schwieriger als einfacher. Für komplexe Projekte ist der Umgang mit professionellen Entwicklungsumgebungen zwar notwendig, erste Lernerfolge stellen sich aber mit einfachen Werkzeugen schneller ein.
IDLE und Thonny werden von den verbreiteten Betriebssystemen wie Linux, macOS und Windows unterstützt. Beide Entwicklungsumgebungen stehen im Internet kostenlos als Download zur Verfügung. Dort finden Sie auch die Installations- und Bedienungsanleitungen.
1.1.1 IDLE
Die Abkürzung IDLE steht für Integrated Development and Learning Environment. Bei der Installation von Python wird diese Entwicklungsumgebung automatisch mitinstalliert.
Wichtige Leistungsmerkmale sind:
-
Interaktive Python-Shell (Konsolenprogramm) mit Einfärbung der Schlüsselwörter und Ausgabe von Fehlermeldungen.
-
Text-Editor mit automatischer Einrückung bei Verzweigungs- und Schleifenkonstrukten sowie Einfärbung der Schlüsselwörter. Im Menü Edit gibt es unter anderem die Optionen Rückgängigmachen (Undo), Suchen (Find), Ersetzen (Replace) und Autovervollständigung (Expand Word).
-
Debugger mit Haltepunkten und schrittweisem Ausführen des Programms.
Unter dem Menüeintrag Help • Python Docs oder mit der Funktionstaste (F1) finden Sie eine umfangreiche Hilfe zu Python.
Die Python-Shell (siehe Abbildung 1.1) starten Sie im Menü Run • Python Shell.
Abbildung 1.1 Die IDLE-Shell
Mit der Python-Shell können Sie alle Grundrechenarten durchführen und auch kleine interaktive Python-Programme testen. Die drei nach rechts weisenden Pfeilspitzen >>> stehen für die Eingabeaufforderung. Nach der Betätigung der (¢)-Taste übersetzt der Python-Interpreter die Eingaben, und das Ergebnis wird in der Shell angezeigt. Bei einer fehlerhaften Eingabe erscheint eine Fehlermeldung in der Shell.
Wenn Sie z. B. die Anweisung a/b in die Shell eingeben und den Variablen a und b vorher keinen Wert zugewiesen haben, erscheint eine Fehlermeldung:
>>> a/b
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
a/b
NameError: name 'a' is not defined
In den Editor von IDLE geben Sie den Quelltext Ihres Programms ein, beispielsweise so wie in Abbildung 1.2.
Abbildung 1.2 Der Editor von IDLE
Nach dem Programmstart mit der Funktionstaste (F5) oder mit Run • Run Module werden Sie aufgefordert, den Python-Quelltext unter einem selbst gewählten Dateinamen abzuspeichern. Das Ergebnis erscheint dann wie in Abbildung 1.3 in der IDLE-Shell.
Abbildung 1.3 Die Ausgabe von IDLE in der Python-Shell
1.1.2 Thonny
Bei der Installation von Thonny wird ein Python-Interpreter bereits mitinstalliert. Dieser Interpreter arbeitet unabhängig von einer bereits installierten Python-Version. Den Installationsort können Sie sich mit Extras • Installationsverzeichnis von Thonny öffnen ... anzeigen lassen.
Thonny stellt Ihnen alle wesentlichen Funktionalitäten einer IDE zur Verfügung: Sie können komfortabel editieren, debuggen, suchen und automatisch ersetzen. Thonny unterstützt Sie auch mit der Autovervollständigung von Schlüsselwörtern und dem automatischen Auskommentieren und Entkommentieren von markierten Quelltextabschnitten. Abbildung 1.4 zeigt die Benutzeroberfläche der Entwicklungsumgebung unter macOS.
Abbildung 1.4 Die Entwicklungsumgebung von Thonny
Im linken Fenster geben Sie den Quelltext Ihres Programms ein. Wenn Sie im Editorfenster mehrere Reiter geöffnet haben, können Sie gleichzeitig auch verschiedene Quelltexte editieren. Mit einem Mausklick auf den Start-Button oder mit der Funktionstaste (F5) können Sie das Programm übersetzen. Beim Start des Programms öffnet sich ein Dateidialogfenster, das Sie auffordert, den Quelltext des Programms zu speichern. Wenn das Programm keine Syntaxfehler enthält, erscheint das Ergebnis in dem unteren Fenster Kommandozeile. Ansonsten wird eine Fehlermeldung ausgegeben. Wenn Sie im Menü Ansicht die Optionen Variablen und Assistent aktiviert haben, erscheinen rechts oben im Fenster Variablen die Namen und Werte der Variablen. Im Fenster Assistent erscheint eine Meldung, die Ihnen mitteilt, ob das Programm bestimmte formale Kriterien erfüllt.