#!/usr/bin/env python3 """ Program obliczający liczbę pi prostym wariantem metody Monte Carlo. Losujemy N punktów w obrębie kwadratu 1x1 i obserwujemy ile spośród nich zawiera się w ćwiartce okręgu jednostkowego. Stosunek ich liczby do N przybliża stosunek pola pod wykresem (czyli pi/4) do pola kwadratu (czyli 1). Liczbę N podaje się jako argument wywołania programu. """ import matplotlib.pyplot as plt import numpy as np import sys x = np.linspace(0,1,200) #wartości x do narysowania ćwiartki okręgu y = np.sqrt(1 - x**2) #odpowiadające im wartości y N = int(sys.argv[1]) #N podane przez użytkownika jako argument p = np.random.random((N,2)) #losujemy N par (współrzędne x,y punktów) wartości z domyślnego przedziału [0,1) #każdą ze współrzędnych podnosimy do kwadratu (potrzebne do wzoru na okręg x**2 + y**2 = 1) i sprawdzamy #czy punkt zawiera się w okręgu: #p_traf = p[(p**2).sum(axis=1)<1] #p_poza = p[(p**2).sum(axis=1)>=1] #w zasadzie liczenie p**2 dwa razy jest bez sensu, możemy raz dokonać sprawdzenia: kryterium = (p**2).sum(axis=1)<1 p_traf = p[kryterium] #punkty w okręgu p_poza = p[np.logical_not(kryterium)] #odwracamy kryterium #liczymy przybliżenie pi pi=4*len(p_traf)/len(p) #wykres: plt.plot(x,y) #okrąg plt.scatter(p_traf[:,0],p_traf[:,1],c="red",s=1) #punkty w okręgu plt.scatter(p_poza[:,0],p_poza[:,1],c="blue",s=1) #punkty poza okręgiem (a w zasadzie także i na jego linii) #plt.plot(p_traf[:,0],p_traf[:,1],"r,",p_poza[:,0],p_poza[:,1],"b,") plt.axis("scaled") plt.title(f"Wartość $\\pi$ przybliżona metodą Monte Carlo w {N} krokach: $\\pi$={pi}") plt.show()