Загрузка данных


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.special import jn_zeros, j0, j1

# ДАННЫЕ ЛОГОСА, ПЕРЕНЕСЁННЫЕ С ФОТО
time_logos = np.array([
    100, 100, 200, 300, 400, 500,
    600, 700, 800, 900, 1000
], dtype=float)

temperature_logos = np.array([
    100.000000000000000,
    99.998452691423466,
    99.989951118414226,
    99.964225981261563,
    99.907271292470710,
    99.803841029423637,
    99.639949022593072,
    99.405060423169289,
    99.092645256521450,
    98.700242827031630,
    98.228901765152543
])

# ПАРАМЕТРЫ ЗАДАЧИ
R = 0.1
T0 = 100.0
a2 = 2.3e-5
r0 = R / 2

print(f"Характерное время охлаждения: {R**2/a2:.2f} с")

# АНАЛИТИЧЕСКОЕ РЕШЕНИЕ
z = jn_zeros(0, 100)
coeff = 2 * T0 * j0(z * r0 / R) / (z * j1(z))

def analytical_temperature(t):
    t = np.atleast_1d(np.asarray(t, dtype=float))
    return np.exp(-a2 * np.outer(t, z**2) / R**2) @ coeff

temperature_python = analytical_temperature(time_logos)

# ТАБЛИЦА СРАВНЕНИЯ
results = pd.DataFrame({
    "Time_s": time_logos,
    "LOGOS_C": temperature_logos,
    "Python_analytical_C": temperature_python
})

results["Absolute_error_C"] = np.abs(
    results["LOGOS_C"] - results["Python_analytical_C"]
)

results["Relative_error_percent"] = (
    100 * results["Absolute_error_C"]
    / np.maximum(np.abs(results["Python_analytical_C"]), 1e-12)
)

print("\nСРАВНЕНИЕ РЕЗУЛЬТАТОВ")
print(results.round(5).to_string(index=False))

print("\nСредняя абсолютная ошибка:",
      round(results["Absolute_error_C"].mean(), 5), "°C")

print("Максимальная абсолютная ошибка:",
      round(results["Absolute_error_C"].max(), 5), "°C")

# ГРАФИК СРАВНЕНИЯ ТЕМПЕРАТУР
plt.figure(figsize=(10, 6))
plt.plot(time_logos, temperature_logos, "o-", label="ЛОГОС")
plt.plot(time_logos, temperature_python, "s--",
         label="Python: аналитическое решение")
plt.xlabel("Время, с (если TimeStep указан в секундах)")
plt.ylabel("Температура, °C")
plt.title("Сравнение температуры в точке r = 0.05 м")
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.savefig("temperature_comparison.png", dpi=150)
plt.show()

# ГРАФИК ОШИБКИ
plt.figure(figsize=(10, 5))
plt.plot(time_logos, results["Absolute_error_C"], "o-")
plt.xlabel("Время, с")
plt.ylabel("Абсолютная ошибка, °C")
plt.title("Расхождение ЛОГОСа и аналитического решения")
plt.grid(True)
plt.tight_layout()
plt.savefig("absolute_error.png", dpi=150)
plt.show()

# СОХРАНЕНИЕ ТАБЛИЦЫ
results.to_csv("comparison_LOGOS_analytical.csv",
               index=False, encoding="utf-8-sig")

print("\nГотово! Сохранены:")
print("comparison_LOGOS_analytical.csv")
print("temperature_comparison.png")
print("absolute_error.png")