Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Python-Programmierung zur Berechnung bestimmter Integrale mithilfe der Monte-Carlo-Methode

Detaillierte Erläuterung der Python-Programmierung zur Berechnung bestimmter Integrale mithilfe der Monte-Carlo-Methode

不言
不言Original
2018-04-27 15:21:065241Durchsuche

Dieser Artikel stellt hauptsächlich die detaillierte Erklärung der Berechnung bestimmter Integrale mithilfe der Monte-Carlo-Methode in der Python-Programmierung vor. Er hat einen gewissen Referenzwert und Freunde in Not können sich darauf beziehen.

Ich glaube, damals, als ich die Postgraduierten-Aufnahmeprüfung ablegte, wünschte ich, ich wüsste, dass es so eine gute Sache gibt, bestimmte Integrale zu berechnen. . . Nur ein Scherz, die Berechnung bestimmter Integrale war damals nicht so einfach. Aber es brachte mich auf die Idee, Programmiersprachen zur Lösung komplexerer mathematischer Probleme zu verwenden. Kommen wir zum Punkt.

Wie in der obigen Abbildung gezeigt, besteht die Berechnung des Integrals von f(x) im Intervall [ab] darin, die Fläche des roten Bereichs zu ermitteln, der von der eingeschlossen ist Kurve und der X-Achse. Im Folgenden wird die Monte-Carlo-Methode verwendet, um das bestimmte Integral im Intervall [2 3] zu berechnen: ∫(x2+4*x*sin(x))dx


von Wie aus der obigen Abbildung ersichtlich ist, nimmt der Berechnungsfehler mit zunehmender Anzahl der Abtastpunkte allmählich ab. Es gibt zwei Möglichkeiten, die Genauigkeit der Simulationsergebnisse zu verbessern: Eine besteht darin, die Anzahl der Tests N zu erhöhen. Die andere besteht darin, die Varianz σ2 zu verringern Um die Genauigkeit zu verbessern, ist der Zweck offensichtlich unangemessen. Als nächstes stellen wir die wichtige Stichprobenmethode vor, um die Varianz zu reduzieren und die Genauigkeit der Integralberechnung zu verbessern.


Das Merkmal der Wichtigkeitsstichprobenmethode besteht darin, dass sie nicht aus der Wahrscheinlichkeitsverteilung eines bestimmten Prozesses Stichproben zieht, sondern aus einer modifizierten Wahrscheinlichkeitsverteilung, sodass Ereignisse, die für die Simulationsergebnisse wichtig sind, häufiger auftreten. Dadurch wird die Stichprobeneffizienz verbessert und die Rechenzeit reduziert, die für Ereignisse aufgewendet wird, die für die Simulationsergebnisse unbedeutend sind. Ermitteln Sie beispielsweise das Integral von g(x) im Intervall [a b]. Wenn eine gleichmäßige Abtastung verwendet wird, entspricht die Anzahl der in dem Intervall erzeugten Abtastpunkte, in denen der Funktionswert g(x) relativ klein ist, der Anzahl Wenn die Abtastpunkte in dem Intervall erzeugt werden, in dem der Funktionswert groß ist, ist die Abtasteffizienz offensichtlich nicht hoch. Sie können die Abtastwahrscheinlichkeitsdichtefunktion in f(x) ändern, sodass die Formen von f(x) und g( x) sind ähnlich, wodurch sichergestellt werden kann, dass die Wahrscheinlichkeit des Auftretens von Abtastwerten, die einen großen Beitrag zur Integralberechnung leisten, größer ist als der Abtastwert mit geringem Beitrag, d. h. die Integraloperation kann wie folgt umgeschrieben werden:

x ist eine Zufallsvariable, die durch Abtasten gemäß der Wahrscheinlichkeitsdichte f(x) erhalten wird, offensichtlich sollte im Intervall [a b ] Folgendes enthalten:

Daher kann der Integralwert I leicht als Erwartungswert der Zufallsvariablen Y = g(x)/f(x) betrachtet werden. In der Formel ist xi ein Abtastpunkt, der der Wahrscheinlichkeitsdichte f(x) unterliegt.

Das folgende Beispiel verwendet eine Normalverteilungsfunktion f(x), um g(x)=sin(x)*x anzunähern, und wählt den Abtastwert entsprechend der Normalverteilung aus Verteilung zur Berechnung der Integralzahl ∫g(x)dx auf dem Intervall [0 pi]

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

def f(x):
  return x**2 + 4*x*np.sin(x) 
def intf(x): 
  return x**3/3.0+4.0*np.sin(x) - 4.0*x*np.cos(x)
a = 2;  
b = 3; 
# use N draws 
N= 10000
X = np.random.uniform(low=a, high=b, size=N) # N values uniformly drawn from a to b 
Y =f(X)  # CALCULATE THE f(x) 
# 蒙特卡洛法计算定积分:面积=宽度*平均高度
Imc= (b-a) * np.sum(Y)/ N;
exactval=intf(b)-intf(a)
print "Monte Carlo estimation=",Imc, "Exact number=", intf(b)-intf(a)
# --How does the accuracy depends on the number of points(samples)? Lets try the same 1-D integral 
# The Monte Carlo methods yield approximate answers whose accuracy depends on the number of draws.
Imc=np.zeros(1000)
Na = np.linspace(0,1000,1000)
exactval= intf(b)-intf(a)
for N in np.arange(0,1000):
  X = np.random.uniform(low=a, high=b, size=N) # N values uniformly drawn from a to b 
  Y =f(X)  # CALCULATE THE f(x) 
  Imc[N]= (b-a) * np.sum(Y)/ N;   
plt.plot(Na[10:],np.sqrt((Imc[10:]-exactval)**2), alpha=0.7)
plt.plot(Na[10:], 1/np.sqrt(Na[10:]), 'r')
plt.xlabel("N")
plt.ylabel("sqrt((Imc-ExactValue)$^2$)")
plt.show()

Aus der Abbildung ist ersichtlich, dass die Form der Kurve sin(x)*x der Form der Normalverteilungskurve ähnelt, sodass die Anzahl der Abtastpunkte an der Spitze der Kurve größer ist als die Position auf der Kurve Es gibt mehr Tiefstellen. Das Ergebnis der genauen Berechnung ist pi. Wie aus dem rechten Bild oben hervorgeht, berechnen beide Methoden das bestimmte Integral 1000 Mal. Die Ergebnisse liegen am weitesten vom genauen Wert entfernt. Je kleiner die Zahl, desto offensichtlicher ist dies im Einklang mit der herkömmlichen. Der Unterschied im Quadrat des Integralwerts, der mit der traditionellen Methode (rotes Histogramm) berechnet wird, ist jedoch deutlich größer als bei der wichtigen Stichprobenmethode (blaues Histogramm). Daher kann die Verwendung der Wichtigkeitsstichprobenmethode zur Berechnung die Varianz verringern und die Genauigkeit verbessern. Darüber hinaus ist zu beachten, dass die Wahl der Funktion f(x) die Genauigkeit der Berechnungsergebnisse beeinflusst. Wenn sich die von uns gewählte Funktion f(x) stark von g(x) unterscheidet, wird die Varianz der Berechnungsergebnisse variieren auch erhöhen.

Verwandte Empfehlungen:


So verwenden Sie NotImplementedError in Python programming_python


Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Python-Programmierung zur Berechnung bestimmter Integrale mithilfe der Monte-Carlo-Methode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn