Сообщество Engee

Калькулятор тепловых потерь здания

Автор
avatar-ivank25ivank25
Соавторы
avatar-kazantsevkazantsev
Notebook

Введение:

В данном проекте мы рассмотрим тепловой калькулятор для зданий, с возможностью посторения графиков.

Теплопроводность – перенос теплоты (или внутренней энергии) при непосредственном соприкосновении тел (или частей одного тела) с различной температурой. Если в твердом теле, неподвижной жидкости или газе температура в различных точках неодинакова, то, как показывает опыт, теплота самопроизвольно переносится от участков тела с более высокой температурой к участкам с более низкой температурой. Внутренний механизм явления теплопроводности объясняется на основе молекулярно-кинетических представлений; перенос энергии при этом осуществляется вследствие теплового движения и энергетического взаимодействия между микрочастицами (молекулами, атомами, электронами), из которых состоит данное тело.
image.png

Обзор кода.

  1. Структуры данных: Определяем структуры для хранения ствойств строительных материалов и стен.
  2. Тепловые спротивления: Функция thermal_resistance вычисляет тепловое сопротивление материала на основе его толщины и теплопроводности.
  3. Модель температуры: Функция thermal_model описывает динамику изменения температуры в задании с учетом внешней температуры, телового потока и мощности обогрева.
  4. Симуляция: Функция simulate_bulding запускает симуляцию изменения температуры в здании на заданный период времени.
  5. Анализ эффективности: Функция analyze_efficency рассчитывает потребленную энергию, стоимость и среднюю температуру за период симуляции
  6. Графики и вывод данных: Основная функция run_simulation создает график изменения внутренней температуры.
In [ ]:
using DataFrames
using Plots
using DifferentialEquations
using Statistics

# Основные структуры для материалов и строения стены
struct BuildingMaterial
    name::String
    thermal_conductivity::Float64    # Вт/(м·К)
    thickness::Float64               # м
    specific_heat::Float64          # Дж/(кг·К)
    density::Float64                # кг/м³
end

struct WallStructure
    materials::Vector{BuildingMaterial}
    area::Float64                  # м²
    internal_temp::Float64         # °C
    external_temp::Float64         # °C
end

# Вспомогательные функции
function thermal_resistance(material::BuildingMaterial, area::Float64)
    return material.thickness / (material.thermal_conductivity * area)
end

function heat_capacity(material::BuildingMaterial, area::Float64)
    return material.specific_heat * material.density * material.thickness * area
end

# Модель изменения температуры
function temperature_model!(du, u, p, t)
    wall_section, heating_power, external_temp_func = p
    internal_temp = u[1]
    external_temp = external_temp_func(t)
    
    # Расчет общего теплового сопротивления
    total_resistance = sum(material -> thermal_resistance(material, wall_section.area), 
                         wall_section.materials)
    
    # Расчет теплового потока
    heat_flow = (internal_temp - external_temp) / total_resistance
    
    # Расчет общей теплоемкости
    total_heat_capacity = sum(material -> heat_capacity(material, wall_section.area), 
                            wall_section.materials)
    
    # Скорость изменения температуры
    du[1] = (heating_power - heat_flow) / total_heat_capacity
end

function simulate_building(wall_section::WallStructure,
                         heating_power::Float64,
                         simulation_time::Float64,
                         external_temp_func::Function)
    u0 = [wall_section.internal_temp]
    p = (wall_section, heating_power, external_temp_func)
    tspan = (0.0, simulation_time)
   
    prob = ODEProblem(temperature_model!, u0, tspan, p)
    sol = solve(prob)
   
    # Расчет тепловых потерь для каждого момента времени
    total_resistance = sum(material -> thermal_resistance(material, wall_section.area), 
                         wall_section.materials)
    heat_losses = [(sol[1,i] - external_temp_func(sol.t[i])) / total_resistance 
                   for i in 1:length(sol.t)]
   
    return sol, heat_losses
end

function analyze_efficiency(sol, heat_losses, heating_power, energy_cost)
    time_hours = sol.t[end] / 3600
    energy_consumed = heating_power * time_hours
   
    cost = energy_consumed * energy_cost / 1000
    avg_temp = mean(sol[1,:])
    avg_heat_loss = mean(heat_losses)
    max_heat_loss = maximum(heat_losses)
   
    return Dict(
        "energy_consumed_kwh" => energy_consumed / 1000,
        "cost" => cost,
        "average_temperature" => avg_temp,
        "average_heat_loss" => avg_heat_loss,
        "maximum_heat_loss" => max_heat_loss
    )
end

function run_simulation()
    # Создание материалов
    brick = BuildingMaterial(
        "Кирпич",
        0.8,    # теплопроводность
        0.25,   # толщина
        880.0,  # удельная теплоемкость
        1800.0  # плотность
    )
   
    insulation = BuildingMaterial(
        "Минеральная вата",
        0.04,   # теплопроводность
        0.1,    # толщина
        840.0,  # удельная теплоемкость
        100.0   # плотность
    )
   
    # Создание секции стены
    wall = WallStructure(
        [brick, insulation],
        20.0,   # площадь стены, м²
        20.0,   # начальная внутренняя температура
        0.0     # начальная внешняя температура
    )
   
    # Функция внешней температуры (синусоида для суточных колебаний)
    external_temp(t) = 0.0 + 5.0 * sin(2π * t / (24 * 3600))
   
    # Параметры симуляции
    heating_power = 1000.0  # Вт
    simulation_time = 24.0 * 3600.0  # 24 часа в секундах
    energy_cost = 0.15  # Стоимость за кВт·ч
   
    # Запуск симуляции
    sol, heat_losses = simulate_building(wall, heating_power, simulation_time, external_temp)
    efficiency = analyze_efficiency(sol, heat_losses, heating_power, energy_cost)
   
    # Создание графиков
    t_hours = sol.t / 3600
   
    p1 = plot(layout=(2,1))
   
    plot!(p1[1], t_hours, sol[1,:],
        label="Внутренняя температура",
        xlabel="",
        ylabel="Температура (°C)",
        title="Изменение температуры")
   
    plot!(p1[1], t_hours, external_temp.(sol.t),
        label="Внешняя температура",
        linestyle=:dash)
   
    plot!(p1[2], t_hours, heat_losses,
        label="Тепловые потери",
        xlabel="Время (часы)",
        ylabel="Мощность (Вт)",
        title="Тепловые потери через стену")
   
    # Вывод результатов
    println("\nРезультаты симуляции (24 часа):")
    println("Потреблено энергии: $(round(efficiency["energy_consumed_kwh"], digits=2)) кВт·ч")
    println("Стоимость отопления: $(round(efficiency["cost"], digits=2)) руб.")
    println("Средняя температура: $(round(efficiency["average_temperature"], digits=2)) °C")
    println("Средние тепловые потери: $(round(efficiency["average_heat_loss"], digits=2)) Вт")
    println("Максимальные тепловые потери: $(round(efficiency["maximum_heat_loss"], digits=2)) Вт")
   
    display(p1)
   
    return sol, efficiency, heat_losses
end

# Запуск симуляции
sol, efficiency, heat_losses = run_simulation();
Результаты симуляции (24 часа):
Потреблено энергии: 24.0 кВт·ч
Стоимость отопления: 3.6 руб.
Средняя температура: 22.31 °C
Средние тепловые потери: 157.03 Вт
Максимальные тепловые потери: 224.49 Вт

Визуализация теплопроводности стены:

Параметры материалов

Кирпич:

-Температуропроводность (α): 0.5×10⁻⁶ м²/с

-Теплопроводность (λ): 0.7 Вт/(м·К)

-Толщина: 0.25 м

Минвата:

-Температуропроводность (α): 0.4×10⁻⁷ м²/с

-Теплопроводность (λ): 0.04 Вт/(м·К)

-Толщина: 0.1 м

Граничные условия

-Внутренняя температура: 20°C

-Внешняя температура: -20°C

Дискретизация

-Использует 100 точек по пространственной координате

-Шаг по пространству вычисляется автоматически: dx = L/nx

Реализация включает:

-Стандартную конечно-разностную схему для внутренних точек

-Специальную обработку границы между материалами

-Граничные условия Дирихле

In [ ]:
using Plots
using DifferentialEquations

# Структуры для данных
struct BuildingMaterial
    name::String
    thermal_conductivity::Float64
    thermal_diffusivity::Float64
    thickness::Float64
end

struct WallParameters
    materials::Vector{BuildingMaterial}
    L::Float64
    nx::Int64
    dx::Float64
    x::Array{Float64,1}
    T_inside::Float64
    T_outside::Float64
end

# Создание материалов
materials = [
    BuildingMaterial("Кирпич", 0.7, 0.5e-6, 0.25),
    BuildingMaterial("Минеральная вата", 0.04, 0.4e-7, 0.1)
]

# Создание параметров
L = sum(m.thickness for m in materials)
nx = 100
dx = L/nx
x = range(0, L, length=nx) |> collect
p = WallParameters(materials, L, nx, dx, x, 20.0, -20.0)

# Функции для расчета
function get_material_properties(x, p::WallParameters)
    current_position = 0.0
    for material in p.materials
        if x <= (current_position + material.thickness)
            return (α=material.thermal_diffusivity, λ=material.thermal_conductivity)
        end
        current_position += material.thickness
    end
    return (α=p.materials[end].thermal_diffusivity, λ=p.materials[end].thermal_conductivity)
end

function heat_equation!(du, u, p::WallParameters, t)
    for i in 2:length(u)-1
        x_i = p.x[i]
        props = get_material_properties(x_i, p)
        du[i] = props.α * (u[i+1] - 2u[i] + u[i-1]) / p.dx^2
    end
    du[1] = 0
    du[end] = 0
end

# Начальные условия
u0 = [p.T_inside + (p.T_outside - p.T_inside) * x / p.L for x in p.x]

# Решение
tspan = (0.0, 24.0 * 3600)
prob = ODEProblem(heat_equation!, u0, tspan, p)
sol = solve(prob, TRBDF2(), saveat=range(0, 24*3600, length=100))

# Подготовка данных для графика
t_hours = sol.t / 3600
temp_matrix = hcat(sol.u...)'

# Создание графика
heatmap = Plots.heatmap(p.x .* 100, t_hours, temp_matrix,
    c=:turbo,
    xlabel="Толщина стены (см)",
    ylabel="Время (часы)",
    title="Распределение температуры в стене",
    colorbar_title="Температура (°C)"
)

# Добавление границ материалов
current_position = 0.0
for material in p.materials[1:end-1]
    current_position += material.thickness
    vline!([current_position * 100], color=:white, linestyle=:dash, 
           label="Граница $(material.name)")
end

# Добавление контурных линий
contour!(p.x .* 100, t_hours, temp_matrix,
    color=:black,
    alpha=0.3,
    levels=15,
    linewidth=0.5,
    label=nothing
)

display(heatmap)

Анализ диаграммы.

Анализируя полученную диаграму, можно следать вывод, что толщины нашей изоляции с использованием кирпичей и миниральной ваты с данными характеристиками, позволяет сохранять температуру в 20 градусов без сильных потерь.

Заключение.

Сохранение теплоты в помещение является важной задачей как экономической, так и конструкторской. Используя наш калькулятор мы можем визуально анализировать потери тепла и расчитать стоимость отопления для помещений.

Список использованной литературы:

  1. М.А. Михеев, И.М. Михеева Основы теплопередачи
  2. В.П. Исаченко, В.А. Осипова, А.С. Сукомел Теплопередача
  3. Цветков Ф.Ф., Григорьев Б.А. Тепломассообмен: Учебное
    пособие для вузов. - М.: Издательство МЭИ, 2011.