Advertisement
Guest User

Rotation Curve

a guest
May 8th, 2023
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.84 KB | None | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3.  
  4. # Константы
  5. G = 6.67430e-11 # Гравитационная постоянная
  6. Msun = 1.98847e30 # Масса Солнца
  7.  
  8. # Создание массива случайных позиций звезд
  9. N = 1000 # Количество звезд
  10. Rmax = 30e3 # Максимальное расстояние от центра галактики в парсеках
  11. R = Rmax*np.sqrt(np.random.rand(N))
  12. theta = 2*np.pi*np.random.rand(N)
  13. x = R*np.cos(theta)
  14. y = R*np.sin(theta)
  15.  
  16. # Создание массива случайных скоростей звезд
  17. vmax = 1000 # Максимальная скорость в км/с
  18. v = vmax*np.sqrt(np.random.rand(N))
  19.  
  20. # Моделирование движения галактики
  21. tmax = 50 # Время моделирования в миллион лет
  22. dt = 0.01 # Шаг по времени в миллион лет
  23. t = np.arange(0, tmax, dt)
  24. xgal = np.zeros_like(t)
  25. ygal = np.zeros_like(t)
  26. vgal = np.zeros_like(t)
  27.  
  28. for i in range(len(t)):
  29.     # Расстояние от каждой звезды до центра галактики
  30.     r = np.sqrt(x**2 + y**2)
  31.  
  32.     # Суммирование гравитационных сил от всех звезд
  33.     ax = -G*np.sum(Msun*x/r**3)
  34.     ay = -G*np.sum(Msun*y/r**3)
  35.  
  36.     # Добавление гравитационной силы от центральной массы
  37.     ax -= G*4*Msun*x[0]/r[0]**3
  38.     ay -= G*4*Msun*y[0]/r[0]**3
  39.  
  40.     # Интегрирование ускорения для получения скорости и позиции
  41.     vx = v*np.cos(theta) + ax*dt
  42.     vy = v*np.sin(theta) + ay*dt
  43.     x += vx*dt
  44.     y += vy*dt
  45.  
  46.     # Перенос центра координат в центр галактики
  47.     x -= x[0]
  48.     y -= y[0]
  49.  
  50.     # Вычисление положения центра масс галактики
  51.     xcm = np.sum(Msun*x)/np.sum(Msun)
  52.     ycm = np.sum(Msun*y)/np.sum(Msun)
  53.  
  54.     # Вычисление скорости и положения центра масс галактики
  55.     vgal[i] = np.sqrt(np.sum((v - np.sqrt(ax**2 + ay**2))**2)/N)
  56.                      
  57.     # Вычисление радиуса и скорости вращения для каждой звезды
  58.     r = np.sqrt(x**2 + y**2)
  59.     vrot = np.sqrt(G*np.sum(Msun)/r)
  60.  
  61. # Вычисление средней скорости вращения для каждого радиуса
  62. rbin = np.linspace(0, Rmax, 100)
  63. vrot_mean = np.zeros_like(rbin)
  64. for i in range(len(rbin)-1):
  65.     idx = np.where((r >= rbin[i]) & (r < rbin[i+1]))[0]
  66.     vrot_mean[i] = np.mean(vrot[idx])
  67.  
  68. # Построение графика кривой вращения
  69. plt.plot(rbin[:-1], vrot_mean)
  70. plt.xlabel('Radius (pc)')
  71. plt.ylabel('Rotation Velocity (km/s)')
  72. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement