quad#
- scipy.integrate.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, complex_func=False)[Quelle]#
Berechnet ein bestimmtes Integral.
Integriert `func` von `a` bis `b` (möglicherweise auf einem unendlichen Intervall) unter Verwendung einer Technik aus der Fortran-Bibliothek QUADPACK.
- Parameter:
- func{Funktion, scipy.LowLevelCallable}
Eine Python-Funktion oder -Methode zur Integration. Wenn `func` viele Argumente hat, wird es entlang der Achse integriert, die dem ersten Argument entspricht.
Wenn der Benutzer eine verbesserte Integrationsleistung wünscht, kann `f` eine
scipy.LowLevelCallablemit einer der Signaturen sein.double func(double x) double func(double x, void *user_data) double func(int n, double *xx) double func(int n, double *xx, void *user_data)
Der `user_data` sind die Daten, die in der `scipy.LowLevelCallable` enthalten sind. In den Aufrufformen mit `xx` ist `n` die Länge des `xx`-Arrays, das `xx[0] == x` und die restlichen Elemente enthält, die Zahlen sind, die im `args`-Argument von quad enthalten sind.
Zusätzlich werden bestimmte ctypes-Aufrufsignaturen zur Kompatibilität mit älteren Versionen unterstützt, diese sollten jedoch nicht in neuem Code verwendet werden.
- afloat
Untere Integrationsgrenze (verwenden Sie -numpy.inf für -Unendlich).
- bfloat
Obere Integrationsgrenze (verwenden Sie numpy.inf für +Unendlich).
- argstuple, optional
Zusätzliche Argumente, die an func übergeben werden.
- full_outputint, optional
Ungleich 0, um ein Wörterbuch mit Integrationsinformationen zurückzugeben. Wenn ungleich 0, werden Warnmeldungen ebenfalls unterdrückt und die Meldung wird dem Ausgabetupel angehängt.
- complex_funcbool, optional
Gibt an, ob der Rückgabetyp der Funktion (`func`) reell (`complex_func=False`: Standard) oder komplex (`complex_func=True`) ist. In beiden Fällen ist das Argument der Funktion reell. Wenn `full_output` ebenfalls ungleich 0 ist, werden das `infodict`, die `message` und die `explain` für die reellen und komplexen Komponenten in einem Wörterbuch mit den Schlüsseln "real output" und "imag output" zurückgegeben.
- Rückgabe:
- yfloat
Das Integral von `func` von `a` bis `b`.
- abserrfloat
Eine Schätzung des absoluten Fehlers im Ergebnis.
- infodictdict
Ein Wörterbuch mit zusätzlichen Informationen.
- message
Eine Konvergenzmeldung.
- explain
Nur angehängt bei 'cos'- oder 'sin'-Gewichtung und unendlichen Integrationsgrenzen, enthält es eine Erklärung der Codes in `infodict['ierlst']`.
- Andere Parameter:
- epsabsfloat oder int, optional
Absolute Fehlertoleranz. Standard ist 1.49e-8. `quad` versucht, eine Genauigkeit von `abs(i-result) <= max(epsabs, epsrel*abs(i))` zu erreichen, wobei `i` = Integral von `func` von `a` bis `b` und `result` die numerische Annäherung ist. Siehe `epsrel` unten.
- epsrelfloat oder int, optional
Relative Fehlertoleranz. Standard ist 1.49e-8. Wenn `epsabs <= 0`, muss `epsrel größer als sowohl 5e-29 als auch 50 * (Maschinengenauigkeit) sein. Siehe `epsabs` oben.
- limitfloat oder int, optional
Eine Obergrenze für die Anzahl der Unterintervalle, die im adaptiven Algorithmus verwendet werden.
- points(Sequenz von floats, ints), optional
Eine Sequenz von Bruchpunkten im begrenzten Integrationsintervall, an denen lokale Schwierigkeiten des Integranden auftreten können (z. B. Singularitäten, Diskontinuitäten). Die Sequenz muss nicht sortiert sein. Beachten Sie, dass diese Option nicht in Verbindung mit `weight` verwendet werden kann.
- weightfloat oder int, optional
String, der die Gewichtungsfunktion angibt. Vollständige Erklärungen zu dieser und den verbleibenden Argumenten finden Sie weiter unten.
- wvaroptional
Variablen für die Verwendung mit Gewichtungsfunktionen.
- woptsoptional
Optionale Eingabe zur Wiederverwendung von Chebyshev-Momenten.
- maxp1float oder int, optional
Eine Obergrenze für die Anzahl der Chebyshev-Momente.
- limlstint, optional
Obergrenze für die Anzahl der Zyklen (>=3) für die Verwendung mit einer sinusförmigen Gewichtung und einem unendlichen Endpunkt.
Siehe auch
dblquaddoppeltes Integral
tplquaddreifaches Integral
nquadn-dimensionale Integrale (verwendet `quad` rekursiv)
fixed_quadGauß-Quadratur mit festem Ordnung
simpsonIntegrator für abgetastete Daten
rombIntegrator für abgetastete Daten
scipy.specialfür Koeffizienten und Wurzeln orthogonaler Polynome
Hinweise
Für gültige Ergebnisse muss das Integral konvergieren; das Verhalten bei divergenten Integralen ist nicht garantiert.
Zusätzliche Informationen für quad()-Ein- und Ausgaben
Wenn `full_output` ungleich 0 ist, ist das dritte Ausgabeargument (infodict) ein Wörterbuch mit den unten tabellierten Einträgen. Bei unendlichen Grenzen wird der Bereich auf (0,1) transformiert und die optionalen Ausgaben werden bezüglich dieses transformierten Bereichs angegeben. Sei M das Eingabeargument `limit` und K sei `infodict['last']`. Die Einträge sind:
- ‘neval’
Die Anzahl der Funktionsauswertungen.
- ‘last’
Die Anzahl K der Unterintervalle, die im Unterteilungsverfahren erzeugt wurden.
- ‘alist’
Ein Array der Länge M vom Rang 1, dessen erste K Elemente die linken Endpunkte der Unterintervalle in der Partition des Integrationsbereichs sind.
- ‘blist’
Ein Array der Länge M vom Rang 1, dessen erste K Elemente die rechten Endpunkte der Unterintervalle sind.
- ‘rlist’
Ein Array der Länge M vom Rang 1, dessen erste K Elemente die Integralannherungen in den Unterintervallen sind.
- ‘elist’
Ein Array der Länge M vom Rang 1, dessen erste K Elemente die Beträge der absoluten Fehlerschätzungen in den Unterintervallen sind.
- ‘iord’
Ein ganzzahliger Array vom Rang 1 der Länge M, dessen erste L Elemente Zeiger auf die Fehlerschätzungen über die Unterintervalle sind, wobei L=K ist, wenn K<=M/2+2 oder L=M+1-K andernfalls. Sei I die Sequenz `infodict['iord']` und E sei die Sequenz `infodict['elist']`. Dann bildet `E[I[1]], ..., E[I[L]]` eine abnehmende Sequenz.
Wenn das Eingabeargument `points` bereitgestellt wird (d. h. es ist nicht `None`), werden die folgenden zusätzlichen Ausgaben in das Ausgabewörterbuch aufgenommen. Angenommen, die Sequenz `points` hat die Länge P.
- ‘pts’
Ein Array vom Rang 1 der Länge P+2, das die Integrationsgrenzen und die Bruchpunkte der Intervalle in aufsteigender Reihenfolge enthält. Dies ist ein Array, das die Unterintervalle angibt, über die integriert wird.
- ‘level’
Ein ganzzahliger Array vom Rang 1 der Länge M (=limit), der die Unterteilungsstufen der Unterintervalle enthält, d. h. ein Element dieses Arrays ist gleich l, wenn das entsprechende Unterintervall `|bb-aa| = |pts[2]-pts[1]| * 2**(-l)` ist.
- ‘ndin’
Ein ganzzahliger Array vom Rang 1 der Länge P+2. Nach der ersten Integration über die Intervalle (`pts[1]`, `pts[2]`) können die Fehlerschätzungen über einige der Intervalle künstlich erhöht worden sein, um ihre Unterteilung voranzutreiben. Dieses Array enthält Einsen in den Positionen, die den Unterintervallen entsprechen, für die dies geschieht.
Gewichtung des Integranden
Die Eingabevariablen `weight` und `wvar` werden verwendet, um den Integranden mit einer ausgewählten Liste von Funktionen zu gewichten. Unterschiedliche Integrationstechniken werden verwendet, um das Integral mit diesen Gewichtungsfunktionen zu berechnen, und diese unterstützen nicht die Angabe von Bruchpunkten. Die möglichen Werte von `weight` und die entsprechenden Gewichtungsfunktionen sind:
weightVerwendete Gewichtungsfunktion
wvar‘cos’
cos(w*x)
wvar = w
‘sin’
sin(w*x)
wvar = w
‘alg’
g(x) = ((x-a)**alpha)*((b-x)**beta)
wvar = (alpha, beta)
‘alg-loga’
g(x)*log(x-a)
wvar = (alpha, beta)
‘alg-logb’
g(x)*log(b-x)
wvar = (alpha, beta)
‘alg-log’
g(x)*log(x-a)*log(b-x)
wvar = (alpha, beta)
‘cauchy’
1/(x-c)
wvar = c
`wvar` enthält den Parameter w, (alpha, beta) oder c, abhängig von der ausgewählten Gewichtung. In diesen Ausdrücken sind a und b die Integrationsgrenzen.
Für die 'cos'- und 'sin'-Gewichtung sind zusätzliche Ein- und Ausgaben verfügbar.
Für gewichtete Integrale mit endlichen Integrationsgrenzen erfolgt die Integration mit einer Clenshaw-Curtis-Methode, die Chebyshev-Momente verwendet. Für wiederholte Berechnungen werden diese Momente im Ausgabewörterbuch gespeichert.
- ‘momcom’
Die maximale Stufe der berechneten Chebyshev-Momente, d. h. wenn `M_c` `infodict['momcom']` ist, dann wurden die Momente für Intervalle der Länge `|b-a| * 2**(-l)` berechnet, l=0,1,...,M_c.
- ‘nnlog’
Ein ganzzahliger Array vom Rang 1 der Länge M (=limit), der die Unterteilungsstufen der Unterintervalle enthält, d. h. ein Element dieses Arrays ist gleich l, wenn das entsprechende Unterintervall `|b-a|* 2**(-l)` ist.
- ‘chebmo’
Ein Array vom Rang 2 mit der Form (25, maxp1), das die berechneten Chebyshev-Momente enthält. Diese können an eine Integration über dasselbe Intervall weitergegeben werden, indem dieses Array als zweites Element der Sequenz `wopts` übergeben und `infodict['momcom']` als erstes Element übergeben wird.
Wenn eine der Integrationsgrenzen unendlich ist, wird ein Fourier-Integral berechnet (vorausgesetzt w != 0). Wenn `full_output` gleich 1 ist und ein numerischer Fehler auftritt, wird zusätzlich zur Fehlermeldung, die dem Ausgabetupel angehängt ist, ein Wörterbuch angehängt, das die Fehlercodes im Array `info['ierlst']` in englische Meldungen übersetzt. Das Auskunftswörterbuch enthält anstelle von 'last', 'alist', 'blist', 'rlist' und 'elist' folgende Einträge:
- ‘lst’
Die Anzahl der für die Integration benötigten Unterintervalle (nennen wir sie `K_f`).
- ‘rslst’
Ein Array vom Rang 1 der Länge M_f=limlst, dessen erste `K_f` Elemente den Integralbeitrag über das Intervall `(a+(k-1)c, a+kc)` enthalten, wobei `c = (2*floor(|w|) + 1) * pi / |w|` und `k=1,2,...,K_f`.
- ‘erlst’
Ein Array vom Rang 1 der Länge `M_f`, das die Fehlerschätzung enthält, die dem Intervall in derselben Position in `infodict['rslist']` entspricht.
- ‘ierlst’
Ein ganzzahliger Array vom Rang 1 der Länge `M_f`, der ein Fehlerflag enthält, das dem Intervall in derselben Position in `infodict['rslist']` entspricht. Die Bedeutung der Codes finden Sie im Erklärungs-Wörterbuch (letzter Eintrag im Ausgabetupel).
Details zu den QUADPACK-Level-Routinen
quad ruft Routinen aus der FORTRAN-Bibliothek QUADPACK auf. Dieser Abschnitt liefert Details zu den Bedingungen für den Aufruf jeder Routine und eine kurze Beschreibung jeder Routine. Die aufgerufene Routine hängt von `weight`, `points` und den Integrationsgrenzen `a` und `b` ab.
QUADPACK-Routine
weight
points
unendliche Grenzen
qagse
None
Nein
Nein
qagie
None
Nein
Ja
qagpe
None
Ja
Nein
qawoe
‘sin’, ‘cos’
Nein
Nein
qawfe
‘sin’, ‘cos’
Nein
entweder `a` oder `b`
qawse
‘alg*’
Nein
Nein
qawce
‘cauchy’
Nein
Nein
Das Folgende liefert eine kurze Beschreibung von [1] für jede Routine.
- qagse
ist ein Integrator, der auf global adaptiver Intervallunterteilung in Verbindung mit Extrapolation basiert und die Auswirkungen von Integranden-Singularitäten verschiedener Arten eliminiert. Die Integration wird mit einer 21-Punkte-Gauss-Kronrod-Quadratur innerhalb jedes Unterintervalls durchgeführt.
- qagie
behandelt die Integration über unendliche Intervalle. Der unendliche Bereich wird auf ein endliches Intervall abgebildet und anschließend wird die gleiche Strategie wie in
QAGSangewendet.- qagpe
dient denselben Zwecken wie QAGS, erlaubt dem Benutzer jedoch auch, explizite Informationen über den Ort und die Art von Problempunkten anzugeben, d. h. die Abszissen von internen Singularitäten, Diskontinuitäten und anderen Schwierigkeiten der Integrandenfunktion.
- qawoe
ist ein Integrator zur Auswertung von \(\int^b_a \cos(\omega x)f(x)dx\) oder \(\int^b_a \sin(\omega x)f(x)dx\) über ein endliches Intervall [a,b], wobei \(\omega\) und \(f\) vom Benutzer spezifiziert werden. Die Regel-Auswertungskomponente basiert auf der modifizierten Clenshaw-Curtis-Technik.
Ein adaptives Unterteilungsverfahren wird in Verbindung mit einem Extrapolationsverfahren verwendet, das eine Modifikation des Verfahrens in `QAGS` ist und dem Algorithmus ermöglicht, mit Singularitäten in \(f(x)\) umzugehen.
- qawfe
berechnet die Fourier-Transformation \(\int^\infty_a \cos(\omega x)f(x)dx\) oder \(\int^\infty_a \sin(\omega x)f(x)dx\) für benutzerdefinierte \(\omega\) und \(f\). Das Verfahren von `QAWO` wird auf aufeinanderfolgenden endlichen Intervallen angewendet, und eine Konvergenzbeschleunigung mittels des \(\varepsilon\)-Algorithmus wird auf die Reihe der Integralannherungen angewendet.
- qawse
approximiert \(\int^b_a w(x)f(x)dx\), mit \(a < b\), wobei \(w(x) = (x-a)^{\alpha}(b-x)^{\beta}v(x)\) mit \(\alpha,\beta > -1\), wobei \(v(x)\) eine der folgenden Funktionen sein kann: \(1\), \(\log(x-a)\), \(\log(b-x)\), \(\log(x-a)\log(b-x)\).
Der Benutzer spezifiziert \(\alpha\), \(\beta\) und die Art der Funktion \(v\). Eine global adaptive Unterteilungsstrategie wird angewendet, mit modifizierter Clenshaw-Curtis-Integration auf denjenigen Unterintervallen, die `a` oder `b` enthalten.
- qawce
berechnet \(\int^b_a f(x) / (x-c)dx\), wobei das Integral als Cauchy-Hauptwert-Integral für benutzerdefiniertes \(c\) und \(f\) interpretiert werden muss. Die Strategie ist global adaptiv. Die modifizierte Clenshaw-Curtis-Integration wird auf denjenigen Intervallen verwendet, die den Punkt \(x = c\) enthalten.
Integration einer komplexwertigen Funktion einer reellen Variablen
Eine komplexwertige Funktion \(f\) einer reellen Variablen kann als \(f = g + ih\) geschrieben werden. Ebenso kann das Integral von \(f\) als
\[\int_a^b f(x) dx = \int_a^b g(x) dx + i\int_a^b h(x) dx\]geschrieben werden, vorausgesetzt, dass die Integrale von \(g\) und \(h\) über das Intervall \([a,b]\) existieren [2]. Daher integriert `quad` komplexwertige Funktionen, indem es die reellen und imaginären Komponenten getrennt integriert.
Referenzen
[1]Piessens, Robert; de Doncker-Kapenga, Elise; Überhuber, Christoph W.; Kahaner, David (1983). QUADPACK: A subroutine package for automatic integration. Springer-Verlag. ISBN 978-3-540-12553-2.
[2]McCullough, Thomas; Phillips, Keith (1973). Foundations of Analysis in the Complex Plane. Holt Rinehart Winston. ISBN 0-03-086370-8
Beispiele
Berechne \(\int^4_0 x^2 dx\) und vergleiche mit einem analytischen Ergebnis
>>> from scipy import integrate >>> import numpy as np >>> x2 = lambda x: x**2 >>> integrate.quad(x2, 0, 4) (21.333333333333332, 2.3684757858670003e-13) >>> print(4**3 / 3.) # analytical result 21.3333333333
Berechne \(\int^\infty_0 e^{-x} dx\)
>>> invexp = lambda x: np.exp(-x) >>> integrate.quad(invexp, 0, np.inf) (1.0, 5.842605999138044e-11)
Berechne \(\int^1_0 a x \,dx\) für \(a = 1, 3\)
>>> f = lambda x, a: a*x >>> y, err = integrate.quad(f, 0, 1, args=(1,)) >>> y 0.5 >>> y, err = integrate.quad(f, 0, 1, args=(3,)) >>> y 1.5
Berechne \(\int^1_0 x^2 + y^2 dx\) mit ctypes, wobei y als Parameter 1 gehalten wird
testlib.c => double func(int n, double args[n]){ return args[0]*args[0] + args[1]*args[1];} compile to library testlib.*
from scipy import integrate import ctypes lib = ctypes.CDLL('/home/.../testlib.*') #use absolute path lib.func.restype = ctypes.c_double lib.func.argtypes = (ctypes.c_int,ctypes.c_double) integrate.quad(lib.func,0,1,(1)) #(1.3333333333333333, 1.4802973661668752e-14) print((1.0**3/3.0 + 1.0) - (0.0**3/3.0 + 0.0)) #Analytic result # 1.3333333333333333
Beachten Sie, dass Pulsschemata und andere scharfe Merkmale im Vergleich zur Größe des Integrationsintervalls möglicherweise nicht korrekt integriert werden. Ein vereinfachtes Beispiel für diese Einschränkung ist die Integration einer spiegelbildlichen Sprungfunktion auf der y-Achse mit vielen Nullwerten innerhalb der Integrationsgrenzen.
>>> y = lambda x: 1 if x<=0 else 0 >>> integrate.quad(y, -1, 1) (1.0, 1.1102230246251565e-14) >>> integrate.quad(y, -1, 100) (1.0000000002199108, 1.0189464580163188e-08) >>> integrate.quad(y, -1, 10000) (0.0, 0.0)