30
Numerische Berechnungen mit Python Eine Einführung für das numerische Rechnen mit Python Fachbereich Mathematik und Statistik Arbeitsgruppe Numerische Optimierung Status: 4.2018

Numerische Berechnungen mit Python · 1 Numerische Berechnungen mit Python 1 Einführung Pythonisteineuniverselle,interpretiertehöhereProgrammiersprachewelchedenAnspruchhat, einen

  • Upload
    others

  • View
    30

  • Download
    0

Embed Size (px)

Citation preview

Numerische Berechnungen mitPython

Eine Einführung für das numerische Rechnen mit Python

Fachbereich Mathematik und StatistikArbeitsgruppe Numerische Optimierung

Status: 4.2018

Inhaltsverzeichnis

1 Einführung 1

2 Umgang mit Arrays 12.1 Arrays belegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2 Teilbereiche eines Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.3 Arithmetische Operationen mit Arrays . . . . . . . . . . . . . . . . . . . . . . . . 42.4 Funktionen mit Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

3 Ein- und Ausgabe 73.1 Text-Dateien speichern mit savetxt . . . . . . . . . . . . . . . . . . . . . . . . . . 73.2 Text-Dateien laden mit loadtxt . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

4 Graphiken 114.1 2D-Graphik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114.2 3D-Graphik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154.3 Graphik beschriften . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.4 Unterbilder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204.5 Graphik abspeichern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214.6 Struktur einer Matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

5 Programmsteuerung 225.1 Logische Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225.2 Verzweigungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235.3 Schleifenbildung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255.4 Umgang mit Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

1 Numerische Berechnungen mit Python

1 Einführung

Python ist eine universelle, interpretierte höhere Programmiersprache welche den Anspruch hat,einen gut lesbaren und knappen Programmierstil zu haben. Beispielsweise werden hier Blöckeeingerückt strukturiert, anstatt mit geschweiften Klammern zu arbeiten.

Python unterstützt mehrere Programmierparadigmen, unter anderem objektorientiertes Pro-grammieren und funktionales Programmieren. Diese Einführung geht dabei nicht auf die Ob-jektorientierung ein. Sie dient im wesentlichen als Einführung für das numerische Rechnen mitPython und ist hauptsächlich an die Matlab Einführung von Dr. rer. nat. Eberhard Luik, Uni-versität Konstanz, angelehnt. Die meisten Beispiele stammen ebenfalls von dort. Gelegentlichstammen auch einige Beispiele von https://www.python-kurs.eu/index.php.

Wir verwenden hier Python 3.6 und den Editor Spyder. Die aktuellste Version kann als Ge-samtpaket bei Anaconda (für Windows, Mac und Linux) heruntergeladen werden und ist hier zufinden: https://www.anaconda.com/download/

2 Umgang mit Arrays

Viele numerische Berechnungen beruhen auf Matrixberechnungen. Das Paket NumPy (Akronymfür „Numeric Python“ oder „Numerical Python“) bietet hier als Open Source Erweiterung, dieMöglichkeit, schnelle numerische Berechnungen mit Python auszuführen. Wir geben hier Grund-lagen im Umgang mit diesem. Um das Paket nutzen zu können, müssen wir es zuerst laden.

import numpy as np

2.1 Arrays belegen

Wir behandeln ein d-dimensionales Numpy-Array im folgenden wie Matrizen. So ist zum Beispielein eindimensionales Numpy-Array ein Vektor und ein zweidimensionales Numpy-Array eineMatrix. Wir erhalten zum Beispiel durch

A = np . array ( [ [ 1 , 2 , 3 , 4 ] , [ 5 , 6 , 7 , 8 ] , [ 9 , 1 0 , 1 1 , 1 2 ] , [ 1 3 , 1 4 , 1 5 , 1 6 ] ] )

das zweidimensionale Numpy-Array, welches die folgende Matrix repräsentiert:

A =

1 2 3 45 6 7 89 10 11 1213 14 15 16

(2.1)

Dabei sind die runden, wie eckigen Klammern zu beachten. Durch

x = np . array ( [ 1 , 2 , 3 , 4 ] )y = np . array ( [ [ 1 0 ] , [ 2 0 ] , [ 3 0 ] ] )

werden die Vektoren

x =(1 2 3 4

)und y =

102030

2 Numerische Berechnungen mit Python

erzeugt. Zu beachten ist hierbei, das eindimensionale Vektoren stets wie R1×n-Matrizen ange-zeigt werden. Möchte man Rn×1-Matrizen, muss man, wie hier das y ein zweidimensionales Arrayerzeugen. Für Python spielt es aber im Allgemeinen keine Rolle, ob Vektoren als Zeilen- oderSpaltenvektoren gespeichert werden. Bei Bedarf werden diese automatisch entsprechend trans-poniert. Auf ein Element eines Arrays können wir zugreifen, indem wir seine Position angeben(Zeilenindex, Spaltenindex, Indizierung beginnt bei Null). So erhalten wir zum Beispiel durchdie Eingabe von

A[ 3 , 2 ] = 0

das Numpy-Array

1 2 3 45 6 7 89 10 11 1213 14 0 16

.

Wir können auch Arrays erzeugen, die mit Nullen bzw. Einsen vorbelegt werden. Durch

A = np . z e r o s ( ( 4 , 3 ) )B = np . ones ( ( 2 , 5 ) )

erhalten wir die Arrays

0 0 00 0 00 0 00 0 0

und(

1 1 1 1 11 1 1 1 1

).

Die n × n Einheitsmatrix wird in Python mittels Numpy durch das Kommando np.eye(n,n)erzeugt. Dabei muss n schon mit einem Wert belegt sein. So liefert

n = 3I = np . eye (n , n)

das Array

I =

1 0 00 1 00 0 1

.

Dabei benötigt man, im Gegensatz zu np.zeros und np.ones, für den Befehl nur eine Klammer.Dies liegt daran, dass np.eye ein anderes Input erwartet. Für den interessierten Leser sei hier aufdie Dokumentation von numpy verwiesen (https://docs.scipy.org/doc/). Das Kommando

x = np . arange ( 0 , 2 . 2 , 0 . 2 )

erzeugt das eindimensionale Array

x =(0 0.2 0.4 . . . 1.8 2.0

).

Dabei werden die Werte des halboffenen Intervalls [0, 2.2) in 0.2−Schritten erzeugt.

3 Numerische Berechnungen mit Python

2.2 Teilbereiche eines Arrays

Von einem bereits definierten Array kann man Teilbereiche (Zeilen, Spalten, Teilarrays) anspre-chen. Für das Array A aus (2.1) liefern die Kommandos

u = A[ 1 , : ]v = A[ : , 2 ]B = A[ 0 : 3 , 0 : 2 ]C = A[ 2 : 4 , 2 : 4 ]

die folgenden ein- bzw. zweidimensionalen Arrays:

u =(5 6 7 8

), v =

(3 7 11 15

), B =

1 25 69 10

, C =

(11 1215 16

).

Ein Array kann auch mit Hilfe von Teilarrays definiert werden. So erzeugt zum Beispiel dieSequenz

I=np . eye (2 , 2 )Z=np . z e r o s ( ( 2 , 2 ) )E=np . array ( [ [ 2 , - 1 ] , [ - 1 , 2 ] ] )D=np . hstack ( ( np . vstack ( (E, Z , I ) ) , np . vstack ( (Z ,E, Z ) ) , \

np . vstack ( ( I , Z ,E) ) ) )

das zweidimensionale Array

D =

2 −1 0 0 1 0−1 2 0 0 0 10 0 2 −1 0 00 0 −1 2 0 01 0 0 0 2 −10 1 0 0 −1 2

.

Dabei ist der \ für einen Zeilenumbruch gedacht, falls eine Zeile zu lange wird. Aus einem Arraykönnen Teilbereiche gestrichen werden. Dadurch ändert sich die Größe des Arrays. Betrachtenwir das Array A aus (2.1) und geben dann

B = np . d e l e t e (A, ( 1 ) , ax i s = 0)C = np . d e l e t e (A, ( 1 ) , ax i s = 1)

ein, so wird aus A die zweite Zeile, bzw. die zweite Spalte gestrichen:

B =

1 2 3 49 10 11 1213 14 15 16

, C =

1 3 45 7 89 11 1213 15 16

.

Ebenso können Zeilen bzw. Spalten in einem Array eingefügt werden. Beispielsweise liefert

D = np . vstack ( (A[ 0 : 2 , : ] , np . array ( [ 2 1 , 2 2 , 2 3 , 2 4 ] ) ,A [ 3 , : ] ) )

4 Numerische Berechnungen mit Python

das Array

D =

1 2 3 45 6 7 821 22 23 2413 14 15 16

.

2.3 Arithmetische Operationen mit Arrays

Zwei n-dimensionale Arrays A und B derselben Größe werden addiert bzw. subtrahiert durch

C = A + BD = A - B

Diese Operationen werden (wie aus der Mathematik bekannt) elementweise durchgeführt. Vor-sicht ist dagegen bei der Multiplikation geboten, denn hier kennt die Mathematik zwei Möglich-keiten: elementweise Multiplikation und das Matrixprodukt. Dementsprechend gibt es auch inPython die beiden Möglichkeiten

C = np . dot (A,B) #MatrixproduktC = A∗F #elementweise Mu l t i p l i k a t i on

Dabei ist das #-Zeichen für Kommentierungen. Das Matrixprodukt ist nur definiert, falls A einm×n-Array und B ein n×r-Array ist und ergibt dann ein m×r-Array. Die elementweise Multi-plikation ist dagegen nur definiert wenn beide Matrizen dieselbe Dimension haben. Entsprechendgilt für die Potenz:

C = np . l i n a l g . matrix_power (A, 3) #en t sp r i c h t C = A∗A∗AD = A∗∗3 #elementweise Potenzierung

Die Matrixpotenz A3 ist nur für ein quadratisches Array (d.h. n × n-Arrays) erklärt. Die ele-mentweise Division zweier Arrays erfolgt mittels

C = A/B

was aij/bij bedeutet. Zum Lösen von linearen Gleichungssystem können wir

x = np . l i n a l g . s o l v e (A, b)

verwenden.

Beispiel: Für die Funktion

f(x) :=x

1 + ax+ rx2

erstellen wir mit a = 1, r = 0.5 eine Wertetabelle. Anschließend wird diese Funktion gezeichnet.Die entsprechenden Befehle lauten

import matp lo t l i b . pyplot as p l ta = 1r = 0 .5x = np . arange ( 0 , 1 0 . 1 , 0 . 1 )y = x/(1 + a∗x +r∗x∗∗2)p l t . p l o t ( y )p l t . show ( )

5 Numerische Berechnungen mit Python

Als Ergebnis erhalten wir die folgende Graphik:

Das Kommando plot zeichnet die Wertetabelle. Auf das Paket matplotlib gehen wir später nochetwas ausführlicher ein.

2.4 Funktionen mit Arrays

Ist A ein bereits definiertes Array, so liefert

np . shape (A)[m, n ] = np . shape (A)

die Größe des Arrays; m enthält die Zeilenzahl und n die Spaltenzahl. Durch

B = np . z e r o s (np . shape (A) )

wird ein mit Nullen vorbelegtes Array B erzeugt, das dieselbe Größe wie A hat.

Die Länge eines eindimensionalen Arrays x erhält man durch den Befehl

l en (x )

Für ein Array A liefert das Kommando

np . diag (A)

die Diagonale (als eindimensionales Array). Umgekehrt ergibt für ein eindimensionales Array v(mit n Komponenten) der Befehl

B = np . diag (v )

ein Diagonalarray mit den Elementen von v in der Diagonalen. Weiter liefert

C = np . diag (v , 1 )

ein (n + 1) × (n + 1)-Array C mit dem Vektor v in der ersten oberen Nebendiagonalen. ZumBeispiel erhalten wir durch

e = np . ones (4 )S = np . diag (np . arange (11 , 66 , 11 ) ) + np . diag ( e , 1 ) + np . diag ( e , - 1 )

6 Numerische Berechnungen mit Python

das Array

11 1 0 0 01 22 1 0 00 1 33 1 00 0 1 44 10 0 0 1 55

Durch

np . sum(A, ax i s = 0)

werden die Elemente in den Spalten aufsummiert (ergibt als Ergebnis ein eindimensionales Ar-ray), während

np . sum(A, ax i s = 1)

die Elemente zeilenweise addiert. Schließlich erhält man durch

B = A.T

das zu A transponierte Array. Möglich sind auch

u = np . sum(np . diag (A) ) #summiert d i e Diagonale lementez = np . sum(A[ : , 3 ] ) #summiert d i e Elemente der 4 . Spa l t ev = np . sum(A) #summiert a l l e Elemente des ArraysD = np . diag (np . d iag (A) ) #Diagonalmatr ix

Für ein eindimensionales Array x = (x1, . . . , xn) gibt es die Funktionen

np .max(x )np . min (x )np . l i n a l g . norm(x ) = np . l i n a l g . norm(x , ord=2)np . l i n a l g . norm(x , ord=1) #1 -Normnp . l i n a l g . norm(x , ord=np . i n f ) #max-Norm

Es gibt auch einige Konstanten, so z.B.

np . p i #Kre i s zah l p inp . e #Eulersche Zahl e

Python kennt viele wichtige (aus der Mathematik bekannten) Funktionen. Hier eine Auswahl:

np . exp ( a ) #Exponent ia l funkt ionnp . l og ( a ) #na tu e r l i c h e r Logarithmusnp . log10 ( a ) #Logarithmus zur Bas i s 10np . log2 ( a ) #Logarithmus zur Bas i s 2np . s q r t ( a ) #Quadratwurzela∗∗ (1/n) #n− te Wurzel von anp . s i n ( a ) #Sinusnp . cos ( a ) #Kosinusnp . tan ( a ) #Tangensnp . c e i l ( a ) #naechste ganze Zahl >=anp . f l o o r ( a ) #naechste ganze Zahl <= anp . round ( a ) #rundet zur naechsten ganzen Zahl

7 Numerische Berechnungen mit Python

Die Variable darf natürlich auch ein Array sein. Dann liefern diese Funktionen als Ergebnis einArray derselben Größe. Die Funktionsauswertung erfolgt elementweise.

Beispiel: Wir erstellen eine Funktion

f(x) :=a

1 + exp(b− cx)a, b, c ∈ R

eine Wertetabelle für x = 0, 0.1, 0.2, . . . , 9.9, 10 und zeichnen diese anschließend.

import matp lo t l i b . pyplot as p l ta=100b=5c=1x=np . arange ( 0 , 1 0 . 1 , 0 . 1 )f = a/(1+np . exp (b - c∗x ) )p l t . p l o t ( f )p l t . show ( )

Als Ergebnis erhalten wir die folgende Graphik:

Hier ist f ein eindimensionales Array, das dieselbe Größe wie x hat. Seine Komponenten sind dieFunktionswerte f(xi).

3 Ein- und Ausgabe

Es gibt in Python in Verbindung mit dem Paket Numpy viele Wege, um Daten in Dateieneinzulesen und Daten in Dateien zu schreiben. Wir werden in diesem Kapitel mehrere Wegebetrachten und am Ende einige Beispiele vorstellen.

3.1 Text-Dateien speichern mit savetxt

Wir betrachten zunächst die beiden, von Numpy zur Verfügung gestellten Funktionen savetxtund loadtxt. Dazu definieren wir im folgenden Beispiel ein Array x und speichern dieses alsText-Datei mit savetxt:

8 Numerische Berechnungen mit Python

import numpy as np

x = np . array ( [[ 1 , 2 , 3 ] ,[ 4 , 5 , 6 ] ,[ 7 , 8 , 9 ] ] )

np . save txt ( " b e i s p i e l . txt " , x )

Die Datei „beispiel.txt“ ist eine Text-Datei und sieht in etwa so aus (je nachdem welches Pro-gramm zum Betrachten verwendet wird):

Spezielle Formatierungen sind ebenfalls möglich, z.B. mit zwei Nachkommastellen, oder als ganzeZahlen mit vorangestellten Leerzeichen, wenn die Anzahl der Stellen kleiner als vier ist. Dafürmuss ein Format-String („fmt“) als dritter Parameter übergeben werden. In obigem Beispielhaben wir gesehen, dass ein Leerzeichen als Begrenzer als Standardeinstellung hinterlegt ist. Dieskann selbstverständlich auch angepasst werden. In der Regel wird dies ein einzelnes Zeichen sein,könnte aber auch ein „<->“ sein. Die Einstellung wird über den String „delimiter“ vorgenommen.Wir erhalten zum Beispiel für den folgenden Code die entsprechenden Text-Dateien:

np . save txt ( " b e i s p i e l 2 . txt " , x , fmt="%2.3 f " , d e l im i t e r=" , " )np . save txt ( " b e i s p i e l 3 . txt " , x , fmt="%04d" , d e l im i t e r=" <−> " )

Die gesamte Syntax von savetxt sieht so aus:

save txt ( fname , X, fmt=’%.18e ’ , d e l im i t e r=’ ’ , newl ine=’ \n ’ ,header=’ ’ , f o o t e r=’ ’ , comments=’# ’ )

Dabei ist die exakte (und aktuellste) Beschreibung der einzelnen Parameter stets unter https://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html zu finden.

9 Numerische Berechnungen mit Python

3.2 Text-Dateien laden mit loadtxt

Zunächst werden wir die Datei „beispiel.txt“, die wir eben erstellt haben, einlesen:

y = np . l oadtx t ( " b e i s p i e l . txt " )p r i n t ( y )

[ [ 1 . 2 . 3 . ][ 4 . 5 . 6 . ][ 7 . 8 . 9 . ] ]

Ebenfalls keine Probleme haben wir mit den beiden anderen Beispielen:

y = np . l oadtx t ( " b e i s p i e l 2 . txt " , d e l im i t e r=" , " )p r i n t ( y )

[ [ 1 . 2 . 3 . ][ 4 . 5 . 6 . ][ 7 . 8 . 9 . ] ]

y = np . l oadtx t ( " b e i s p i e l 3 . txt " , d e l im i t e r=" <−> " )p r in t ( y )

[ [ 1 . 2 . 3 . ][ 4 . 5 . 6 . ][ 7 . 8 . 9 . ] ]

Es ist auch möglich, die Spalten über den Index auszuwählen:

y = np . l oadtx t ( " b e i s p i e l 3 . txt " , d e l im i t e r=" <−> " , u s e c o l s =(0 ,2))p r i n t ( y )

[ [ 1 . 3 . ][ 4 . 6 . ][ 7 . 9 . ] ]

Hier sieht die gesamte Syntax wie folgt aus

l oadtx t ( fname , dtype=<type ’ f l o a t ’>, comments=’#’ , d e l im i t e r=None ,c onve r t e r s=None , sk iprows=0, u s e c o l s=None ,unpack=False , ndmin=0)

und die Beschreibung ist unter https://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html zu finden. Bevor wir abschließend einige Beispiele betrachten, sei nocherwähnt, dass es neben den vorgestellten np.savetxt und np.loadtxt auch noch np.tofile bzwnp.fromfile gibt. Hier können aber Probleme auftreten, wenn diese für Datenspeicherung ver-wendet werden. Hier können nämlich die Dateien in Binärform gespeichert werden. Da dies abernicht unabhängig von der verwendeten Plattform ist, kann dies zu Problemen führen.

Beispiel: Wir erstellen eine Wertetabelle der Exponentialfunktion und speichern diese inwertetab.txt:

x = np . arange ( 0 , 1 . 1 , 0 . 1 )y = np . exp (x )x . shape = (11 ,1 )y . shape = (11 ,1 )

10 Numerische Berechnungen mit Python

A = np . hstack ( [ x , y ] )np . save txt ( ’ wertetab . txt ’ , A, fmt="%2.3 f " ,

newl ine=’ \n ’ , header = ’ Exponent ia l funkt ion ’ )

Die Datei wertetab.txt sieht dann wie folgt aus:

Der Befehl input kann in Python verwendet werden, wenn während des laufenden ProgrammsDaten eingeben werden sollen. Dieser wird wie folgt behandelt:

x = input ( ’ Text ’ )y = f l o a t ( input ( ’ Text ’ ) )

Python gibt dann auf dem Bildschirm den Text aus und wartet auf die Eingabe. Nach dieserwird der entsprechende Wert gespeichert. Dabei wird hier x als String und y als float gespeichert.Damit kommen wir zu folgendemBeispiel: Es wird eine Wertetabelle der logistischen Kurve

L(t) :=a

1 + exp(b− ct)

erstellt, wobei die Parameter a, b, c über den Bildschirm eingelesen werden.

p r i n t ( ’Es wird e ine Werte tabe l l e der l og . Kurve e r s t e l l t ’ )p r i n t ( ’Geben S i e d i e fo lgenden Parameter e in : ’ )a = f l o a t ( input ( ’ a =’ ) )b = f l o a t ( input ( ’b =’ ) )c = f l o a t ( input ( ’ c =’ ) )

x = np . arange (0 , 50 , 0 . 5 )y = np . array ( ( a / (1 . 0 + np . exp (b−c∗x ) ) ) )x . shape = ( l en (x ) , 1 )y . shape = ( l en (y ) , 1 )A = np . hstack ( [ x , y ] )

np . save txt ( ’ l o g i s t i s ch eKurv e . txt ’ , A, fmt="%2.3 f " ,newl ine=’ \n ’ , header = ’ l o g i s t i s c h e Kurve mit den Parameterna , b und c ’ )

11 Numerische Berechnungen mit Python

Zufallszahlen

Um Zufallszahlen zu erzeugen bietet Numpy verschiedene Möglichkeiten. Der Befehl

np . random . rand (m, n)

liefert ein m×n-Array zurück mit Zufallszahlen im Intervall [0, 1). Wenn ganze Zahlen benötigtwerden, liefert der Befehl

np . random . rand int ( low , high , s i z e )

ein Array der Größe size mit zufälligen ganzen Zahlen zwischen low und high. Dabei kann sizeselbst eine ganze Zahl oder ein Tupel sein.

4 Graphiken

Matplotlib ist ein umfangreiches Graphik-Paket. Wir geben hier nur einen kleinen Einblick überdie unzähligen Möglichkeiten, die dieses Paket liefert. Für einen Gesamtüberblick sei auf dieDokumentation unter http://matplotlib.org/index.html verwiesen. Durch die Eingabe einesentsprechenden Graphik Befehls wird ein neues Fenster mit der Überschrift Figure geöffnet.Für Spyder-User muss dies erst aktiviert werden (Tools -> Preferences -> IPython console ->Graphics. Hier im Feld Graphics backend Automatic auswählen). Eine erstellte Graphik kannin verschiedenen Formaten (z.B. Postskript, JPEG, PDF) abgespeichert und so in andere Texte(z.B. Latex-Dokumente) eingebunden werden. Der Befehl plt.close() schließt geöffnete Figure-Fenster, was generell zu empfehlen ist.

4.1 2D-Graphik

Zum Zeichnen von reellen Funktionen (oder Messergebnissen) in der Ebenen verwendet man dasMatplotlib-Kommando plot. Dabei ist zunächst eine Wertetabelle von der Funktion zu erstellen,welche als Parameter an das plot - Kommando übergeben wird. Das folgende Beispiel zeichnetdie Funktion sin(x) im Intervall [0,10]:

import numpy as npimport matp lo t l i b . pyplot as p l t

x = np . arange ( 0 , 1 0 , 0 . 1 )y = np . s i n (x )p l t . p l o t (x , y )p l t . show ( )

Alternativ zu dem Befehl np.arange(Start, Stop, schrittlänge) kann auch der Befehlnp.linspace(Start, Stop, Anzahl Punkte, endpoint=True oder False) verwendet werden.Das gleiche Beispiel sieht dann so aus:

x = np . l i n s p a c e (0 , 10 , 50 , endpoint=True )y = np . s i n (x )p l t . p l o t (x , y )p l t . show ( )

Möchte man mehrere Kurven in einem Plot haben, genügt es den Befehl plt.show() an das Endezu setzen. Mit einem Plot-Befehl können auch mehrere Kurven gleichzeitig gezeichnet werden.Wir erhalten damit zwei Möglichkeiten.

12 Numerische Berechnungen mit Python

x = np . l i n s p a c e (0 , 10 , 50 , endpoint=True )y = np . s i n (x )z = np . s i n (x+0.5)p l t . p l o t (x , y , x , z )p l t . show ( )

x = np . l i n s p a c e (0 , 10 , 50 , endpoint=True )y = np . s i n (x )z = np . s i n (x+0.5)p l t . p l o t (x , y )p l t . p l o t (x , z )p l t . show ( )

In beiden Fällen erhalten wir die folgende Graphik.

Durch einen weiteren Parameter werden in der Zeichnung Linientyp, Farbe und Markierungstypbestimmt.Linientyp:Für den Linientyp gibt es die folgenden Möglichkeiten:

Zeichen Beschreibung’-’ durchgezogende Linie’- -’ gestrichelte Linie’-.’ Strichpunkt-Linie’:’ punktierte Linie

Farben:Die Auswahl der Farbe erfolgt durch:

13 Numerische Berechnungen mit Python

Zeichen Beschreibung’b’ blau’g’ grün’r’ rot’c’ cyan’m’ magenta’y’ gelb’k’ schwarz’w’ weiß

Markierungstyp:Weiter besteht die Möglichkeit, die Punkte der Wertetabelle zu markieren bzw. nur die Punkte zuzeichnen (ohne die Verbindungsstrecke). In matplotlip gibt es die folgenden Markierungstypen:

Zeichen Beschreibung’.’ Punkt-Marker’,’ Pixel-Marker’o’ Kreis-Marker’v’ Dreiecks-Marker, Spitze nach unten’^’ Dreiecks-Marker, Spitze nach oben’<’ Dreiecks-Marker, Spitze nach links’>’ Dreiecks-Marker, Spitze nach rechs’1’ tri-runter-Marker’2’ tri-hoch-Marker’3’ tri-links Marker’4’ tri-rechts Marker’s’ quadratischer Marker’p’ fünfeckiger Marker’*’ Stern-Marker’h’ Sechseck-Marker1’H’ Sechseck-Marker2’+’ Plus-Marker’x’ x.Marker’D’ rautenförmiger Marker’d’ dünner rautenförmiger Markerr’|’ Marker in Form einer vertikalen Linie’_’ Marker in Form einer horizontalen Linie

Beispiel:

x = np . arange (0 ,10 , 0 . 25 )y = np . s i n (x )z = np . s i n (x+0.5)p l t . p l o t (x , y , ’ r s− ’ )p l t . p l o t (x , z , ’ go ’ ) ;p l t . show ( )

Bei der ersten Kurve werden die berechneten Punkte mit einem Quadrat markiert und aufein-ander folgende Punkte durch eine Gerade verbunden. Bei der zweiten Kurve werden die Punktenur durch einen grünen Kreis markiert.

14 Numerische Berechnungen mit Python

Die Graphik wird in einem neuen Fenster dargestellt, in dem sie weiter bearbeitet werden kann.

Desweiteren besteht die Möglichkeit, die Größe und die Farbe der Markierungen zu ändern. Fernerkann man die Dicke der Linien wählen. Dazu werden weitere Parameter in das plot-Kommandoaufgenommen. Testen Sie mal das folgende Python-Programm:

x = np . arange ( 0 , 1 0 , 0 . 5 )y = np . s i n (x )p l t . p l o t (x , y , ’ r s−− ’ , MarkerEdgeColor=’k ’ , MarkerFaceColor=’ g ’ ,

MarkerSize=15, LineWidth=2)p l t . show ( )

Schließlich können noch einige Regionen in der Graphik eingefärbt werden. Dazu betrachten wirfolgendes Beispiel:

n = 256X = np . l i n s p a c e (−np . pi , np . pi , n , endpoint=True )Y = np . s i n (2∗X)

p l t . p l o t (X, Y, c o l o r=’ blue ’ )p l t . f i l l_be tween (X, 0 , Y, c o l o r=’ blue ’ , alpha =.1)p l t . show ( )

Dieses liefert dann das folgende Ergebnis:

15 Numerische Berechnungen mit Python

4.2 3D-Graphik

Wir starten mit dem Zeichnen einer Raumkurve. Diese sind in der Regel durch eine Parametri-sierung gegeben:

(x(t), y(t), z(t)) mit t ∈ [a, b].

Dabei sind x(t), y(t) und z(t) reelle und differenzierbare Funktionen. Wir betrachten das folgendeBeispiel:

import numpy as npimport matp lo t l i b . pyplot as p l tfrom mpl_toolk i ts . mplot3d import Axes3D

f i g = p l t . f i g u r e ( )ax = f i g . gca ( p r o j e c t i o n=’ 3d ’ )t = np . l i n s p a c e (0 , 2 , 200 , endpoint=True )x = np . cos (10∗ t )y = np . s i n (10∗ t )z = np . exp ( t )ax . p l o t (x , y , z )p l t . show ( )

Dieses liefert uns das folgende Ergebnis:

16 Numerische Berechnungen mit Python

Als nächstes betrachten wir den Graphen einer Funktion f : D ⊂ R2 → R. Eine Funktionf : D ⊂ R2 → R kann als „Gebirge“ über dem Definitionsbereich oder als Höhenkarte dargestelltwerden. Für die Darstellung als Gebirge gibt es mehrere Varianten. Wir veranschaulichen diesexemplarisch für die Funktion

f(x, y) := 5 exp(−x2 − (y − 2)2) + x2 + (y − 2)2

mit dem Definitionsbereich D = [−1.5, 2] × [0.5, 3.5]. Zunächst benötigen wir einen meshgrid,welcher aus dem Definitionsbereich die Gitterpunkte auswählt, in der die Funktion ausgewertetwerden soll. Für die graphische Darstellung gibt es unzählige verschiedene Möglichkeiten. Wirzeigen hier einige Beispiele und verweisen für alles weitere auf die Dokumentation von Matplotlib.

import numpy as npimport matp lo t l i b . pyplot as p l tfrom matp lo t l i b import cmfrom mpl_toolk i ts . mplot3d import Axes3D

x l i s t = np . l i n s p a c e (−1 . 5 , 2 . 0 , 35)y l i s t = np . l i n s p a c e ( 0 . 5 , 3 . 5 , 40)X, Y = np . meshgrid ( x l i s t , y l i s t )Z = 5∗np . exp (−X∗∗ 2 -(Y−2)∗∗2)+X∗∗2+(Y−2)∗∗2

#su r f a c ef i g = p l t . f i g u r e (1 )ax = f i g . gca ( p r o j e c t i o n=’ 3d ’ )s u r f = ax . p lo t_sur face (X, Y, Z)

f i g = p l t . f i g u r e (2 )ax = f i g . gca ( p r o j e c t i o n=’ 3d ’ )s u r f = ax . p lo t_sur face (X, Y, Z , cmap=cm. gist_rainbow )

f i g = p l t . f i g u r e (3 )ax = f i g . gca ( p r o j e c t i o n=’ 3d ’ )s u r f = ax . p lo t_sur face (X, Y, Z , cmap=cm. coolwarm )

17 Numerische Berechnungen mit Python

p l t . show ( )

Weitere Auswahlmöglichkeiten für die Einfärbung der Graphik ist unter https://matplotlib.org/devdocs/gallery/color/colormap_reference.html zu finden. Wir erhalten die folgendenGraphiken:

Eine weitere graphische Darstellung von f : D ⊂ R2 → R ist die Höhenkarte. Auch dafür bietetMatplotlib wieder viele Möglichkeiten. Wir geben hier wieder zwei Beispiele an.

import numpy as npimport matp lo t l i b . pyplot as p l t

x l i s t = np . l i n s p a c e ( - 1 . 5 , 2 . 0 , 35)y l i s t = np . l i n s p a c e ( 0 . 5 , 3 . 5 , 40)X, Y = np . meshgrid ( x l i s t , y l i s t )Z = 5∗np . exp (−X∗∗2−(Y−2)∗∗2)+X∗∗2+(Y−2)∗∗2

#contour p l o tp l t . f i g u r e (1 )cp = p l t . contour (X, Y, Z)p l t . c l a b e l ( cp , i n l i n e=True ,

f o n t s i z e =20)

18 Numerische Berechnungen mit Python

p l t . f i g u r e (2 )cp = p l t . contour f (X, Y, Z)p l t . c o l o rba r ( cp )

p l t . show ( )

Wir erhalten:

4.3 Graphik beschriften

Es gibt eine ganze Reihe von Möglichkeiten, um eine erstellte Graphik zu beschriften.Achsenhandling:Normalerweise wählt Matplotlib die Achsen und deren Skalierung automatisch so, dass die Gra-phik das Figure-Fenster gerade ausfüllt. Mit der Funktion axis können wir aber auch den Wer-tebereich einer Achse beeinflussen. So zeichnet z.B.

x = np . l i n s p a c e (0 , 10 , 50 , endpoint=True )y = np . s i n (x )

p l t . p l o t (x , y )p l t . show ( )

xmin , xmax , ymin , ymax = −5 , 15 , −2 , 2p l t . ax i s ( [ xmin , xmax , ymin , ymax ] )

p l t . show ( )

die X-Achse von xmin bis xmax und die Y-Achse von ymin bis ymax.

Achsenbeschriftung:Die Achsen werden mit den Kommandos xlabel, ylabel bzw. zlabel beschriftet. Beispiele dazusind:

import matp lo t l i b . pyplot as p l t

p l t . x l ab e l ( ’ d i e s i s t d i e x - Achse ’ )p l t . y l ab e l ( ’ d i e s i s t d i e y - Achse ’ )

Überschrift:Durch den Matplotlib-Befehl title wird das Bild mit einer Überschrift versehen, z.B.

19 Numerische Berechnungen mit Python

p l t . t i t l e ( ’ d i e s i s t der T i t e l der Graphik ’ )

Text in der Graphik:An jeder beliebigen Stelle der Zeichnung kann Text platziert werden. So liefert

p l t . t ex t ( 2 , 0 . 5 , ’ c = 2 ’ )

c = 2 an der Stelle (2,0.5).

Legenden:

Wir betrachten hierfür wieder ein Beispiel:

import numpy as npimport matp lo t l i b . pyplot as p l t

x = np . l i n s p a c e (0 , 25 , 1000)y1 = np . s i n (x )y2 = np . cos ( x )

p l t . p l o t (x , y1 , ’−b ’ , l a b e l=’ s i n e ’ )p l t . p l o t (x , y2 , ’−r ’ , l a b e l=’ co s i n e ’ )p l t . l egend ( l o c=’ upper l e f t ’ )p l t . yl im (−1 . 5 , 2 . 0 )

p l t . show ( )

Dabei liefert plt.ylim(min,max) einen neuen Bereich in dem die Y-Wert dargestellt werdensollen. Mit plt.legend können wir eine Legende einfügen. Dabei bestimmt loc=’string’ diePosition. Wenn man sich noch nicht sicher ist, so kann man loc=’best’ setzen. Matplotlibversucht dann, die günstigste Position für die Legende zu finden. Obiges Beispiel liefert folgendeGraphik:

20 Numerische Berechnungen mit Python

4.4 Unterbilder

Man kann mehrere Bilder in einem Graphik-Fenster darstellen. Dazu wird das Matplotlib-Kommando subplot(nrows, ncols, plot_number) verwendet. Dies bedeutet, dass das Graphik-Fenster in insgesamt nrows·ncols Unterbilder zerlegt wird und aktuell das plot_number Bildangesprochen wird.

Beispiel

import numpy as npimport matp lo t l i b . pyplot as p l t

t = np . arange (−5 . 0 , 1 . 0 , 0 . 1 )

f = np . exp (−t )∗np . cos (2∗np . p i ∗ t )g = np . s i n ( t )∗np . cos (1/ t )h = np . s i n ( t )∗np . cos (1/( t +0.1))

x = np . array ( [ 0 . 1 9 , 0 . 21 , 0 . 35 , 0 . 2 5 ] )u = np . array ( [ 0 . 1 9 , 0 . 21 , 0 . 3 5 ] )

p l t . subp lot ( 2 , 3 , 1 )p l t . p l o t ( f )p l t . subp lot ( 2 , 3 , 2 )p l t . p l o t ( g )p l t . subp lot ( 2 , 3 , 3 )p l t . p l o t (h)p l t . subp lot ( 2 , 3 , 4 )p l t . p i e ( x )p l t . subp lot ( 2 , 3 , 5 )p l t . p i e (u)

p l t . show ( )

21 Numerische Berechnungen mit Python

4.5 Graphik abspeichern

Wir stellen hier zwei Möglichkeiten vor, eine erstellte Graphik zu speichern. Bei der ersten Va-riante wählt man einfach in dem sich öffnenden Fester das Speichern Symbol aus und kann dieGraphik im gewünschten Format, sowie an dem gewünschten Speicherpfad abspeichern. Für diezweite Variante betrachten wir das folgende Beispiel:

import numpy as npimport matp lo t l i b . pyplot as p l tp l t . c l o s e ( )

t = np . arange (−5 . 0 , 1 . 0 , 0 . 1 )f = np . exp (−t )∗np . cos (2∗np . p i ∗ t )

p l t . p l o t ( f )p l t . s a v e f i g ( ’ B e i s p i e l ’ )

p l t . show ( )

Hier wird die erstellte Graphik automatisch als PNG-Datei abgespeichert. Mit ’string.*, wobei* z.B. jpg, png, pdf usw. sein kann, wird die Graphik in das entsprechende Format gespeichert.

4.6 Struktur einer Matrix

Manchmal kann es sinnvoll sein, insbesondere bei großen Matrizen die Struktur einer Matrixzunächst über eine Graphik zu untersuchen. Wir betrachten folgendes Beispiel:

import numpy as npimport matp lo t l i b . pyplot as p l t

m = 15d = 2

T_1 = −2∗d∗np . eye (m∗∗d , m∗∗d)

t_2 = np . ones (m−1)t_2 = np . append ( t_2 , 0)t_2 = np . t i l e ( t_2 , m∗∗ (d−1) )t_2 = np . d e l e t e ( t_2 , −1)T_2 = np . diag ( t_2 , 1)

T_3 = np . diag ( t_2 , −1)

I_1 = np . eye (m∗∗d , m∗∗d , m∗∗ (d−1) )I_2 = np . eye (m∗∗d , m∗∗d , -m∗∗ (d−1) )

A = T_1 + T_2 + T_3 + I_1 + I_2

p l t . spy (A, markers i ze =0.5)p l t . show ( )

Wir erhalten die folgende Graphik

22 Numerische Berechnungen mit Python

5 Programmsteuerung

5.1 Logische Ausdrücke

Beim Programmieren besteht häufig der Wunsch, eine bestimmte Anweisung von einer Bedin-gung abhängig zu machen. Zum Beispiel kann man die Quadratwurzel einer reellen Zahl a nurfür a ≥ 0 berechnen. Eine solche Bedingung nennt man einen logischen Ausdruck; er kann nurdie Werte wahr (engl. true) oder falsch (engl. false) annehmen.

Logische Ausdrücke in der Mathematik sind zum Beispiel

x < 10

a+ b ≥ y + 5

x2 + y2 = 5

a 6=√x− y

Die Zeichen <, >, ≤, ≥, 6= und = nennt man Vergleichsoperatoren.

In Python gibt es diese Vergleichsoperatoren ebenfalls:

Python math. Bedeutung< <<= ≤> >>= ≥== =!= 6=

In Python-Notation lauten obige Beispiele:

23 Numerische Berechnungen mit Python

x < 10(a+b) >= (y+5)

(x**2 + y**2) == 5a != np.sqrt(x-y)

Im Allgemeinen wirken die Vergleichsoperatoren auf Arrays (derselben Größe). Der Vergleichwird dann elementweise durchgeführt.Beispiel: Für

A =

(2 7 5 34 6 8 0

), B =

(5 7 3 25 5 7 0

)liefert der Python-BefehlA == Bdas ErgebnisFalse True False FalseFalse False False True

Logische Ausdrücke kann man kombinieren durch die logischen Operatoren und, oder bzw. nicht;zum Beispiel

a 6=√x− y und x < 10

In Python gibt es dafür die Operatoren

Python math. Bedeutungand und& und (Bitweise)or oder| oder (Bitweise)

not nicht

Der logische Ausdruck aus obigem Beispiel lautet dann(a != np.sqrt(x-y)) and (x < 10)

5.2 Verzweigungen

Verzweigungen dienen dazu, in Abhängigkeit vom Wert eines logischen Ausdruckes verschiedeneProgrammteile auszuführen. Dabei unterscheidet man

Einseitige VerzweigungDiese haben in Python die Form

i f <l o g i s c h e r Ausdruck>:Anweisungen ( i f - Block )

Wichtig ist, dass nach dem logischen Ausdruck und dem Doppelpunkt eingerückt wird. Bei derProgrammausführung wird zunächst der logische Ausdruck ausgewertet. Hat dieser den WertTrue, so werden die Anweisungen des if-Blockes ausgeführt, andernfalls wird in die Zeile ge-sprungen, die nicht mehr eingerückt ist.

24 Numerische Berechnungen mit Python

Anmerkung: Ist A ein Array, so ist if A < 1 nur dann wahr, falls jedes Element von A die-se Bedingung erfüllt.

Als Beispiel berechnen wir die Quadratwurzel einer nichtnegativen reellen Zahl:

. . .i f a >= 0 :

b = np . s q r t ( a ). . .

Zweiseitige VerzweigungHier hat man zusätzlich noch die Möglichkeit, einen Programmteil auszuführen, falls der logischeAusdruck den Wert False hat. Die Form ist

i f <l o g i s c h e r Ausdruck>:Anweisungen ( i f - Block )

e l s e :Anweisungen ( e l s e - Block )

Hat bei der Programmausführung der logische Ausdruck den Wert True, so wird der if-Blockausgeführt; hat er den Wert False, so wird der else-Block ausgeführt.

Als Beispiel berechnen wir wieder die Quadratwurzel einer reellen Zahl. Ist diese Zahl nega-tiv, so soll nun eine Fehlermeldung ausgedruckt werden.

. . .i f a >= 0 :

b = np . s q r t ( a )p r i n t ( ’ Die Quadratwurzel i s t : ’ , b )

e l s e :p r i n t ( ’ Feh ler : e ingegebener Wert i s t negat iv ’ )

. . .

MehrfachverzweigungAuch Mehrfachverzweigungen lassen sich in Python realisieren. Diese haben die Struktur

i f <l o g i s c h e r Ausdruck 1>:Anweisungen ( i f - Block )

e l i f <l o g i s c h e r Ausdruck 2>:Anweisungen ( e l i f - Block )

e l s e :Anweisungen ( e l s e - Block )

Bei der Programmausführung wird zuerst der logische Ausdruck 1 ausgewertet. Hat dieser denWert True, so wird der if-Block ausgeführt. Hat der logische Ausdruck 1 den Wert False, dannwird als nächstes der logische Ausdruck 2 berechnet; hat er den Wert True, so wird der elif-Blockausgeführt, andernfalls der else-Block. In den else-Block gelangt man nur, wenn sowohl der logi-sche Ausdruck 1 als auch der logische Ausdruck 2 den Wert False haben.

Beispiel: Die Auswertung der Signumsfunktion

sign(x) :=

1 für x > 00 für x = 0−1 für x < 0

wird in Python durch folgendes Programm realisiert:

25 Numerische Berechnungen mit Python

x = f l o a t ( input ( ’ x = ’ ) )i f x > 0 :

sigma = 1e l i f x == 0 :

sigma = 0e l s e :

sigma = −1p r i n t ( ’ sigma (x ) = ’ , sigma )

Anmerkungen

(i) Es sind auch mehrere elif-Teile möglich.

(ii) In einem if-Block bzw. else-Block dürfen mehrere Anweisungen stehen, darunter selbstwieder if-Anweisungen.

5.3 Schleifenbildung

Beim Programmieren besteht häufig der Wunsch, gewisse Programmteile mehrfach zu durch-laufen (mit verschiedenen Daten). Dazu dient das Konzept der Schleifenbildung. Python kenntverschiedene Möglichkeiten:Die for-SchleifeIm folgenden sehen wir die allgemeine Syntax der for-Schleife in Python. Sequenz steht hierbeifür ein iterierbares Objekt (z.B. ein Array).

f o r Var iab le in Sequenz :Anweisungen

e l s e :Anweisungen

Dabei ist der optionale else-Block eine Besonderheit von Python. Semantisch funktioniert deroptionale else-Block der for-Anweisung wie folgt. Er wird nur ausgeführt, wenn die Schleife nichtdurch eine break-Anweisung abgebrochen wurde. Das bedeutet, dass der else-Block nur dannausgeführt wird, wenn alle Elemente der Sequenz abgearbeitet worden sind.Trifft der Programmablauf auf eine break-Anweisung, so wird die Schleife sofort verlassen unddas Programm wird mit der Anweisung fortgesetzt, die der for-Schleife folgt, falls es überhauptnoch Anweisungen nach der for-Schleife gibt. Ein kleines Beispiel verdeutlicht die Funktionsweisedes else-Blockes:

e s s ba r e s = [ "Schinken" , " F ru eh s t u e c k s f l e i s c h " , " Eier " , "Nuesse" ]f o r e s s en in e s sba r e s :

i f e s s en == " Fru eh s t u e c k s f l e i s c h " :p r i n t ( " B i t t e ke in F ru eh s t u e c k s f l e i s c h ! " )break

p r i n t ( "Grossar t ig , " + essen )e l s e :

p r i n t ( "Super , ke in F ru eh s t u e c k s f l e i s c h ! " )p r i n t ( " Je t z t bin i ch f e r t i g mit e s s en " )

Wir erhalten folgende Ausgabe:Grossartig, SchinkenBitte kein Fruehstuecksfleisch!Jetzt bin ich fertig mit essen

26 Numerische Berechnungen mit Python

Wenn wir das Frühstücksfleisch aus obiger Liste entfernen erhalten wir:Grossartig, SchinkenGrossartig, EierGrossartig, NuesseSuper, kein Fruehstuecksfleisch!Jetzt bin ich fertig mit essen

Um eine Zählschleife zu simulieren, können wir in Python die range-Funktion verwenden:

range (0 ,10 )range (4 , 50 , 5 )range (42 , - 12 , - 7 )

Dabei liefert die erste Funktion die Zahlen von 0 bis 9, die zweite von 4 bis 49 in fünfer-Schrittenund die dritte von 42 bis −7 in siebener-Schritten. Damit lassen sich zum Beispiel die Zahlenvon 1 bis 100 zusammenzählen:

n = 100

s = 0f o r counter in range (1 , n+1):

s += counter

p r i n t ( "Summe von 1 b i s " + s t r (n) + " : " + s t r ( s ) )

Dabei ist s += counter eine kürzere Schreibweise für s = s + counter.

Die while-SchleifeHängt die Anzahl der Schleifendurchläufe von einer logischen Bedingung ab, so verwendet mandie while-Schleife:

whi l e Bedingung :Anweisungen

e l s e :Anweisungen

Dabei ist der optionale else-Block genau so wie bei einer for-Schleife zu verwenden.

Beispiel: Es wird so lange eine reelle Zahl über den Bildschirm eingelesen, bis eine positiveZahl eingegeben wird. Erst dann wird mit der Berechnung von log(x) fortgefahren.

import numpy as np

pr in t ( ’Gib e ine p o s i t i v e Zahl e in ’ )x = f l o a t ( input ( ’ x = ’ ) )whi l e x <= 0 :

p r i n t ( ’ Feh ler : x <= 0 ’ )p r i n t ( ’Gib e ine p o s i t i v e Zahl e in ’ )x = f l o a t ( input ( ’ x = ’ ) )

y = np . l og (x )p r i n t ( y )

Vorzeitiges Beenden einer Schleife:Es gibt zwei Möglichkeiten:

27 Numerische Berechnungen mit Python

(i) break springt zu der nächsten Zeile in der nicht mehr eingerückt ist.

(ii) continue der aktuelle Schleifendurchlauf wird abgebrochen und die Schleifenabar-beitung mit dem nächsten Schleifendurchlauf fortgesetzt.

5.4 Umgang mit Funktionen

FunktionenSelbstdefinierte Funktionen sind Python-Programme, welche Eingabe-Parameter akzeptieren undein Ergebnis zurückliefern. Funktionen haben folgenden Aufbau:

de f funktionsname ( Paramete r l i s t e ) :"""Kommentar"""

Anweisung ( en )

Die Funktion kann mit beliebigem Dateinamen an einem beliebigen Ort auf dem PC gespeichertwerden. Es können auch mehrere Funktionen in einer Datei gespeichert sein. Möchte man diesenun in einer anderen Datei aufrufen, sollte dieses Main-File an demselben Ort gespeichert seinwie die Datei mit der Funktion (oder man gibt bei dem Import den Pfad an). Nun genügt es dieFunktion zu importieren:

from func t i on s import funktionsname

Der Befehl help(funktionsname) liefert den Kommentar.

Beispiel: Wir erstellen eine Funktion, welche zunächst die Länge eines Arrays feststellt unddann den Mittelwert berechnet.

de f mi t t e lwer t (u ) :"""Diese Funktion berechnet den Mitte lwert e i n e s Arrays"""n = len (u)mw = sum(u)/nreturn mw

Der Aufruf gestaltet sich dann wie folgt:

import numpy as np

u = np . array ( [ 1 , 3 , 5 , 9 , 8 , 5 , 7 , 5 , 4 7 , 5 4 6 ] )a = mit t e lwer t (u)

Es ist auch möglich, optionale Parameter festzulegen. Dabei wird ein (optionaler) Parameterbereits bei der Definition der Funktion festgelegt, kann aber bei einem Aufruf variiert werden.

de f mi t t e lwer t (u , show=True ) :"""Diese Funktion berechnet den Mitte lwert e i n e s Arrays"""n = len (u)mw = sum(u)/ni f show == True :

p r i n t (mw)

28 Numerische Berechnungen mit Python

r e turn mw

In diesem Fall wird, wenn die Funktion Mittelwert wie oben (mittelwert(u)) aufgerufen wird,der Mittelwert des Arrays u berechnet und zusätzlich auf dem Bildschirm angezeigt. Möchte mandies nun verhindern, ruft man die Funktion mit mittelwert(u, show=False) auf.

Rekursive FunktionenFunktionen können auch rekursiv definiert werden, z. B.

de f fak (n ) :"""Rekurs ive De f i n i t i o n der Fakultaet"""i f n == 0 :

y = 1e l s e :

y = n∗ fak (n−1)re turn y

Lambda-Funktionen

Wir können Funktionen

f : R→ Rx 7→ f(x)

auf mehrere Arten definieren. Dabei erweist sich die Lambda-Funktion als besonders kurz. Wirbetrachten hierfür das Beispiel f(x) = x2:

de f f_1 (x ) :x = x∗∗2return x

f_2 = lambda x : x∗∗2

x = 2

pr in t ( f_1 (x ) )p r i n t ( f_2 (x ) )

Wir erhalten für beide Funktionsaufrufe wie erwarten den Wert 4. Die Lambda-Funktion kannauch für mehrere Variablen definiert werden.