4.4    SciPy

Das Akronym SciPy steht für Scientific Python. SciPy ist eine Python-basierte Sammlung von Open-Source-Software für Mathematik, Natur- und Ingenieurwissenschaften.

Mit der SciPy-Bibliothek können Sie z. B. nichtlineare Gleichungssysteme lösen, numerisch integrieren, Differenzialgleichungen numerisch lösen und umfangreiche statistische Berechnungen durchführen.

Hinweise zur Installation, ein einführendes Tutorial und eine ausführliche Dokumentation finden Sie im Internet unter der URL https://www.scipy.org/.

Das Modul SciPy ist in Untermodule aufgeteilt. Funktionen können mit

from scipy.untermodul import funktion1, funktion2, ...

aus einem Untermodul importiert werden.

Ein Untermodul kann mit

from scipy import untermodul 

aus dem Modul SciPy importiert werden.

Alle Integrate-Untermodule können Sie beispielsweise mit der Anweisung from scipy.integrate import * importieren. Diese Vorgehensweise ist selbstverständlich auch bei anderen Untermodulen anwendbar.

Tabelle 4.7 enthält eine Zusammenstellung wichtiger SciPy-Funktionen.

Funktion

Beschreibung

optimize.fsolve(...)

Löst ein nichtlineares Gleichungssystem.

optimize.newton(...)

Löst ein nichtlineares Gleichungssystem mit dem Newton-Verfahren.

integrate.quad(f,a,b)

Berechnet das Integral von f in den Grenzen a bis b.

integrate.dblquad(...)

Berechnet Zweifachintegrale.

integrate.tplquad(...)

Berechnet Dreifachintegrale.

integrate.solve_ivp(...)

Löst lineare und nichtlineare Differenzialgleichungssysteme.

Tabelle 4.7     Ausgewählte SciPy-Funktionen

Die folgenden zwei Programme zeigen exemplarisch, wie man mit SciPy Nullstellen finden und ein bestimmtes Integral berechnen kann.

Nullstellen berechnen

Mit der SciPy-Funktion

newton(func, x0, fprime=None, args=(), tol=1.48e-08, maxiter=50, fprime2=None, x1=None, rtol=0.0, full_output=False, disp=True)

können Sie die Nullstellen nichtlinearer mathematischer Funktionen berechnen lassen. Als erstes Argument muss eine selbst definierte Python-Funktion func übergeben werden. Zur Erinnerung: In Python werden Funktionen wie Variablen behandelt. Bei dem Parameter x0 handelt es sich um einen geschätzten Startwert in der Nähe der Nullstelle. Wenn die Funktion mehrere Nullstellen hat, müssen die Startwerte als Sequenz (Tupel, Liste, eindimensionales NumPy-Array) übergeben werden. Die Verwendung der anderen Parameter ist optional.

Flächeninhalte berechnen

Mit der SciPy-Funktion

quad(func, a, b, args=(), full_output=0, epsabs=1.49e-08,
epsrel=1.49e-08, limit=50, points=None, weight=None,
wvar=None, wopts=None, maxp1=50, limlst=50)

können Sie bestimmte Integrale berechnen. Als erstes Argument wird der Name der mathematischen Funktion func übergeben. Bei den Parametern a und b handelt es sich um die Unter- und Obergrenzen. Die Benutzung der anderen Parameter ist optional.

Listing 4.9 berechnet die Nullstellen und den Flächeninhalt zwischen den Nullstellen und der x-Achse für das Polynom

formula

mit den SciPy-Funktionen newton() und quad(). Die Startwerte für die Nullstellenberechnung können Sie aus Abbildung 4.6 ablesen (Zeile 07). Die Nullstellen werden als untere und obere Grenze für die Berechnung des bestimmten Integrals benötigt (Zeile 08).

01  #09_scipy_integral.py
02 from scipy.optimize import newton
03 from scipy.integrate import quad
04 def f(x):
05 return -x**2+5*x-3
06 #Nullstelle berechnen
07 x01,x02=newton(f,[0.6,4.2])
08 A=quad(f,x01,x02)#[0]
09 #Ausgabe
10 print("Nullstellen: ",x01,x02)
11 print("Flächeninhalt:",A)

Listing 4.9     Nullstellen mit SciPy berechnen

Ausgabe
Nullstellen:   0.6972243622680053 4.302775637731996
Flächeninhalt: (7.812027763505309, 8.673093092054562e-14)
Analyse

In Zeile 02 wird aus dem Untermodul optimize des Moduls scipy die SciPy-Funktion newton importiert. In Zeile 03 wird aus dem Untermodul integrate des Moduls scipy die SciPy-Funktion quad importiert. Beide Funktionen sind vom Typ <class 'function'>.

In Zeile 07 berechnet die Funktion newton() die Nullstellen der in den Zeilen 04 und 05 definierten mathematischen Funktion f(x). Als erstes Argument wird der Name f der Funktion ohne den Parameter x übergeben. Als zweites Argument müssen Startwerte [0.6,4.2] übergeben werden. Die Lösungen werden in die Objekte x01 und x02 gespeichert. Diese Objekte haben den Typ <class 'numpy.float64'>.

In Zeile 08 berechnet die SciPy-Funktion quad() das bestimmte Integral der in den Zeilen 04 und 05 definierten mathematischen Funktion f(x). Als erstes Argument wird der Name der Funktion f ohne den Parameter x übergeben. Bei dem zweiten und dritten Parameter handelt es sich um die untere und obere Integrationsgrenze. Das Ergebnis wird in dem Objekt A gespeichert. Es ist vom Typ <class 'tuple'>.

Das erste Element des Tupels enthält eine Näherungslösung des bestimmten Integrals (Flächeninhalt). Bei dem zweiten Element handelt es sich um eine Fehlerabschätzung. Da diese einen sehr kleinen Wert hat, können wir uns darauf verlassen, dass das numerisch bestimmte Ergebnis tatsächlich genau ist.

Viele Funktionen in Python geben neben dem eigentlichen Ergebnis zusätzliche Informationen zurück. Um nur das gewünschte Ergebnis – in diesem Fall den Wert des bestimmten Integrals – zu erhalten, könnte in Zeile 08 das erste Element mittels quad(f,...)[0] ausgewählt werden. Alternativ kann man in Zeile 08 nur das erste Element A[0] an die print-Funktion übergeben.