Einleitung

Motivation

Wenn man es mit komplexen Modellen, vielen Daten, oder nur numerisch lösbaren Problemen zu tun hat, verwendet man in der Mathematik sehr gerne den Computer (deutsch: Rechner, to compute = berechnen) in Verbindung mit einer passenden Software. Aber auch zum Visualisieren und zum Überprüfungen von Handrechnungen ist der Computer sehr hilfreich.

Unter dem Begriff “Scientific Computing” (deutsch: Wissenschaftliches Rechnen) versteht man die computergestützte Entwicklung von Modellen und Algorithmen zur Simulation und Optimierung, um Fragestellungen aus den Natur-, Ingenieur- und Wirtschaftswissenschaften zu beantworten.

Im Diesem Kapitel finden Sie:

  • eine Anleitung zur einfachen Installation von Python und Python-Paketen auf Ihrem Computer
  • eine kurze Einführung in jene ersten, überschaubaren Python-Kenntnisse, die wir in dieser Lehrveranstaltung verwenden.

Warum Python für wissenschaftliches Rechnen? Python ist eine freie, offene, plattformunabhängige, üblicherweise interpretierte, höhere Programmiersprache. Python Code ist gut lesbar und einfach zu lernen. Es gibt sehr viele Pakete und Einsatzgebiete für Python, siehe PyPI - the Python Package Index. Für den Bereich des wissenschaftlichen Rechnens sind insbesondere folgende Python-Pakete nützlich:

  • NumPy: NumPy bietet Unterstützung für große, mehrdimensionale Arrays (Vektoren, Matrizen, …) sowie eine große Sammlung von high-level mathematischen Funktionen, um mit diesen Arrays zu arbeiten.
  • Matplotlib: eine Grafikbibliothek, die jener von Matlab sehr ähnlich ist
  • SciPy: SciPy enthält Module für Optimierung, lineare Algebra, Integration, Interpolation, spezielle Funktionen, Signal- und Bildverarbeitung, Solver für gewöhnliche Differentialgleichungen und andere in Wissenschaft und Technik übliche Aufgaben.

Python erfreut sich einer großen und wachsenden Beliebtheit und besitzt daher eine umfangreiche und breitgefächert Community. So ziemlich jedes Problem mit Lösung/en findet man z. B. unter stackoverflow. Der Name bezieht sich übrigens auf die englische Komikergruppe Monty Python.

Hinweis

In dieser Lehrveranstaltung verwenden wir den Computer nur einführend, vereinzelt und unterstützend für Visualisierungen, Überprüfungen von Handrechnungen und Berechnungen, die von Hand zu aufwendig wären. Dieses ersten Scientific Computing Kompetenzen sind für diese Lehrveranstaltung nicht prüfungsrelevant, sie werden in den anschließenden Semestern aber vertieft und sind ab dem zweiten Semester prüfungsrelevant.

Zu den alternativen Programmiersprachen im Bereich wissenschaftliches Rechnen zählen:

  • Julia: frei, offen und plattformunabhängig
  • R: frei, offen und plattformunabhängig
  • Matlab: kommerziell
  • Mathematica: kommerziell

Installation

Wir verwenden in dieser Lehrveranstaltung Thonny, eine integrierte Entwicklungsumgebung für Python, die sich an Anfänger richtet. Thonny ist übersichtlich, einfach zu bedienen und wie Python frei, offen und plattformunabhängig.

Unter thonny.org finden Sie Installationsanweisungen, FAQ und ein Wiki. Wenn Sie im Tools Menü Manage packages... auswählen, können Sie Python-Pakete installieren, aktualisieren und deinstallieren.

Einführung

Nach einem Tutorial zum Arbeiten mit Thonny werden einige typische Python-Code-Schnipsel zur Verfügung gestellt. Wer Python von Grund und gründlich lernen möchte, kann z. B. die folgenden Bücher [1], [2] verwenden

Arbeiten mit Thonny

Die Seite Thonny: The Beginner-Friendly Python Editor bietet einen guten Einstieg in das User Interface, den Code Editor, den Package Manager und einige weitere wichtige Features von Thonny.

Python als Taschenrechner

In der Python-Shell können Sie intuitiv Rechnungen eintippen. Hier ein paar Beispiele:

Code
(42 + 137)/0.815
219.6319018404908

Achtung: Das Dezimaltrennzeichen ist im Englischen ein Punkt, und Potenzieren wird mit ** implementiert!

Code
1.23**45
11110.40818513195

Um die elementaren mathematischen Funktionen zu verwenden, müssen Sie zuerst, und nur einmal, das NumPy-Paket importieren. Wir verwenden das Kürzel np, um die Funktionen von NumPy anzusprechen.

Code
import numpy as np

np.sin(np.pi/2)
1.0

Kommentare beginnen mit einem #. Sie werden vom Computer ignoriert, sind aber für Menschen hilfreich, um den Code besser zu verstehen.

Code
np.log(1)  # natural logarithm of one
0.0

Komplexe Zahlen

Code
# absolute value (or modulus or magnitude) of a complex number z:
z = -3 + 4j

np.abs(z)
5.0
Code
np.angle(z)  # in radians
2.214297435588181
Code
np.angle(z, deg=True)  # in degrees
126.86989764584402
Code
3*np.exp(1j*np.pi)   # polar form to cartesian form
(-3+3.6739403974420594e-16j)

Beachten Sie, dass 3.6739403974420594e-16 gleich \(3{,}6739403974420594 \cdot 10^{-16}\) ist. Das ist im Rahmen der numerischen Rechengenauigkeit “praktisch Null”. Vergleichen Sie den exakten Wert \(3 \cdot e^{j\pi} = 3 \cos(\pi) + 3 j \sin(\pi) = 3 \cdot (-1) + 3j \cdot 0 = -3\).

Formatierte Ausgabe

Code
name  = "Klaus"
like_math = True
age = 50
value = 12.3456789

print(f"Hallo! My name is {name}.")
print(f"I {like_math = }")
print(f"I am {age} years old. These are about {age*365} days.")
print(f"A value: {value:.2f}")  # float with two decimal places
Hallo! My name is Klaus.
I like_math = True
I am 50 years old. These are about 18250 days.
A value: 12.35

Listen und Vektoren

In der Mathematik ist ein Vektor des \(\mathbb{R}^n\) eine geordnete Liste von \(n\) reellen Zahlen. In Python werden Listen (nicht nur von Zahlen) z. .B. mit eckigen Klammern erzeugt:

Code
a = [-3, 5.7, 8]
b = [2.1, 0, -8]

Allerdings ist z. B. die Addition von Python-Listen nicht elementweise wie die Addition von Vektoren in der Mathematik:

Code
a + b
[-3, 5.7, 8, 2.1, 0, -8]

Um den gewünschten Effekt von Addition und Skalarmultiplikation für Vektoren zu erreichen machen wir die Python-Listen zu NumPy-Arrays:

Code
v = np.array([-3, 5.7, 8])
w = np.array([2.1, 0, -8])

v + w
array([-0.9,  5.7,  0. ])

Es gibt einige hilfreiche NumPy-Funktionen, um oft gebrauchte Typen von NumPy-Arrays zu erzeugen, z. B.:

Code
# 11 evenly spaced numbers over a specified interval:
x = np.linspace(0, 50, 11)
print(x)
[ 0.  5. 10. 15. 20. 25. 30. 35. 40. 45. 50.]
Code
# evenly spaced numbers over a specified interval with step size 2:
x = np.arange(0, 20, 2)
print(x)
[ 0  2  4  6  8 10 12 14 16 18]

Plot einer Funktion

Code
import matplotlib.pyplot as plt

# define the function f:
def f(x):
    return x**2

# 50 grid points distributed between -2 and 2 with equal spacing:
x = np.linspace(-2, 2, num=50)

# plot the function at the grid points:
plt.figure(figsize=(4, 3))
plt.plot(x, f(x), linestyle='-', color='red', marker='.')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.grid(True)
plt.show()

For-Schleife

Zinseszinsrechnung:

Code
B_0 = 1000.0  # initial balance in EUR
q = 1.05      # interest rate factor
n = 5         # number of years

# range: start 1 is included, stop n + 1 is excluded!
for i in np.arange(1, n + 1, 1):
    B_i = B_0*q**i
    print(f"Balance after {i} years = {B_i:.2f} EUR.")
Balance after 1 years = 1050.00 EUR.
Balance after 2 years = 1102.50 EUR.
Balance after 3 years = 1157.63 EUR.
Balance after 4 years = 1215.51 EUR.
Balance after 5 years = 1276.28 EUR.

Rentenrechnung:

Code
A = 2000.0  # yearly amount in EUR
q = 1.05    # interest rate factor
n = 5       # number of years

total = 0.0
for i in np.arange(0, n, 1):
    print(f"{i = }")
    total = total + A*q**(n - i)

print(f"Saved amount = {total:.2f} EUR.")
i = 0
i = 1
i = 2
i = 3
i = 4
Saved amount = 11603.83 EUR.

While-Schleife

Wir berechnen die Fakultät einer natürlichen Zahl \(n > 0\):

Code
n = 10
f = 1  # initial value for factorial n!
k = n  # initial decreasing number k
while k > 0:
    print(f"{k = }")
    f = f*k
    k = k - 1

print(f"{n}! = {f}")
k = 10
k = 9
k = 8
k = 7
k = 6
k = 5
k = 4
k = 3
k = 2
k = 1
10! = 3628800

If-Elif-Else Abfrage

Wir bestimmen das Vorzeichen von ein paar Zahlen:

Code
numbers = np.arange(-3, 4, 1)
for n in numbers:
    if n > 0:
        print(f"{n} hat das Vorzeichen +.")
    elif n == 0:
        print(f"{n} hat kein Vorzeichen.")
    else:
        print(f"{n} hat das Vorzeichen -.")
-3 hat das Vorzeichen -.
-2 hat das Vorzeichen -.
-1 hat das Vorzeichen -.
0 hat kein Vorzeichen.
1 hat das Vorzeichen +.
2 hat das Vorzeichen +.
3 hat das Vorzeichen +.

Beachte: Eine If-Elif-Else Abfrage muss nicht zwingend elif oder else Teile haben.

Literatur

[1]
S. Linge und H. P. Langtangen, Programming for Computations - Python: A Gentle Introduction to Numerical Simulations with Python 3.6, 2. Aufl. Springer, 2020.
[2]
M. Kofler, Python: Der Grundkurs, 2. Aufl. Bonn: Rheinwerk Computing, 2021.