[Calcul scientifique / technique par Python] Intégration Monte Carlo, calcul numérique, numpy

introduction

Par méthode d'intégration de Monte Carlo Calculez $ I = \ int_0 ^ 1 \ frac {4} {1 + x ^ 2} dx = \ pi $.

Contenu

(1) ** Calcul par méthode simple de Monte Carlo **. La zone est évaluée par le nombre de nombres aléatoires générés qui entrent dans la zone d'intégration (combien de balles sont lancées dans le tapis).

(2) ** Calcul de l'intégrale de Monte Carlo par la méthode de la valeur moyenne **. Une méthode dans laquelle la zone de définition d'une fonction est échantillonnée uniformément et la valeur moyenne des valeurs y aux points x générés est utilisée. En général, si la valeur moyenne de y est $ y_ {av} $

Intégration $ I = \ int_a ^ b f (x) dx \ sim \ frac {b-a} {N} y_ {av} $

Sera. Par conséquent, l'astuce de cette méthode est de déterminer $ y_ {av} $ par la méthode de Monte Carlo ** [1] **.

(3) ** Calcul intégrale multiple par la méthode de la valeur moyenne. **Par exemple, $\int_1^2 \int_1^2 \frac{1}{x+y} dx =10 ln2-6ln3 \sim 0.33979807 $ Calculer.


Code (1): ** Calcul par méthode simple de Monte Carlo **

simple_Monte_Carlo.py


import numpy as np
from random import random
"""
Méthode d'intégration simple de Monte Carlo:Nombre d'essais N de 10 à 10^Changer jusqu'à 7
"""
def f(x):
    return 1.0/(1.0+x**2) #Définition des fonctions

N_calc_list = [10, 10**2, 10**3, 10**4, 10**5, 10**6, 10**7]

for N in  N_calc_list:
    count = 0.0
    for i in range(N):
        x = random()  # [0,1]Stockez des nombres aléatoires uniformes jusqu'à x dans x
        y = random()  # [0,1]Stocker des nombres aléatoires uniformes jusqu'à y
        if y < f (x):   #Si vous entrez "Mato", comptez-le
            count +=1.0
    area = 4*count/N #Résultat d'intégration. Évaluation de π

    print(N, ", ", area, ", ", abs((np.pi-area)/np.pi)) #Sortie de résultat

Résultat (1)

10 ,  4.0 ,  0.2732395447351627
100 ,  3.08 ,  0.01960555055392467
1000 ,  3.184 ,  0.01349867760918959
10000 ,  3.12 ,  0.006873155106573032
100000 ,  3.14716 ,  0.0017721414021786754
1000000 ,  3.143488 ,  0.0006033075001118286
10000000 ,  3.1414272 ,  5.266551333578959e-05

À partir de la gauche, le nombre total de nombres aléatoires utilisés dans la méthode de Monte Carlo N, valeur intégrée, erreur relative (erreur de π)


Code (2): ** Calcul de l'intégrale de Monte Carlo par la méthode de la valeur moyenne **

The_mean_value_method_Monte_Carlo.py


import numpy as np
from numpy.random import rand
"""
Intégration Monte Carlo par la méthode de la valeur moyenne
The mean value method
"""

    
N_calc_list = [10, 10**2, 10**3, 10**4, 10**5, 10**6, 10**7]
for N in  N_calc_list:
    x_array=rand(N)
    y_array=4.0/(1.0+x_array**2)
    area = (1.0-0.0)*np.sum(y_array)/(N) # y_Comme av, Σ_i yi/Calculer N et l'intégrer(1-0=1)Est suspendu

    print(N, ", ", area, ", ",  abs((np.pi-area)/np.pi))#Sortie de résultat

Résultat (2)

10 ,  3.18542467193 ,  0.0139521647705
100 ,  3.03821388912 ,  0.0329064827523
1000 ,  3.14697964989 ,  0.0017147341794
10000 ,  3.14560900784 ,  0.00127844526391
100000 ,  3.14380423975 ,  0.000703969738006
1000000 ,  3.14195518509 ,  0.000115397359081
10000000 ,  3.14140220827 ,  6.06206294417e-05

À partir de la gauche, le nombre total de nombres aléatoires utilisés dans la méthode de Monte Carlo N, valeur intégrée, erreur relative (erreur de π)


Code (3): Double intégration par méthode de moyenne

double_integral.py



import numpy as np
from numpy.random import rand
"""
Intégration Monte Carlo par la méthode de la valeur moyenne(Double intégration)
"""


N_calc_list = [10, 10**2, 10**3, 10**4, 10**5, 10**6, 10**7]
for N in  N_calc_list:
    x_array=rand(N)+1.0 #section[1,2]Séquence de nombres aléatoires uniforme de x_Stocker dans la baie
    y_array=rand(N)+1.0 #section[1,2]Séquence de nombres aléatoires uniforme de y_Stocker dans la baie
    z_array=1.0/(x_array+y_array)  # z=1/(x+y)Colonne de z_Stocker dans la baie
    area = (2.0-1.0)*(2.0-1.0)*np.sum(z_array)/(N)  #Calcul intégral
    print(N, ", ", area) #Sortie de résultat

Résultat (3)

10 ,  0.346923895691
100 ,  0.343570822229
1000 ,  0.339161537421
10000 ,  0.340241114706
100000 ,  0.339920052165
1000000 ,  0.339757274305
10000000 ,  0.33977097358

À partir de la gauche, le nombre total N de nombres aléatoires utilisés dans la méthode de Monte Carlo et la valeur intégrée. La solution exacte est 10 $ ln2-6ln3 \ sim 0.33979807 $.


Les références

[1] Mark Newman, "Computational Physics",Chap10,CreatespaceIndependentPublishingPlatform(2012)


A comment to non-Japanese persons: The two codes above described are both simple for performing numerical integrations using the Monte Carlo methods. One can easily understand how the codes work. The detailed information is accessible via ref. [1].

Recommended Posts

[Calcul scientifique / technique par Python] Intégration Monte Carlo, calcul numérique, numpy
[Calcul scientifique / technique par Python] Calcul de somme, calcul numérique
[Calcul scientifique / technique par Python] Calcul de matrice inverse, numpy
[Calcul scientifique / technique par Python] Intégration numérique, loi trapézoïdale / Simpson, calcul numérique, scipy
[Calcul scientifique / technique par Python] Résolution d'équations linéaires simultanées, calcul numérique, numpy
[Calcul scientifique / technique par Python] Interpolation de Lagrange, calcul numérique
[Calcul scientifique / technique par Python] Fonctionnement de base du tableau, numpy
[Calcul scientifique / technique par Python] Marche aléatoire 2D (problème de marche ivre), calcul numérique
[Calcul scientifique / technique par Python] histogramme, visualisation, matplotlib
[Calcul scientifique / technique par Python] Calcul du produit de la matrice par l'opérateur @, python3.5 ou supérieur, numpy
[Calcul scientifique / technique par Python] Simulation de Monte Carlo par la méthode metropolis de la thermodynamique du système de spin ascendant 2D
[Calcul scientifique / technique par Python] Graphique logistique, visualisation, matplotlib
[Calcul scientifique / technique par Python] Graphique de coordonnées polaires, visualisation, matplotlib
[Calcul scientifique / technique par Python] Résolution de problèmes de valeurs propres (généralisés) en utilisant numpy / scipy, en utilisant des bibliothèques
[Calcul scientifique / technique par Python] Résolution de l'équation différentielle ordinaire du second ordre par la méthode Numerov, calcul numérique
[Calcul scientifique / technique par Python] Calcul numérique pour trouver la valeur de la dérivée (différentielle)
[Calcul scientifique / technique par Python] Interpolation spline de troisième ordre, scipy
[Calcul scientifique / technique par Python] Génération de nombres aléatoires non uniformes donnant une fonction de densité de probabilité donnée, simulation Monte Carlo
[Calcul scientifique / technique par Python] Solution numérique d'une équation différentielle ordinaire du second ordre, problème de valeur initiale, calcul numérique
[Calcul scientifique / technique par Python] Liste des matrices qui apparaissent dans Hinpan en algèbre linéaire numérique
[Calcul scientifique / technique par Python] Solution numérique d'un problème d'oscillateur harmonique unidimensionnel par vitesse Méthode de Berle
[Calcul scientifique / technique par Python] Solution numérique du problème des valeurs propres de la matrice par multiplication de puissance, algèbre linéaire numérique
[Calcul scientifique / technique par Python] Exemple de visualisation de champ vectoriel, champ magnétique électrostatique, matplotlib
[Calcul scientifique / technique par Python] Transformation de Fourier à grande vitesse discrète en 3D unidimensionnelle, scipy
[Calcul scientifique / technique par Python] Ajustement par fonction non linéaire, équation d'état, scipy
[Calcul scientifique / technique par Python] Résolution d'équations différentielles ordinaires, formules mathématiques, sympy
[Calcul scientifique / technique par Python] Dessin d'animation de mouvement parabolique avec locus, matplotlib
[Calcul scientifique / technique par Python] Solution analytique sympa pour résoudre des équations
[Calcul scientifique / technique par Python] Tracer, visualiser, matplotlib des données 2D avec barre d'erreur
[Calcul scientifique / technique par Python] Dessin de surface courbe 3D, surface, fil de fer, visualisation, matplotlib
[Calcul scientifique / technique par Python] Résolution de l'équation de Newton unidimensionnelle par la méthode Runge-Kutta du 4ème ordre
[Calcul scientifique / technique par Python] Résolution du problème de la valeur aux limites des équations différentielles ordinaires au format matriciel, calcul numérique
calcul de tableau numpy python
Calcul numérique avec Python
[Calcul scientifique / technique par Python] Dessin, visualisation, matplotlib de lignes de contour 2D (couleur), etc.
[Calcul scientifique / technique par Python] Solution numérique d'équations d'ondes unidimensionnelles et bidimensionnelles par méthode FTCS (méthode explicite), équations aux dérivées partielles bi-courbes
[Méthode de calcul numérique, python] Résolution d'équations différentielles ordinaires par la méthode Eular
[Python] Méthode de calcul avec numpy
[Calcul scientifique / technique par Python] Solution numérique d'équations différentielles ordinaires du premier ordre, problème de valeur initiale, calcul numérique
[Calcul scientifique / technique par Python] Liste des utilisations des fonctions (spéciales) utilisées en physique en utilisant scipy
[Calcul scientifique et technique par Python] Dessin de figures fractales [Triangle de Shelpinsky, fougère de Bernsley, arbre fractal]
[Calcul scientifique / technique par Python] Vague "gémissement" et vitesse de groupe, superposition des vagues, visualisation, physique du lycée
Calcul scientifique / technique avec Python] Dessin et visualisation d'isoplans 3D et de leurs vues en coupe à l'aide de mayavi
Introduction à la bibliothèque de calcul numérique Python NumPy
[Calcul scientifique / technique par Python] Solution numérique de l'équation de Laplace-Poisson bidimensionnelle pour la position électrostatique par la méthode Jacobi, équation aux dérivées partielles elliptiques, problème des valeurs aux limites
Estimation de π par la méthode de Monte Carlo
[Calcul scientifique / technique par Python] Solution numérique d'une équation de conduction thermique non stationnaire unidimensionnelle par méthode Crank-Nicholson (méthode implicite) et méthode FTCS (méthode de solution positive)
[Calcul scientifique / technique par Python] Dérivation de solutions analytiques pour équations quadratiques et cubiques, formules, sympy
[Calcul scientifique / technique par Python] Résolution de l'équation de Schrödinger unidimensionnelle à l'état stationnaire par méthode de tir (1), potentiel de type puits, mécanique quantique
Créer un nouveau projet de calcul numérique Python
IA à cinq yeux en recherchant les arbres de Monte Carlo
[Calcul scientifique / technique par Python] Résolution d'une équation de Schrödinger unidimensionnelle en régime permanent par méthode de tir (2), potentiel d'oscillateur harmonique, mécanique quantique