qmc_quad#
- scipy.integrate.qmc_quad(func, a, b, *, n_estimates=8, n_points=1024, qrng=None, log=False)[Quelle]#
Berechnet ein Integral in N-Dimensionen mittels Quasi-Monte-Carlo-Quadratur.
- Parameter:
- funccallable
Der Integrand. Muss ein einzelnes Argument
xakzeptieren, ein Array, das den Punkt (die Punkte) angibt, an denen der skalare Integrand ausgewertet werden soll, und den Wert (die Werte) des Integranden zurückgeben. Zur Effizienz sollte die Funktion vektorisiert sein, um ein Array der Form(d, n_points)zu akzeptieren, wobeiddie Anzahl der Variablen (d. h. die Dimensionalität des Funktionsbereichs) und n_points die Anzahl der Quadraturpunkte ist, und ein Array der Form(n_points,)zurückzugeben, den Integranden an jedem Quadraturpunkt.- a, barray-like
Eindimensionale Arrays, die die unteren und oberen Integrationsgrenzen für jede der
dVariablen angeben.- n_estimates, n_pointsint, optional
n_estimates (Standard: 8) statistisch unabhängige QMC-Stichproben, jeweils mit n_points (Standard: 1024) Punkten, werden von qrng generiert. Die Gesamtzahl der Punkte, an denen der Integrand func ausgewertet wird, beträgt
n_points * n_estimates. Siehe Hinweise für Details.- qrng
QMCEngine, optional Eine Instanz von QMCEngine, aus der QMC-Punkte abgeleitet werden. Die QMCEngine muss auf eine Anzahl von Dimensionen
dinitialisiert sein, die der Anzahl der Variablenx1, ..., xdentspricht, die an func übergeben werden. Die bereitgestellte QMCEngine wird verwendet, um die erste Integral-Schätzung zu erzeugen. Wenn n_estimates größer als eins ist, werden zusätzliche QMCEngines aus der ersten gespawnt (mit aktivierter Zufallsvermischung, falls dies eine Option ist). Wenn keine QMCEngine bereitgestellt wird, wird die Standard-scipy.stats.qmc.Haltonmit der aus der Länge von a ermittelten Anzahl von Dimensionen initialisiert.- logboolean, Standard: False
Wenn auf True gesetzt, gibt func den Logarithmus des Integranden zurück, und das Ergebnisobjekt enthält den Logarithmus des Integrals.
- Rückgabe:
- resultobject
Ein Ergebnisobjekt mit Attributen
- integralfloat
Die Schätzung des Integrals.
- standard_error
Die Fehlerschätzung. Siehe Hinweise zur Interpretation.
Hinweise
Die Werte des Integranden an jedem der n_points Punkte einer QMC-Stichprobe werden verwendet, um eine Schätzung des Integrals zu erzeugen. Diese Schätzung wird aus einer Population möglicher Schätzungen des Integrals gezogen, deren Wert wir erhalten, hängt von den spezifischen Punkten ab, an denen das Integral ausgewertet wurde. Wir führen diesen Prozess n_estimates Mal durch, wobei wir jedes Mal den Integranden an verschiedenen zufällig vermischten QMC-Punkten auswerten, was effektiv i.i.d. Zufallsstichproben aus der Population der Integral-Schätzungen zieht. Der Stichprobenmittelwert \(m\) dieser Integral-Schätzungen ist ein unverzerrter Schätzer des wahren Wertes des Integrals, und der Standardfehler des Mittels \(s\) dieser Schätzungen kann verwendet werden, um Konfidenzintervalle mithilfe der t-Verteilung mit
n_estimates - 1Freiheitsgraden zu erzeugen. Vielleicht kontraintuitiv, aber eine Erhöhung von n_points bei gleichbleibender Gesamtzahl der Funktionsauswertungspunkten_points * n_estimatestendiert dazu, den tatsächlichen Fehler zu reduzieren, während eine Erhöhung von n_estimates tendiert, die Fehlerschätzung zu verringern.Beispiele
QMC-Quadratur ist besonders nützlich für die Berechnung von Integralen in höheren Dimensionen. Ein Beispiel für einen Integranden ist die Wahrscheinlichkeitsdichtefunktion einer multivariaten Normalverteilung.
>>> import numpy as np >>> from scipy import stats >>> dim = 8 >>> mean = np.zeros(dim) >>> cov = np.eye(dim) >>> def func(x): ... # `multivariate_normal` expects the _last_ axis to correspond with ... # the dimensionality of the space, so `x` must be transposed ... return stats.multivariate_normal.pdf(x.T, mean, cov)
Zur Berechnung des Integrals über den Einheits-Hyperwürfel
>>> from scipy.integrate import qmc_quad >>> a = np.zeros(dim) >>> b = np.ones(dim) >>> rng = np.random.default_rng() >>> qrng = stats.qmc.Halton(d=dim, seed=rng) >>> n_estimates = 8 >>> res = qmc_quad(func, a, b, n_estimates=n_estimates, qrng=qrng) >>> res.integral, res.standard_error (0.00018429555666024108, 1.0389431116001344e-07)
Ein zweiseitiges 99%-Konfidenzintervall für das Integral kann geschätzt werden als
>>> t = stats.t(df=n_estimates-1, loc=res.integral, ... scale=res.standard_error) >>> t.interval(0.99) (0.0001839319802536469, 0.00018465913306683527)
Tatsächlich liegt der von
scipy.stats.multivariate_normalgemeldete Wert innerhalb dieses Bereichs.>>> stats.multivariate_normal.cdf(b, mean, cov, lower_limit=a) 0.00018430867675187443