nquad#
- scipy.integrate.nquad(func, ranges, args=None, opts=None, full_output=False)[Quelle]#
Integration über mehrere Variablen.
Wickelt
quadein, um die Integration über mehrere Variablen zu ermöglichen. Verschiedene Optionen erlauben eine verbesserte Integration von diskontinuierlichen Funktionen, sowie die Verwendung gewichteter Integration und generell eine feinere Steuerung des Integrationsprozesses.- Parameter:
- func{callable, scipy.LowLevelCallable}
Die zu integrierende Funktion. Hat Argumente von
x0, ... xn,t0, ... tm, wobei die Integration überx0, ... xndurchgeführt wird, welche float sein müssen. Wobeit0, ... tmzusätzliche Argumente sind, die in args übergeben werden. Die Funktionssignatur solltefunc(x0, x1, ..., xn, t0, t1, ..., tm)lauten. Die Integration wird in Reihenfolge durchgeführt. Das heißt, die Integration überx0ist das innerste Integral undxnist das äußerste.Wenn der Benutzer eine verbesserte Integrationsleistung wünscht, kann f eine
scipy.LowLevelCallablemit einer der Signaturen seindouble func(int n, double *xx) double func(int n, double *xx, void *user_data)
wobei
ndie Anzahl der Variablen und Argumente ist. Dasxx-Array enthält die Koordinaten und zusätzlichen Argumente.user_datasind die Daten, die in derscipy.LowLevelCallableenthalten sind.- rangesiterierbares Objekt
Jedes Element von ranges kann entweder eine Sequenz von 2 Zahlen oder eine aufrufbare Funktion sein, die eine solche Sequenz zurückgibt.
ranges[0]entspricht der Integration über x0 und so weiter. Wenn ein Element von ranges aufrufbar ist, wird es mit allen verfügbaren Integrationsargumenten sowie allen parametrischen Argumenten aufgerufen. z.B. wennfunc = f(x0, x1, x2, t0, t1), dann kannranges[0]entweder als(a, b)oder als(a, b) = range0(x1, x2, t0, t1)definiert werden.- argsiterierbares Objekt, optional
Zusätzliche Argumente
t0, ... tn, die vonfunc,rangesundoptsbenötigt werden.- optsiterierbares Objekt oder dict, optional
Optionen, die an
quadübergeben werden. Kann leer sein, ein dict oder eine Sequenz von dicts oder Funktionen, die ein dict zurückgeben. Wenn leer, werden die Standardoptionen von scipy.integrate.quad verwendet. Wenn ein dict, werden die gleichen Optionen für alle Integrationslevel verwendet. Wenn eine Sequenz, dann entspricht jedes Element der Sequenz einer bestimmten Integration. z.B. entsprichtopts[0]der Integration überx0und so weiter. Wenn aufrufbar, muss die Signatur die gleiche sein wie fürranges. Die verfügbaren Optionen zusammen mit ihren Standardwerten sindepsabs = 1.49e-08
epsrel = 1.49e-08
limit = 50
points = None
weight = None
wvar = None
wopts = None
Weitere Informationen zu diesen Optionen finden Sie unter
quad.- full_outputbool, optional
Partielle Implementierung von
full_outputaus scipy.integrate.quad. Die Anzahl der Integrandenfunktionsauswertungennevalkann durch Setzen vonfull_output=Truebeim Aufruf von nquad erhalten werden.
- Rückgabe:
- resultfloat
Das Ergebnis der Integration.
- abserrfloat
Das Maximum der Schätzungen des absoluten Fehlers in den verschiedenen Integrationsergebnissen.
- out_dictdict, optional
Ein Dict, das zusätzliche Informationen zur Integration enthält.
Siehe auch
quad1-D numerische Integration
dblquad,tplquadDoppel- und Dreifachintegrale
fixed_quadGauß-Quadratur mit festem Ordnung
Hinweise
Für gültige Ergebnisse muss das Integral konvergieren; das Verhalten bei divergenten Integralen ist nicht garantiert.
Details zu den QUADPACK-Level-Routinen
nquadruft Routinen aus der FORTRAN-Bibliothek QUADPACK auf. Dieser Abschnitt gibt 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 gibt eine kurze Beschreibung aus [1] für jede Routine.
- qagse
ist ein Integrator, der auf global adaptiver Intervallunterteilung in Verbindung mit Extrapolation basiert und die Effekte von Integranden-Singularitäten verschiedener Typen eliminiert. Die Integration wird mit einer 21-Punkt-Gauss-Kronrod-Quadratur innerhalb jedes Teilintervalls 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 aber auch die Angabe expliziter Informationen über den Ort und die Art von Problempunkten, d.h. die Abszissen von inneren 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 Komponente zur Regelbewertung basiert auf der modifizierten Clenshaw-Curtis-Technik.
Ein adaptives Unterteilungsverfahren wird in Verbindung mit einem Extrapolationsverfahren verwendet, das eine Modifikation des Verfahrens in
QAGSist und es 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 vom Benutzer bereitgestellte \(\omega\) und \(f\). Das Verfahren von
QAWOwird auf aufeinanderfolgenden endlichen Intervallen angewendet und die Konvergenzbeschleunigung mittels des \(\varepsilon\)-Algorithmus wird auf die Reihen der Integralapproximationen 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 gibt \(\alpha\), \(\beta\) und die Art der Funktion \(v\) an. Eine global adaptive Unterteilungsstrategie wird angewendet, mit modifizierter Clenshaw-Curtis-Integration auf denjenigen Teilintervallen, die a oder b enthalten.
- qawce
berechnet \(\int^b_a f(x) / (x-c)dx\), wobei das Integral als Cauchy-Hauptwertintegral interpretiert werden muss, für vom Benutzer spezifiziertes \(c\) und \(f\). Die Strategie ist global adaptiv. Modifizierte Clenshaw-Curtis-Integration wird auf denjenigen Intervallen verwendet, die den Punkt \(x = c\) enthalten.
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.
Beispiele
Berechnen
\[\int^{1}_{-0.15} \int^{0.8}_{0.13} \int^{1}_{-1} \int^{1}_{0} f(x_0, x_1, x_2, x_3) \,dx_0 \,dx_1 \,dx_2 \,dx_3 ,\]wo
\[\begin{split}f(x_0, x_1, x_2, x_3) = \begin{cases} x_0^2+x_1 x_2-x_3^3+ \sin{x_0}+1 & (x_0-0.2 x_3-0.5-0.25 x_1 > 0) \\ x_0^2+x_1 x_2-x_3^3+ \sin{x_0}+0 & (x_0-0.2 x_3-0.5-0.25 x_1 \leq 0) \end{cases} .\end{split}\]>>> import numpy as np >>> from scipy import integrate >>> func = lambda x0,x1,x2,x3 : x0**2 + x1*x2 - x3**3 + np.sin(x0) + ( ... 1 if (x0-.2*x3-.5-.25*x1>0) else 0) >>> def opts0(*args, **kwargs): ... return {'points':[0.2*args[2] + 0.5 + 0.25*args[0]]} >>> integrate.nquad(func, [[0,1], [-1,1], [.13,.8], [-.15,1]], ... opts=[opts0,{},{},{}], full_output=True) (1.5267454070738633, 2.9437360001402324e-14, {'neval': 388962})
Berechnen
\[\int^{t_0+t_1+1}_{t_0+t_1-1} \int^{x_2+t_0^2 t_1^3+1}_{x_2+t_0^2 t_1^3-1} \int^{t_0 x_1+t_1 x_2+1}_{t_0 x_1+t_1 x_2-1} f(x_0,x_1, x_2,t_0,t_1) \,dx_0 \,dx_1 \,dx_2,\]wo
\[\begin{split}f(x_0, x_1, x_2, t_0, t_1) = \begin{cases} x_0 x_2^2 + \sin{x_1}+2 & (x_0+t_1 x_1-t_0 > 0) \\ x_0 x_2^2 +\sin{x_1}+1 & (x_0+t_1 x_1-t_0 \leq 0) \end{cases}\end{split}\]und \((t_0, t_1) = (0, 1)\).
>>> def func2(x0, x1, x2, t0, t1): ... return x0*x2**2 + np.sin(x1) + 1 + (1 if x0+t1*x1-t0>0 else 0) >>> def lim0(x1, x2, t0, t1): ... return [t0*x1 + t1*x2 - 1, t0*x1 + t1*x2 + 1] >>> def lim1(x2, t0, t1): ... return [x2 + t0**2*t1**3 - 1, x2 + t0**2*t1**3 + 1] >>> def lim2(t0, t1): ... return [t0 + t1 - 1, t0 + t1 + 1] >>> def opts0(x1, x2, t0, t1): ... return {'points' : [t0 - t1*x1]} >>> def opts1(x2, t0, t1): ... return {} >>> def opts2(t0, t1): ... return {} >>> integrate.nquad(func2, [lim0, lim1, lim2], args=(0,1), ... opts=[opts0, opts1, opts2]) (36.099919226771625, 1.8546948553373528e-07)