Dies ist ein Artikel, der versucht hat, die Monte-Carlo-Methode zu implementieren. Ich habe ganz vergessen.
Während ich ein Statistikbuch für Kinder las [1], sah ich einen Artikel über das Streuen von Reiskörnern und das Berechnen des Umfangsverhältnisses. Es schien interessant zu sein, also berechnete ich das Umfangsverhältnis unter Verwendung der zufällig erzeugten x- und y-Koordinatendaten.
[Verfahren] Es ist fast so
Es war schwierig, Reiskörner zu säen und zu experimentieren, also versuchte ich es an einem Computer.
import numpy as np
import random
import matplotlib.pyplot as plt
import matplotlib.patches as patches
Definieren Sie als Nächstes einige Listen und Konstanten. Dieses Mal verwenden wir ein Quadrat mit einer Seite und einen Kreis mit einem Radius von 0,5.
Der Zweck dieser Zeit ist es zu untersuchen, wie viele Reiskörner benötigt werden sollten, um einen Wert nahe dem tatsächlichen Umfangsverhältnis zu berechnen. Daher wurde ein Beispiel für die Anzahl der Proben vorläufig in n_list definiert.
#Anzahl der generierten Koordinaten
n_list = [10, 20, 50, 70, 100, 500, 1000, 5000, 10000, 100000,1000000]
#Kreisradius
radius = 0.5
#Initialisierung der Liste des Umfangsverhältnisses
pi_list = []
Definiert eine Funktion, die zufällige Koordinatendaten generiert (entsprechend einem Reiskorn, das um ein Durcheinander gewickelt ist).
def gen_random_coordinate(n):
#Initialisieren Sie die generierte Koordinatenliste
x=[]
y=[]
#Generieren Sie Koordinaten mit Zufallszahlen
x = np.random.rand(n)
y = np.random.rand(n)
return x,y
Visualisieren Sie, wie Sie tatsächlich zufällige Koordinaten gezeichnet haben.
#Grafikzeichnungsfunktion
def make_graph(x,y):
#Erstellen Sie gleichzeitig ein Figurenobjekt und ein dazugehöriges Achsenobjekt
fig, ax = plt.subplots()
#Einen Kreis erstellen
circle = patches.Circle(xy=(0.5,0.5), radius=0.5, ec='r', fill=False)
#Stellen Sie das richtige Seitenverhältnis ein
ax.set_aspect('equal')
ax.add_patch(circle)
ax.scatter(x,y)
plt.axis('scaled')
plt.grid()
plt.xlim(0, 1.0)
plt.ylim(0, 1.0)
plt.show()
Berechnen Sie das Umfangsverhältnis anhand der Anzahl der Punkte innerhalb und der Anzahl der Punkte außerhalb des Kreises.
def calc_circular_constant(x,y):
#Initialisierung der Anzahl der Punkte innerhalb des Kreises
inner=0
#Initialisierung der Anzahl der Punkte außerhalb des Kreises
outer=0
#Zählen Sie die Anzahl der Punkte, unabhängig davon, ob sich jeder Punkt innerhalb oder außerhalb des Kreises befindet
for xx , yy in zip(x,y):
#Berechnen Sie den Abstand vom Mittelpunkt des Kreises
dist=np.sqrt(np.square(xx-radius)+np.square(yy-radius))
if dist > radius:
outer +=1
else:
inner +=1
print('inner:outer = ', str(inner), ':', str(outer))
#Berechnen Sie das Umfangsverhältnis
pi = inner /(outer+inner) *4
pi_list.append(pi)
return pi
Führen Sie jede der oben definierten Funktionen aus. Sie haben überprüft, wie viele Proben Sie benötigen sollten, um dem tatsächlichen Umfangsverhältnis näher zu kommen. Also werde ich sie der Reihe nach anhand einer Liste von Beispielen n_list ausprobieren.
for n in n_list:
x,y = gen_random_coordinate(n)
make_graph(x,y)
print(calc_circular_constant(x,y))
Das Folgende ist das Ausgabeergebnis. Die Anzahl der Samples beginnt bei 10 und die Anzahl der Punkte steigt, wenn Sie nach unten gehen.
Innerer Kreispunkt: Äußerer Kreispunkt = 8: 2 Berechnetes Umfangsverhältnis: 3.2
Innerer Kreispunkt: Äußerer Kreispunkt = 16: 4 Berechnetes Umfangsverhältnis: 3.2
Innerer Kreispunkt: Äußerer Kreispunkt = 39: 11 Berechnetes Umfangsverhältnis: 3.12
Innerer Kreispunkt: Äußerer Kreispunkt = 53: 17 Berechnetes Umfangsverhältnis: 3.0285714285714285
Innerer Kreispunkt: Äußerer Kreispunkt = 79: 21 Berechnetes Umfangsverhältnis: 3.16
Innerer Kreispunkt: Äußerer Kreispunkt = 399: 101 Berechnetes Umfangsverhältnis: 3,192
Innerer Kreispunkt: Äußerer Kreispunkt = 793: 207 Berechnetes Umfangsverhältnis: 3,172
Punkte innerhalb des Kreises: Punkte außerhalb des Kreises = 3894: 1106 Berechnetes Umfangsverhältnis: 3,1152
Punkte innerhalb des Kreises: Punkte außerhalb des Kreises = 7818: 2182 Berechnetes Umfangsverhältnis: 3.1272
Punkte innerhalb des Kreises: Punkte außerhalb des Kreises = 78611: 21389 Berechnetes Umfangsverhältnis: 3.14444
Punkte innerhalb des Kreises: Punkte außerhalb des Kreises = 785814: 214186 Berechnetes Umfangsverhältnis: 3.143256
In diesem Experiment wurde bestätigt, dass es sich mit zunehmender Anzahl von Proben dem tatsächlichen Umfangsverhältnis näherte. Das Diagramm wurde tiefblau, als die Anzahl der Daten 5.000 überschritt. Am Ende war es 3,143256, was nahe am tatsächlichen Umfangsverhältnis (3,141592653589 ..) lag.
Wenn die Anzahl der Daten ungefähr 100 beträgt, ist sie immer noch weit von 3,16 entfernt. (Das stimmt, aber ich habe den Grund in 5 geschrieben.)
Die zu erzeugenden Daten müssen ebenfalls gleichmäßig zufällige Daten sein. Wenn Sie mit der obigen Methode Daten generieren, die einer Normalverteilung folgen, können Sie kein angemessenes Umfangsverhältnis berechnen. (Ich frage mich, ob ich das Äußere anhand der Anzahl der Daten innerhalb des Kreises korrigieren kann. Ich werde es zu einem anderen Zeitpunkt versuchen.)
Selbst wenn ich es jetzt schreibe, egal wie gut es mit 100 geht, wird es in 0,04 Schritten berechnet, also wird es nach 3.12 3.16 sein. (Ich habe diesen Punkt nicht wirklich angesprochen, weil ich das obige Experiment durchführen wollte.)
Wenn Sie Ergebnisse wie das Umfangsverhältnis erzielen möchten, das Sie in der Grundschule lernen, benötigen Sie 400 Daten. (Weil der Schritt des zu berechnenden Umfangsverhältnisses 0,01 beträgt). Wenn Sie es immer und immer wieder tun, wird wahrscheinlich die Nummer 3.14 herauskommen.
Selbst wenn Sie die Reiskörner nur außerhalb des Kreises zählen, scheint es ein schwieriges Experiment zu sein, 400 Reiskörner zu streuen und viele Male zu versuchen. Da das Reiskorn selbst ebenfalls groß ist, müssen Sie anscheinend ein Papier mit der entsprechenden Größe vorbereiten.
Wenn Sie Kinder haben, wie wäre es mit einem kostenlosen Studium der plötzlich langen "Frühlingsferien"?
[1] Wofür sind Statistiken nützlich? (Autor) Yoshiyuki Wakui (Bearbeiten) Redaktion für Kinderwissenschaft / Seibundo Shinkosha https://www.seibundo-shinkosha.net/book/kids/20689/