Рассмотрим задачу о строении звёзд: Примем сферически-симметричную квазистатическую модель строения звезды (звезда это огромный шар, все параметры симметричны относительно центра звезды, находятся в равновесии друг с другом), никаких турбулентностей не происходит.
Пусть p(r) - полное давление на расстоянии r от центра, m(r)- масса , заключённая в шаре радиуса r, ρ(r)- плотность, T(r)- температура, L(r)- светимость на расстоянии r от центра. Запишем 4 основных дифференциальных уравнения, описывающих состояние звезды:
1) Уравнение гидростатического равновесия (между градиентом давления и гравитацией):
. G- гравитационная постоянная.
2) Уравнение непрерывности массы (между градиентом массы и плотностью):
3) Уравнение энергетического баланса(описывает изменение светимости с радиусом):
,где ε- скорость изменения энергии на единицу массы, ε’- потери энергии на нейтрино.
4) Уравнение переноса энергии: При лучистом переносе
, где K- непрозрачность, σ-постоянная Стефана-Больцмана.
При конвективном переносе
.
(источник https://ru.wikipedia.org/wiki/Строение_звёзд ).
Уравнения состояния:
, где R- газовая постоянная, m- молярная масса, c- радиационная постоянная.
Для белых карликов:
Для протон-протонного цикла
, для более горячих звёзд
,потери на нейтрино
Коэффициент непрозрачности K при низких и высоких температурах практически постоянный, а при умеренных температурах:
Критерий Шварцшильда: Если фактический температурный градиент ниже адиабатического, то перенос лучистый, иначе конвективный ( источник https://kpfu.ru/portal/docs/F_1009337479/Belyaeva.E.E..Fizika.zvyozd.pdf ). В целом, при высоких температурах перенос лучистый, а при
низких- конвективный.
Граничные условия: m(0)=0, L(0)=0, p(R) =0,T( R)=Teff, m( R)=M,
L( R)=Lз, где R- радиус звезды.
Учитывая всё это, получим математическую модель строения Солнца.
Напишем на Python код для моделирования строения Солнца:
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
# Фундаментальные константы
G = 6.67430e-11 # м^3 кг^-1 с^-2
sigma = 5.670374e-8 # Вт м^-2 К^-4
k_B = 1.380649e-23 # Дж/К
c = 299792458 # м/с
m_u = 1.660539e-27 # кг
# Параметры Солнца
M_sun = 1.989e30 # кг
R_sun = 6.9634e8 # м
L_sun = 3.828e26 # Вт
class RealisticSolarModel:
def __init__(self):
# Состав Солнца (массовые доли)
self.X = 0.735 # водород
self.Y = 0.249 # гелий
self.Z = 0.016 # тяжёлые элементы
# Границы зон (по современным данным)
self.r_core = 0.25 * R_sun # ядро до 0.25 R⊙
self.r_radiative = 0.71 * R_sun # лучистая зона до 0.71 R⊙
# Средняя молекулярная масса
self.mu = 4 / (5 * self.X + 3 * self.Y + 1)
def equation_of_state(self, rho, T):
"""Упрощённое уравнение состояния идеального газа"""
P_gas = rho * k_B * T / (self.mu * m_u)
P_rad = (4 * sigma / (3 * c)) * T**4
return P_gas + P_rad
def opacity(self, rho, T):
"""Упрощённая модель непрозрачности"""
# Электронное рассеяние
kappa_es = 0.2 * (1 + self.X)
# Формула Крамерса
kappa_ff = 4.3e22 * self.Z * (1 + self.X) * rho / T**3.5
# H⁻ поглощение (упрощённо)
kappa_Hminus = 2.5e-32 * self.Z * rho**0.5 * T**9
# Гармоническое среднее
if kappa_es > 0 and kappa_ff > 0 and kappa_Hminus > 0:
kappa = 1 / (1/kappa_es + 1/kappa_ff + 1/kappa_Hminus)
else:
kappa = max(kappa_es, kappa_ff, kappa_Hminus)
return max(kappa, 1e-6) # ограничение снизу
def energy_generation(self, rho, T):
"""Энерговыделение с учётом pp-цепочки"""
eps_pp = 1.07e-7 * self.X**2 * (rho / 1e5) * (T / 1e6)**4
# CNO цикл (упрощённо)
eps_CNO = 8.68e-12 * self.X * self.Z * (rho / 1e5) * (T / 1e6)**(12)
# потери на нейтрино
eps_neyt=1.0e-13*self.X**2 *(rho / 1e5) * (T / 1e6)**6
return eps_pp + eps_CNO-eps_neyt
def temperature_gradient(self, r, M_r, L_r, P, T, rho):
"""Градиент температуры с критерием Шварцшильда"""
# Лучистый градиент
try:
nabla_rad = 3 * self.opacity(rho, T) * rho * L_r * P / (64 * np.pi * sigma * G * M_r * T**4)
except:
nabla_rad = 0
# Адиабатический градиент
nabla_ad = 0.4
# Критерий Шварцшильда
if nabla_rad > nabla_ad and r > self.r_core:
# Конвекция
dP_dr = -G * M_r * rho / r**2
return nabla_ad * (T / P) * dP_dr
else:
# Лучистый перенос
return -3 * self.opacity(rho, T) * rho * L_r / (16 * np.pi * sigma * T**3 * r**2)
def equations(self, r, y):
"""Система дифференциальных уравнений"""
M_r, P, L_r, T = y
# Плотность из уравнения состояния
try:
rho = (P - (4 * sigma / (3 * c)) * T**4) * self.mu * m_u / (k_B * T)
rho = max(rho, 1e-8) # защита от отрицательных значений
except:
rho = 1e-8
# Градиенты
dM_dr = 4 * np.pi * r**2 * rho
dP_dr = -G * M_r * rho / r**2
epsilon = self.energy_generation(rho, T)
dL_dr = 4 * np.pi * r**2 * epsilon
dT_dr = self.temperature_gradient(r, M_r, L_r, P, T, rho)
return [dM_dr, dP_dr, dL_dr, dT_dr]
def solve_structure(self, r_min=1e6, r_max=R_sun, n_points=500):
"""Решение системы уравнений"""
# Начальные условия в центре Солнца
T_center = 1.57e7 # К
rho_center = 1.52e5 # кг/м³
P_center = self.equation_of_state(rho_center, T_center)
L_center = 0 # светимость в центре
y0 = [0, P_center, L_center, T_center]
# Радиальная сетка
r_points = np.logspace(np.log10(r_min), np.log10(r_max), n_points)
# Решение системы ОДУ
solution = solve_ivp(
self.equations,
[r_points[0], r_points[-1]],
y0,
t_eval=r_points,
method='BDF',
rtol=1e-5,
atol=1e-7
)
if not solution.success:
raise RuntimeError(f"Решение не сошлось: {solution.message}")
return solution.t, solution.y
# Запуск моделирования
print("Начинаем реалистичное моделирование структуры Солнца...")
model = RealisticSolarModel()
try:
r, (M_r, P, L_r, T) = model.solve_structure()
print("Моделирование завершено успешно!")
except Exception as e:
print(f"Ошибка при моделировании: {e}")
raise
# Расчёт плотности
rho = np.zeros_like(r)
for i, (ri, Pi, Ti) in enumerate(zip(r, P, T)):
try:
rho[i] = (Pi - (4 * sigma / (3 * c)) * Ti**4) * model.mu * m_u / (k_B * Ti)
rho[i] = max(rho[i], 1e-8)
except:
rho[i] = 1e-8
# Визуализация результатов
fig, axs = plt.subplots(2, 2, figsize=(14, 10))
# График 1: распределение массы
axs[0, 0].plot(r / R_sun, M_r / M_sun, 'b-', linewidth=2, label='Модель')
axs[0, 0].set_xlabel('Радиус (R⊙)')
axs[0, 0].set_ylabel('Масса (M⊙)')
axs[0, 0].set_title('Распределение массы внутри Солнца')
axs[0, 0].grid(True, alpha=0.3)
axs[0, 0].axvline(x=0.25, color='r', linestyle='--', alpha=0.7, label='Граница ядра')
axs[0, 0].axvline(x=0.71, color='g', linestyle='--', alpha=0.7, label='Граница лучистой зоны')
axs[0, 0].legend()
# График 2: распределение давления (логарифмическая шкала)
axs[0, 1].plot(r / R_sun, P, 'r-', linewidth=2)
axs[0, 1].set_xlabel('Радиус (R⊙)')
axs[0, 1].set_ylabel('Давление (Па)')
axs[0, 1].set_title('Распределение давления')
axs[0, 1].set_yscale('log')
axs[0, 1].grid(True, alpha=0.3)
axs[0, 1].axvline(x=0.25, color='r', linestyle='--', alpha=0.7)
axs[0, 1].axvline(x=0.71, color='g', linestyle='--', alpha=0.7)
# График 3: распределение светимости
axs[1, 0].plot(r / R_sun, L_r / L_sun, 'g-', linewidth=2)
axs[1, 0].set_xlabel('Радиус (R⊙)')
axs[1, 0].set_ylabel('Светимость (L⊙)')
axs[1, 0].set_title('Распределение светимости')
axs[1, 0].grid(True, alpha=0.3)
axs[1, 0].axvline(x=0.25, color='r', linestyle='--', alpha=0.7)
axs[1, 0].axvline(x=0.71, color='g', linestyle='--', alpha=0.7)
# График 4: распределение температуры (логарифмическая шкала)
axs[1, 1].plot(r / R_sun, T, 'm-', linewidth=2)
axs[1, 1].set_xlabel('Радиус (R⊙)')
axs[1, 1].set_ylabel('Температура (К)')
axs[1, 1].set_title('Распределение температуры')
axs[1, 1].set_yscale('log')
axs[1, 1].grid(True, alpha=0.3)
axs[1, 1].axvline(x=0.25, color='r', linestyle='--', alpha=0.7)
axs[1, 1].axvline(x=0.71, color='g', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
# Дополнительный график: распределение плотности (логарифмическая шкала)
plt.figure(figsize=(10, 6))
plt.plot(r / R_sun, rho, 'orange', linewidth=2)
plt.xlabel('Радиус (R⊙)')
plt.ylabel('Плотность (кг/м³)')
plt.title('Распределение плотности внутри Солнца')
plt.grid(True, alpha=0.3)
plt.yscale('log')
plt.axvline(x=0.25, color='r', linestyle='--', alpha=0.7, label='Ядро')
plt.axvline(x=0.71, color='g', linestyle='--', alpha=0.7, label='Лучистая зона')
plt.legend()
plt.show()
# Анализ результатов и сравнение с наблюдаемыми данными
print("n" + "="*60)
print("АНАЛИЗ РЕЗУЛЬТАТОВ МОДЕЛИРОВАНИЯ")
print("="*60)
print(f"nКЛЮЧЕВЫЕ ПАРАМЕТРЫ В ЦЕНТРЕ:")
print(f"Температура: {T[0]:.2e} К (стандарт: 1.57×10⁷ К)")
print(f"Плотность: {rho[0]:.2e} кг/м³ (стандарт: 1.52×10⁵ кг/м³)")
print(f"Давление: {P[0]:.2e} Па")
print(f"nПАРАМЕТРЫ НА ПОВЕРХНОСТИ (R⊙):")
print(f"Температура поверхности: {T[-1]:.0f} К (наблюдаемая: 5778 К)")
print(f"Светимость на поверхности: {L_r[-1]/L_sun:.4f} L⊙ (точно: 1.000 L⊙)")
# Определение границы конвективной зоны по резкому изменению градиента температуры
nabla_T = np.abs(np.diff(T) / np.diff(r))
conv_boundary_idx = np.argmax(nabla_T[len(r)//3:]) + len(r)//3
conv_boundary = r[conv_boundary_idx] / R_sun
print(f"nГРАНИЦЫ ЗОН:")
print(f"Ядро: до {model.r_core/R_sun:.2f} R⊙")
print(f"Лучистая зона: {model.r_core/R_sun:.2f}–{conv_boundary:.2f} R⊙ (стандарт: 0.25–0.71 R⊙)")
print(f"Конвективная зона: от {conv_boundary:.2f} R⊙ до поверхности")
Результат моделирования представлен ниже в виде графиков:
Из графиков видно, что почти половина массы Солнца и почти вся его светимость находятся в ядре, температура сначала плавно, а потом резко падает до температуры поверхности(6000 К), оставаясь постоянной в фото сфере. Давление и плотность также уменьшается, затем стабилизируясь на некотором постоянном значении.
Таким образом, в данной статье при помощи моделирования исследования структура Солнца, построены распределения по радиус основных его параметров.
Проведён неглубокий анализ полученных графиков.
Уравнения и структура кода примененимы к любой звезде, не обязательно к Солнцу.
Решена очень интересная и важная задача в области астрофизики.
Автор: Maximka200
