import numpy as np
import matplotlib.pyplot as plt
from scipy.special import j0, j1, jn_zeros
from scipy.optimize import curve_fit
# ==========================================
# 1. ПАРАМЕТРЫ ЗАДАЧИ (из методички)
# ==========================================
R = 0.1 # Радиус цилиндра, м
T0 = 100.0 # Начальная температура, °C
r0 = R / 2 # Точка замера, м
# Увеличиваем число корней до 300 для высокой точности в нуле
z_n = jn_zeros(0, 300)
# ==========================================
# 2. ДАННЫЕ ИЗ ЛОГОС (из твоего Excel)
# ==========================================
# Время в ЛОГОСе (шаги)
time_logos = np.array([0, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000])
temp_logos = np.array([
100.0,
99.999618305476005,
99.997252127994145,
99.989257146927443,
99.969682582904980,
99.930723936601183,
99.863634228334291,
99.759914934029354,
99.612150859932925,
99.414628053968144,
99.163586548299634
])
# ==========================================
# 3. ФУНКЦИЯ ТЕМПЕРАТУРЫ (Формула 3)
# ==========================================
def get_temperature(t_val, a2_val):
T = 0.0
for z in z_n:
term = (1.0 / (z * j1(z))) * j0(z * (r0 / R)) * np.exp(-((a2_val * z**2) / R**2) * t_val)
T += term
return 2 * T0 * T
# ==========================================
# 4. ПОДГОНКА КОЭФФИЦИЕНТА a2 ПОД ЛОГОС
# ==========================================
# Ищем такое a2, при котором теоретическая кривая совпадет с ЛОГОСом
# Начальное приближение: 1e-10 (так как остывание идет очень медленно)
popt, pcov = curve_fit(
lambda t, a2_fit: [get_temperature(ti, a2_fit) for ti in t],
time_logos,
temp_logos,
p0=[1e-10]
)
a2_fitted = popt[0]
print(f"Табличная a2 (сталь): 2.3e-05")
print(f"Эффективная a2 (в ЛОГОСе): {a2_fitted:.5e}")
# ==========================================
# 5. ПОСТРОЕНИЕ ГРАФИКОВ
# ==========================================
time_python = np.linspace(0, 1000, 300)
# Считаем теоретическую кривую по формуле 3 с подогнанным параметром
temp_python_fitted = [get_temperature(t, a2_fitted) for t in time_python]
plt.figure(figsize=(10, 6))
# Линия Python
plt.plot(time_python, temp_python_fitted, 'b-', linewidth=2, label='Аналитическое решение (Формула 3)')
# Точки ЛОГОСа
plt.plot(time_logos, temp_logos, 'ro', markersize=6, label='Данные ЛОГОС (Node 2670)')
plt.title('Остывание цилиндра: сравнение аналитики и ЛОГОС')
plt.xlabel('Время, t (шаг/секунды)')
plt.ylabel('Температура, T (°C)')
plt.grid(True, linestyle='--', alpha=0.7)
plt.legend()
plt.tight_layout()
plt.show()