[PYTHON] Mit Reiskörnern bestreuen, um das Umfangsverhältnis zu ermitteln (Monte-Carlo-Methode)

Nachtrag

Dies ist ein Artikel, der versucht hat, die Monte-Carlo-Methode zu implementieren. Ich habe ganz vergessen.

1. Zuallererst

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

  1. Bereiten Sie ein Quadrat und einen Kreis vor, die in dieses Quadrat eingeschrieben sind.
  2. Zeichnen Sie dort zufällig (zufällig). Der Punkt ist, dass dieser ** Mist **!
  3. Ermitteln Sie das Umfangsverhältnis aus der Anzahl der Koordinaten innerhalb und außerhalb des Kreises. image.png [Zweck] Mal sehen, wie viele Koordinaten (Probe, dh Reiskörner) benötigt werden, um einen Wert nahe dem tatsächlichen Umfangsverhältnis oder einen Wert nahe dem Umfangsverhältnis zu berechnen.

2. Implementieren

Es war schwierig, Reiskörner zu säen und zu experimentieren, also versuchte ich es an einem Computer.

2-1. Module importieren.

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 = []

2-2. Zufällige Koordinaten generieren

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

2-3. Visualisieren

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()

2-4 Berechnen Sie das Umfangsverhältnis aus den Koordinatendaten

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

2-5 Ausführen

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))

3. Versuchsergebnisse

Das Folgende ist das Ausgabeergebnis. Die Anzahl der Samples beginnt bei 10 und die Anzahl der Punkte steigt, wenn Sie nach unten gehen.

image.png Innerer Kreispunkt: Äußerer Kreispunkt = 8: 2 Berechnetes Umfangsverhältnis: 3.2

image.png Innerer Kreispunkt: Äußerer Kreispunkt = 16: 4 Berechnetes Umfangsverhältnis: 3.2

image.png Innerer Kreispunkt: Äußerer Kreispunkt = 39: 11 Berechnetes Umfangsverhältnis: 3.12

image.png Innerer Kreispunkt: Äußerer Kreispunkt = 53: 17 Berechnetes Umfangsverhältnis: 3.0285714285714285

image.png Innerer Kreispunkt: Äußerer Kreispunkt = 79: 21 Berechnetes Umfangsverhältnis: 3.16

image.png Innerer Kreispunkt: Äußerer Kreispunkt = 399: 101 Berechnetes Umfangsverhältnis: 3,192

image.png Innerer Kreispunkt: Äußerer Kreispunkt = 793: 207 Berechnetes Umfangsverhältnis: 3,172

image.png Punkte innerhalb des Kreises: Punkte außerhalb des Kreises = 3894: 1106 Berechnetes Umfangsverhältnis: 3,1152

image.png Punkte innerhalb des Kreises: Punkte außerhalb des Kreises = 7818: 2182 Berechnetes Umfangsverhältnis: 3.1272

image.png Punkte innerhalb des Kreises: Punkte außerhalb des Kreises = 78611: 21389 Berechnetes Umfangsverhältnis: 3.14444

image.png Punkte innerhalb des Kreises: Punkte außerhalb des Kreises = 785814: 214186 Berechnetes Umfangsverhältnis: 3.143256

4. Zusammenfassung

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.)

5. Schließlich

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"?

Verweise

[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/

Recommended Posts

Mit Reiskörnern bestreuen, um das Umfangsverhältnis zu ermitteln (Monte-Carlo-Methode)
#Monte Carlo-Methode zum Ermitteln des Umfangsverhältnisses mit Python
Einführung in die Monte-Carlo-Methode
Finden Sie das Verhältnis der Fläche des Biwa-Sees nach der Monte-Carlo-Methode
Monte-Carlo-Methode
Versuchen Sie, die Monte-Carlo-Methode in Python zu implementieren
Die erste Markov-Ketten-Monte-Carlo-Methode von PyStan
Berechnung der kürzesten Route nach der Monte-Carlo-Methode
Erhöhen Sie die Geschwindigkeit der Monte-Carlo-Methode zur Implementierung von Cython-Ausschnitten.
[Statistik] Visualisieren und verstehen Sie die Hamiltonsche Monte-Carlo-Methode mit Animation.
Simulieren Sie die Monte-Carlo-Methode in Python
Schätzung von π nach der Monte-Carlo-Methode