<jupyter_start><jupyter_text>Il metodo Monte Carlo La stima di pi grecoIn questo notebook introdurremo il metodo Monte Carlo e lo utilizzeremo per stimare il valore di $\pi$.Il metodo di Monte Carlo è una tecnica computazionale utilizzata per stimare quantità a partire dall’analisi di un campione casuale di dati.Per esempio, consideriamo il cerchio rosso nella figura seguente. Il cerchio ha raggio uguale a 1, quindi sappiamo che l’area del cerchio è $\pi$, cioè circa 3,14. Tuttavia, il valore di $\pi$ è difficile da calcolare. Possiamo stimare il valore di $\pi$ nel seguente modo: prendiamo $N$ punti con coordinate casuali all’interno del quadrato di lato 2 circoscritto al cerchio. Dato che l’area del quadrato è 4 e l’area del cerchio è $\pi$, la frazione di punti interni al cerchio (cioè la cui distanza dal centro è minore di 1) sarà $f = \pi/4 \approx 0,7854$.Questo permette di stimare $\pi$, calcolando questa frazione. In figura vediamo un esempio con $N=10000$, in cui risulta $f =0,7807$ e $\pi \approx 4\cdot f = 3,1228$. Chiaramente al crescere di $N$ la stima di $\pi$ diventa più precisa.![image.png](attachment:image.png)![image-2.png](attachment:image-2.png)Possiamo usare `numpy` per generare le coordinate casuali dei punti. Ad esempio, il seguente codice genera le coordinate $(x,y)$ di 5 punti casuali in un quadrato di lato 2.<jupyter_code>import numpy as np

x = np.random.uniform(0, 2, 5)
y = np.random.uniform(0, 2, 5)

print(x)
print(y)<jupyter_output><empty_output><jupyter_text>Possiamo rappresentare graficamente i punti.<jupyter_code>import numpy as np
from matplotlib import pyplot as plt

x = np.random.uniform(0, 2, 100)
y = np.random.uniform(0, 2, 100)

plt.plot(x,y, "o")

plt.axis("square")
plt.axis([0, 2, 0, 2])
plt.show()<jupyter_output><empty_output><jupyter_text>Esercizio 1Aggiungi un titolo all'immagine e un'etichetta agli assi.  Esercizio 2Scrivi un codice che utilizzi il metodo di Monte Carlo per stimare il valore di $\pi$.  SuggerimentiSe ti serve, puoi utilizzare i seguenti suggerimenti:* dopo aver generato le coordinate dei punti, come nel codice precedente, dovrai eseguite un ciclo `for` per identificare e contare, uno alla volta, i punti interni al cerchio;* puoi decidere se un punto è interno al cerchio usando una condizione `if` e controllando se la distanza dal centro è minore di 1$$(x-1)^2+(y-1)^2 < 1$$* per contare i punti interni al cerchio, inizializza una variabile a 0 (ad esempio, `n_in = 0`) e poi incrementala di 1 per ogni numero interno trovato (`n_in += 1`).  La rappresentazione grafica dei puntiCon un ciclo `for` è semplice creare delle liste separate con le coordinate dei punti dentro la circonferenze e con quelle dei punti esterni alla circonferenza.<jupyter_code>import numpy as np
from matplotlib import pyplot as plt

N = 100

# Le coordinate di tutti i punti
x = np.random.uniform(0, 2, N)
y = np.random.uniform(0, 2, N)

# Lista con le coordinate dei punti interni alla circonferenza
x_in = []
y_in = []

# Lista con le coordinate dei punti esterni alla circonferenza
x_out = []
y_out = []

for i in range(N):
    
    # Il punto è interno se la distanza dal punto centrale (1,1)
    # è minore del raggio R = 1
    if (x[i]-1)**2 + (y[i]-1)**2 < 1:
        x_in.append(x[i])
        y_in.append(y[i])
    else:
        x_out.append(x[i])
        y_out.append(y[i])<jupyter_output><empty_output>
StarcoderdataJupyterStructuredCleanDedup