import numpy as np
import matplotlib.pyplot as plt
from scipy.special import j0, j1, jn_zeros
# ==========================================
# 1. ПАРАМЕТРЫ ЗАДАЧИ (из методички)
# ==========================================
R = 0.1 # Радиус цилиндра, м (10 см)
a2 = 2.3e-5 # Температуропроводность стали, м^2/с
T0 = 100.0 # Начальная температура, °C
r0 = R / 2 # Точка замера (на расстоянии R/2 от оси), м
# ==========================================
# 2. АНАЛИТИЧЕСКОЕ РЕШЕНИЕ (Формула 3)
# ==========================================
# Находим первые 100 корней уравнения J0(z) = 0 (для высокой точности)
z_n = jn_zeros(0, 100)
def get_temperature(t_val):
"""Вычисляет температуру в точке r0 в момент времени t_val по формуле (3)"""
T = 0.0
for z in z_n:
# Слагаемое ряда Фурье-Бесселя
term = (1.0 / (z * j1(z))) * j0(z * (r0 / R)) * np.exp(-((a2 * z**2) / R**2) * t_val)
T += term
return 2 * T0 * T
# Создаем массив времени (от 0 до 1000 секунд, как на твоем скриншоте)
time_python = np.linspace(0, 1000, 500)
temp_python = [get_temperature(t) for t in time_python]
# ==========================================
# 3. ДАННЫЕ ИЗ ЛОГОС (с твоего скриншота Excel)
# ==========================================
# Примечание: первые два значения времени на скрине (100, 100)
# скорее всего баг экспорта, берем реальные шаги: 0, 100, 200... 1000
# Если в ЛОГОСе время было 0.1, 0.2 и т.д., просто раздели массив time_logos на 1000.
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
])
# ==========================================
# 4. ПОСТРОЕНИЕ ГРАФИКОВ
# ==========================================
plt.figure(figsize=(10, 6))
# График аналитического решения (Python)
plt.plot(time_python, temp_python, 'b-', linewidth=2, label='Аналитическое решение (Python, формула 3)')
# График данных из ЛОГОС (точки)
plt.plot(time_logos, temp_logos, 'ro', markersize=6, label='Данные ЛОГОС (Node 2670)')
plt.title('Динамика температуры в точке r = R/2 (Остывание цилиндра)')
plt.xlabel('Время, t (с)')
plt.ylabel('Температура, T (°C)')
plt.grid(True, linestyle='--', alpha=0.7)
plt.legend()
plt.xlim(0, 1050)
plt.ylim(98, 100.5) # Приближаем масштаб, так как нагрев/остывание идет медленно
plt.tight_layout()
plt.show()
# Вывод характерного времени остывания tau = R^2 / a2 (как в задании из методички)
tau = (R**2) / a2
print(f"Характерное время остывания tau = {tau:.1f} секунд ({tau/60:.1f} минут)")