Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import pylab
- import time
- from math import pi
- K = 10**7 # количество случаных точек в методе Монте-Карло
- RSp = 1 # радиус сферы
- MaxD = 10 # максимальная размерность
- # реальные объемы с графика
- Vreal = [1, 2, pi, 4*pi/3, pi**2/2, 8*pi**2/15, pi**3/6, 16*pi**3/105, pi**4/24, 32*pi**4/945, pi**5/120, 64*pi**5/10395, pi**6/720, 128*pi**6/135135, pi**7/5040, 15*pi**7/118771]
- data = []
- for n in range(1, MaxD+1): # n - число измерений
- startTime = time.time() # время начало расчета
- Xi = np.random.uniform(0, 1, K*n).reshape(K, n) # набор случайных точек - вектора из [0,1]
- Dist = np.sum(Xi**2, axis=1)**0.5 # расстояния от точек до центра
- PtsInSphere = np.sum(Dist < RSp) # число точек внутри сферы
- V1 = 2**n * PtsInSphere / K # объем методом Монте Карло
- epsA = abs(V1 - Vreal[n]) # абсолютная погрешность
- epsR = epsA / Vreal[n] # относительная погрешность
- endTime = time.time()
- # число измерений, количество точек, абс.погр., относит.погр., время в мс
- print("Время расчета для {:2d}-d t = {:.2f}мс".format(n, endTime-startTime), end='. ')
- print("Погрешности абс={:.7f}, относ={:.7f}".format(epsA, epsR))
- data.append([n, V1, PtsInSphere]) # сохраняем результаты
- D, V, P = np.array(data).T
- # График 1: расчитанный объем шара в зависимости от размерности
- fig, axs = pylab.subplots(2, 1, figsize=(10,20))
- axs[0].set_title('Расчитанный (x) и реальный объем (o)', color='C0')
- axs[0].plot(D, Vreal[1:MaxD+1], 'C0', marker='o')
- axs[0].plot(D, V, 'C2', marker='x')
- # График 2: количество точек в зависимости от размерности пространства
- axs[1].set_title('Количество точек', color='C1')
- axs[1].plot(D, P, marker='x')
- pylab.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement