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

Обзор кода.
- Структуры данных: Определяем структуры для хранения ствойств строительных материалов и стен.
- Тепловые спротивления: Функция thermal_resistance вычисляет тепловое сопротивление материала на основе его толщины и теплопроводности.
- Модель температуры: Функция thermal_model описывает динамику изменения температуры в задании с учетом внешней температуры, телового потока и мощности обогрева.
- Симуляция: Функция simulate_bulding запускает симуляцию изменения температуры в здании на заданный период времени.
- Анализ эффективности: Функция analyze_efficency рассчитывает потребленную энергию, стоимость и среднюю температуру за период симуляции
- Графики и вывод данных: Основная функция run_simulation создает график изменения внутренней температуры.
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();
Визуализация теплопроводности стены:
Параметры материалов
Кирпич:
-Температуропроводность (α): 0.5×10⁻⁶ м²/с
-Теплопроводность (λ): 0.7 Вт/(м·К)
-Толщина: 0.25 м
Минвата:
-Температуропроводность (α): 0.4×10⁻⁷ м²/с
-Теплопроводность (λ): 0.04 Вт/(м·К)
-Толщина: 0.1 м
Граничные условия
-Внутренняя температура: 20°C
-Внешняя температура: -20°C
Дискретизация
-Использует 100 точек по пространственной координате
-Шаг по пространству вычисляется автоматически: dx = L/nx
Реализация включает:
-Стандартную конечно-разностную схему для внутренних точек
-Специальную обработку границы между материалами
-Граничные условия Дирихле
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 градусов без сильных потерь.
Заключение.
Сохранение теплоты в помещение является важной задачей как экономической, так и конструкторской. Используя наш калькулятор мы можем визуально анализировать потери тепла и расчитать стоимость отопления для помещений.
Список использованной литературы:
- М.А. Михеев, И.М. Михеева Основы теплопередачи
- В.П. Исаченко, В.А. Осипова, А.С. Сукомел Теплопередача
- Цветков Ф.Ф., Григорьев Б.А. Тепломассообмен: Учебное
пособие для вузов. - М.: Издательство МЭИ, 2011.