Advertisement
zhukov000

HyperShpere

Sep 28th, 2021
721
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.30 KB | None | 0 0
  1. import numpy as np
  2. import pylab
  3. import time
  4. from math import pi
  5.  
  6. K = 10**7   # количество случаных точек в методе Монте-Карло
  7. RSp = 1     # радиус сферы
  8. MaxD = 10   # максимальная размерность
  9.  
  10. # реальные объемы с графика
  11. 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]
  12.  
  13. data = []
  14. for n in range(1, MaxD+1):           # n - число измерений
  15.     startTime = time.time()        # время начало расчета
  16.    
  17.     Xi = np.random.uniform(0, 1, K*n).reshape(K, n)   # набор случайных точек - вектора из [0,1]
  18.     Dist = np.sum(Xi**2, axis=1)**0.5                 # расстояния от точек до центра
  19.    
  20.     PtsInSphere = np.sum(Dist < RSp)   # число точек внутри сферы
  21.     V1 = 2**n * PtsInSphere / K        # объем методом Монте Карло
  22.    
  23.     epsA = abs(V1 - Vreal[n])          # абсолютная погрешность
  24.     epsR = epsA / Vreal[n]             # относительная погрешность
  25.    
  26.     endTime = time.time()
  27.    
  28.     # число измерений, количество точек, абс.погр., относит.погр., время в мс
  29.     print("Время расчета для {:2d}-d t = {:.2f}мс".format(n, endTime-startTime), end='. ')
  30.     print("Погрешности абс={:.7f}, относ={:.7f}".format(epsA, epsR))
  31.     data.append([n, V1, PtsInSphere]) # сохраняем результаты
  32.    
  33. D, V, P = np.array(data).T
  34. # График 1: расчитанный объем шара в зависимости от размерности
  35. fig, axs = pylab.subplots(2, 1, figsize=(10,20))
  36. axs[0].set_title('Расчитанный (x) и реальный объем (o)', color='C0')
  37. axs[0].plot(D, Vreal[1:MaxD+1], 'C0', marker='o')
  38. axs[0].plot(D, V, 'C2', marker='x')
  39. # График 2: количество точек в зависимости от размерности пространства
  40. axs[1].set_title('Количество точек', color='C1')
  41. axs[1].plot(D, P, marker='x')
  42.  
  43. pylab.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement