Mathématiques en première générale – Algorithmes

Méthode de Monte-Carlo

Méthode de Monte-Carlo : estimation de l'aire sous la parabole, estimation du nombre π.

Aire sous la parabole : \(\displaystyle\int_0^1x^2\,\textrm{d}x=\frac{1}{3}\)

from random import random
def aire_sous_parabole(n) :
    accu = 0
    for i in range(n) :
        x, y = random(), random()
        if y < x ** 2 :
            accu += 1
    return accu / n

print(aire_sous_parabole(1000))
print(aire_sous_parabole(10000))
print(aire_sous_parabole(100000))
print(aire_sous_parabole(1000000))
0.33
0.3284
0.33408
0.333022

\(\displaystyle\pi=4\int_0^1\sqrt{1-x^2}\,\textrm{d}x\)

from random import random
def pi(n) :
    accu = 0
    for i in range(n) :
        x, y = random(), random()
        if x ** 2 + y ** 2 < 1 :
            accu += 1
    return 4 * accu / n

print(pi(1000))
print(pi(10000))
print(pi(100000))
print(pi(1000000))
from math import pi
print(pi)
3.056
3.1424
3.14044
3.142804
3.141592653589793

Code général

from random import random
def frequence(n, test) :
    accu = 0
    for i in range(n) :
        x, y = random(), random()
        if test(x, y) :
            accu += 1
    return accu / n

print(frequence(1000000, lambda x, y : y < x ** 2))
print(4 * frequence(1000000, lambda x, y : x ** 2 + y ** 2 < 1))
0.333079
3.140036

Avec illustration graphique

numero_figure = 0
import matplotlib.pyplot as plt
from matplotlib import colors
def plot(lx, ly, ld) :
    global numero_figure
    plt.figure(figsize=(6, 6))
    plt.scatter(lx, ly, s=3, c=ld,
                     cmap=colors.ListedColormap(["red", "green"]))
    plt.savefig("figure_{}.svg".format(numero_figure))
    numero_figure += 1

from random import random
def frequence(n, test) :
    lx = [random() for i in range(n)]
    ly = [random() for i in range(n)]
    ld = [test(x, y) for x, y in zip(lx, ly)]
    plot(lx, ly, ld)
    effectif = sum(ld)
    return effectif / n

print(frequence(1000, lambda x, y : y < x ** 2))
print(4 * frequence(1000, lambda x, y : x ** 2 + y ** 2 < 1))
0.33
3.196
Lionel Avon