Schätzen Sie π nach der Monte-Carlo-Methode.
Zeichnen Sie eine Zufallszahl mit einheitlichen x- und y-Koordinaten als Punkte im Quadrat. Durch Zählen der Anzahl der Punkte im Kreis kann die Wahrscheinlichkeit von Punkten im Kreis berechnet werden.
Die Fläche kann aus dieser Wahrscheinlichkeit erhalten werden.
Nehmen Sie insbesondere ein Quadrat an, dessen x- und y-Koordinaten (-1, -1) und (1, 1) sind, und einen Kreis, der in engem Kontakt damit steht.
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np
fig,ax = plt.subplots(figsize=(5, 5))
rect = patches.Rectangle((-1,-1),2,2,linewidth=1, fill=False, color='blue')
ax.add_patch(rect)
ax.add_artist(plt.Circle((0, 0), 1, fill=False, color='r'))
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_xlim(-2,2)
ax.set_ylim(-2,2)
Zählen Sie die Anzahl der Punkte innerhalb dieses roten Kreises.
df = pd.DataFrame(
(1 + 1) * np.random.rand(1000, 2) - 1,
columns=['x', 'y'])
fig, ax = plt.subplots(figsize=(5, 5))
ax.scatter(df.x, df.y, s=1, color='black')
rect = patches.Rectangle((-1,-1),2,2,linewidth=1, fill=False, color='blue')
ax.add_patch(rect)
circle = plt.Circle((0, 0), 1, fill=False, color='r')
ax.add_artist(circle)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_xlim(-2,2)
ax.set_ylim(-2,2)
Berechnen Sie, wie viele dieser Punkte sich im Kreis befinden.
df["is_inside_circle"] = df.x**2 + df.y**2 <= 1
len(df[df.is_inside_circle]) # 798
Wie man zählt
Ich zähle die Anzahl der Punkte, die werden.
Infolgedessen befinden sich 798 von 1000 im Kreis.
Wenn man bedenkt, dass 79,8% der Quadrate aus Punkten bestehen, ist die Fläche des Kreises
Nach der Kreisformel ist π = 3,14
Der Wert ist näher.
Das Verfahren zum Anordnen von 1000 Punkten leitet sich vom Verfahren zum Erzeugen von numpy Zufallszahlen ab. Daher tritt eine Vorspannung auf, bei der zufällig viele Punkte im Kreis platziert werden.
Daher kann durch Erhöhen der Anzahl von Versuchen (Anzahl von Simulationen) die Wahrscheinlichkeitsverteilung des berechneten π-Werts gesucht werden.
Lassen Sie uns dies 1000 Mal simulieren.
results = [] #Geben Sie den geschätzten Wert von π in diese Variable ein
for i in range(1000):
rand_num = 1000
xy = (1 + 1) * np.random.rand(rand_num, 2) - 1
df = pd.DataFrame(xy, columns=['x', 'y'])
df["is_inside_circle"] = df.x**2 + df.y**2 <= 1
ans = 4*len(df[df.is_inside_circle == True])/rand_num
results.append(ans)
#Formatierung zum Zeichnen
r_df = pd.DataFrame(results, columns=['area'])
plt.hist(r_df.area, bins=50)
print(f"mean: {np.mean(results)}") #durchschnittlich: 3.1412359999999997
print(f"variance: {np.var(results)}") #Verteilt: 0.0026137523040000036
Indem Sie es 1000 Mal versuchen
"Bei der Monte-Carlo-Methode mit 1000 Punkten kann π Werte im Bereich von durchschnittlich 3,1412 und einer Dispersion von 0,0026 annehmen."
Die Standardabweichung kann ermittelt werden, indem die Quadratwurzel der Varianz gezogen wird.
np.sqrt(np.var(results)) # 0.051124869721105436
Unter der Annahme, dass die Wahrscheinlichkeitsverteilung des geschätzten Wertes von π einer Normalverteilung folgt, kann Folgendes gefunden werden.
68% der Werte liegen innerhalb von ± 1σ vom Durchschnitt, 95% der Werte liegen innerhalb von ± 2σ vom Durchschnitt und 99,7% liegen innerhalb von ± 3σ vom Durchschnitt. (Σ = Standardabweichung = 0,051 hier)
Lassen Sie uns tatsächlich berechnen.
Anzahl der Punkte im Bereich ± 1σ vom Durchschnitt
result_mean = np.mean(results)
sigma = np.sqrt(np.var(results))
#Anzahl der Punkte im Bereich ± 1σ vom Durchschnitt
len([result for result in results if result >result_mean + (-1) * sigma and result < result_mean + 1 * sigma])
# 686
#Anzahl der Punkte im Bereich ± 2σ vom Durchschnitt
len([result for result in results if result >result_mean + (-2) * sigma and result < result_mean + 2 * sigma])
# 958
#Anzahl der Punkte im Bereich ± 3σ vom Durchschnitt
len([result for result in results if result >result_mean + (-3) * sigma and result < result_mean + 3 * sigma])
# 998
Daraus ist ersichtlich, dass eine Zahl nahe der Normalverteilung erhalten werden kann.
In diesem Artikel sagte ich: "Ich werde 1000 Punkte in einem Quadrat treffen und versuchen, π 1000 Mal zu berechnen." Es gibt zwei Variablen: die Anzahl der Punkte im Viereck und die Anzahl der Simulationen von π.
Durch Ändern dieser Variablen
Das ist realisiert.
Recommended Posts