Advertisement
zhukov000

HyperShpere

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