第四十八篇:地源热泵系统

摘要

地源热泵系统利用地下土壤或地下水相对稳定的温度特性,实现高效的建筑供暖和制冷。本文系统分析了地源热泵的工作原理和性能评价方法,建立了地埋管换热器的热响应模型和长期热平衡分析,详细讨论了钻孔布置、埋管形式、土壤热物性等关键设计参数。采用Python实现了地埋管温度响应、系统能效分析和运行优化的数值模拟,分析了不同气候条件、建筑负荷特性和运行策略对系统性能的影响,为地源热泵系统设计提供理论指导。

关键词

地源热泵,地埋管换热器,土壤源,COP,热响应测试,热平衡,长期性能


在这里插入图片描述

1. 引言

1.1 地源热泵原理

地源热泵利用地下土壤、地下水或地表水作为热源/热汇,通过热泵循环实现建筑供暖制冷。由于地下温度全年相对稳定(通常10-20°C),地源热泵的能效比传统空气源热泵高30-50%。

1.2 系统类型

闭式系统

  • 垂直埋管:占地面积小,效率高
  • 水平埋管:成本低,受气候影响大
  • 螺旋埋管:介于两者之间

开式系统

  • 直接利用地下水
  • 需要回灌,受地质条件限制

2. 理论分析

2.1 地埋管传热模型

线热源模型(Kelvin模型)
T(r,t)−T0=q4πksEi(r24αst)T(r,t) - T_0 = \frac{q}{4\pi k_s} E_i\left(\frac{r^2}{4\alpha_s t}\right)T(r,t)T0=4πksqEi(4αstr2)

圆柱热源模型
更精确地考虑钻孔直径和回填材料影响。

g-函数方法
用于多钻孔系统的长期热响应分析。

2.2 热泵性能

制热性能系数
COPh=QheatingWcompressorCOP_h = \frac{Q_{heating}}{W_{compressor}}COPh=WcompressorQheating

制冷能效比
EER=QcoolingWcompressorEER = \frac{Q_{cooling}}{W_{compressor}}EER=WcompressorQcooling

地源热泵COP通常在3-5之间,远高于电加热。

2.3 长期热平衡

热不平衡率
I=Qheating−QcoolingQheating+QcoolingI = \frac{Q_{heating} - Q_{cooling}}{Q_{heating} + Q_{cooling}}I=Qheating+QcoolingQheatingQcooling

长期热不平衡会导致土壤温度持续升高或降低,影响系统性能。


3. Python仿真实现

import numpy as np
import matplotlib.pyplot as plt
import os
from scipy.special import expi

output_dir = r'd:\文档\500仿真领域\工程仿真\传热学仿真\主题048'
os.makedirs(output_dir, exist_ok=True)

print("="*60)
print("仿真1:地埋管温度响应")
print("="*60)

# 土壤参数
k_s = 2.0  # W/(m·K),土壤导热系数
rho_s = 2000  # kg/m³,土壤密度
c_s = 800  # J/(kg·K),土壤比热
alpha_s = k_s / (rho_s * c_s)  # m²/s,土壤热扩散系数

# 运行参数
q = 50  # W/m,单位长度热流
r_b = 0.075  # m,钻孔半径

# 时间范围
t = np.logspace(0, 9, 100)  # s,从1秒到30年

# 线热源解
def line_source_temp(q, k_s, r, t, alpha_s):
    """线热源温度响应"""
    if t > 0:
        return q / (4 * np.pi * k_s) * expi(-r**2 / (4 * alpha_s * t))
    return 0

# 计算温度响应
delta_T = []
for time in t:
    dT = line_source_temp(q, k_s, r_b, time, alpha_s)
    delta_T.append(dT)

# 时间转换为常用单位
t_hours = t / 3600
t_days = t / (3600 * 24)
t_years = t / (3600 * 24 * 365)

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

ax1 = axes[0]
ax1.semilogx(t_hours[:50], delta_T[:50], 'b-', linewidth=2)
ax1.set_xlabel('Time (hours)', fontsize=11)
ax1.set_ylabel('Temperature Rise (°C)', fontsize=11)
ax1.set_title('Short-term Temperature Response', fontsize=12, fontweight='bold')
ax1.grid(True, alpha=0.3)

ax2 = axes[1]
ax2.plot(t_years, delta_T, 'r-', linewidth=2)
ax2.set_xlabel('Time (years)', fontsize=11)
ax2.set_ylabel('Temperature Rise (°C)', fontsize=11)
ax2.set_title('Long-term Temperature Response', fontsize=12, fontweight='bold')
ax2.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig(f'{output_dir}/temperature_response.png', dpi=150, bbox_inches='tight')
plt.close()

print("图1:温度响应已保存")

print("\n" + "="*60)
print("仿真2:COP随土壤温度变化")
print("="*60)

# 土壤温度范围
T_soil = np.linspace(5, 25, 50)

# 建筑侧温度
T_building_heating = 45  # °C,供暖
T_building_cooling = 7   # °C,制冷

# 简化COP模型
COP_heating = 3.5 + 0.08 * (T_soil - 10)
EER_cooling = 4.0 + 0.1 * (20 - T_soil)

fig, ax = plt.subplots(figsize=(10, 5))
ax.plot(T_soil, COP_heating, 'r-', linewidth=2, label='Heating COP')
ax.plot(T_soil, EER_cooling, 'b-', linewidth=2, label='Cooling EER')
ax.set_xlabel('Soil Temperature (°C)', fontsize=11)
ax.set_ylabel('Performance Factor', fontsize=11)
ax.set_title('Heat Pump Performance vs Soil Temperature', fontsize=12, fontweight='bold')
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig(f'{output_dir}/cop_analysis.png', dpi=150, bbox_inches='tight')
plt.close()

print("图2:COP分析已保存")

print("\n" + "="*60)
print("仿真3:地埋管换热器设计")
print("="*60)

# 地埋管换热器设计计算

# 建筑负荷
Q_heating = 15000  # W
Q_cooling = 12000  # W

# 土壤参数
k_soil = 2.0  # W/(m·K)
T_ground = 15  # °C

# 地埋管参数
D_borehole = 0.15  # m
H_borehole = 100  # m
D_pipe = 0.032  # m

# 计算所需钻孔数量
# 单位长度换热量
q_heating = 50  # W/m(冬季)
q_cooling = 60  # W/m(夏季)

N_boreholes_heating = int(Q_heating / (q_heating * H_borehole)) + 1
N_boreholes_cooling = int(Q_cooling / (q_cooling * H_borehole)) + 1
N_boreholes = max(N_boreholes_heating, N_boreholes_cooling)

print(f"冬季所需钻孔数: {N_boreholes_heating}")
print(f"夏季所需钻孔数: {N_boreholes_cooling}")
print(f"设计钻孔数: {N_boreholes}")

# 钻孔间距
spacing = 4  # m
total_area = N_boreholes * spacing**2

print(f"钻孔间距: {spacing}m")
print(f"占地面积: {total_area}m²")

# 长期土壤温度变化
years_operation = np.arange(0, 21)
T_ground_change = T_ground + 2 * np.sin(2 * np.pi * years_operation / 10)  # 10年周期变化

# 可视化
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 钻孔布置示意图
ax1 = axes[0]
if N_boreholes <= 16:
    n_rows = int(np.ceil(np.sqrt(N_boreholes)))
    for i in range(N_boreholes):
        row = i // n_rows
        col = i % n_rows
        circle = plt.Circle((col * spacing, row * spacing), D_borehole/2, color='brown', alpha=0.7)
        ax1.add_patch(circle)
    ax1.set_xlim(-1, n_rows * spacing + 1)
    ax1.set_ylim(-1, n_rows * spacing + 1)
    ax1.set_aspect('equal')
    ax1.set_title('Borehole Field Layout', fontsize=12, fontweight='bold')
    ax1.set_xlabel('Distance (m)', fontsize=11)
    ax1.set_ylabel('Distance (m)', fontsize=11)
else:
    ax1.text(0.5, 0.5, f'{N_boreholes} Boreholes\nSpacing: {spacing}m\nArea: {total_area}m²',
             ha='center', va='center', fontsize=14, transform=ax1.transAxes,
             bbox=dict(boxstyle='round', facecolor='lightblue', alpha=0.8))
    ax1.set_xlim(0, 1)
    ax1.set_ylim(0, 1)
    ax1.axis('off')
    ax1.set_title('Borehole Field Summary', fontsize=12, fontweight='bold')

# 土壤温度长期变化
ax2 = axes[1]
ax2.plot(years_operation, T_ground_change, 'b-', linewidth=2, marker='o')
ax2.axhline(y=T_ground, color='r', linestyle='--', alpha=0.5, label='Original T')
ax2.fill_between(years_operation, T_ground_change, T_ground, alpha=0.3)
ax2.set_xlabel('Years of Operation', fontsize=11)
ax2.set_ylabel('Ground Temperature (°C)', fontsize=11)
ax2.set_title('Long-term Ground Temperature Change', fontsize=12, fontweight='bold')
ax2.legend(fontsize=10)
ax2.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig(f'{output_dir}/borehole_design.png', dpi=150, bbox_inches='tight')
plt.close()

print("图3:地埋管设计已保存")

print("\n" + "="*60)
print("仿真4:地源热泵系统经济性分析")
print("="*60)

# 与空气源热泵对比

# 系统投资
cost_gshp = 150000  # 元(地源热泵,含地埋管)
cost_ashp = 80000   # 元(空气源热泵)

# 运行费用
annual_cost_gshp = 4000  # 元/年
annual_cost_ashp = 6500  # 元/年

savings_annual = annual_cost_ashp - annual_cost_gshp
payback_gshp = (cost_gshp - cost_ashp) / savings_annual

print(f"地源热泵投资: {cost_gshp}元")
print(f"空气源热泵投资: {cost_ashp}元")
print(f"年运行节省: {savings_annual}元")
print(f"投资回收期: {payback_gshp:.1f}年")

# 15年总成本
years = 15
total_cost_gshp = cost_gshp + annual_cost_gshp * years
total_cost_ashp = cost_ashp + annual_cost_ashp * years

print(f"15年总成本 - 地源热泵: {total_cost_gshp}元")
print(f"15年总成本 - 空气源热泵: {total_cost_ashp}元")

# 可视化
fig, ax = plt.subplots(figsize=(10, 6))

years_range = np.arange(0, 21)
cumulative_gshp = cost_gshp + annual_cost_gshp * years_range
cumulative_ashp = cost_ashp + annual_cost_ashp * years_range

ax.plot(years_range, cumulative_gshp/10000, 'b-', linewidth=2, label='Ground Source Heat Pump')
ax.plot(years_range, cumulative_ashp/10000, 'r-', linewidth=2, label='Air Source Heat Pump')
ax.axvline(x=payback_gshp, color='g', linestyle='--', alpha=0.5, label=f'Payback: {payback_gshp:.1f} years')
ax.set_xlabel('Years', fontsize=11)
ax.set_ylabel('Cumulative Cost (10,000 Yuan)', fontsize=11)
ax.set_title('Life Cycle Cost Comparison', fontsize=12, fontweight='bold')
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig(f'{output_dir}/lifecycle_cost.png', dpi=150, bbox_inches='tight')
plt.close()

print("图4:生命周期成本已保存")

print("\n" + "="*60)
print("仿真5:地源热泵与太阳能联合系统")
print("="*60)

# 地源热泵与太阳能联合供热系统

# 系统参数
Q_heating_load = 15000  # W

# 地源热泵参数
COP_gshp = 4.0
P_gshp = Q_heating_load / COP_gshp  # 电功率

# 太阳能集热器参数
A_solar = 20  # m²
efficiency_solar = 0.6

# 月平均太阳辐射
months = np.arange(12)
I_monthly = np.array([250, 300, 450, 550, 650, 700, 720, 680, 550, 400, 280, 220])  # W/m²

# 月采暖负荷
T_outdoor_monthly = np.array([-5, -2, 5, 12, 18, 24, 28, 26, 20, 12, 4, -3])
T_indoor = 20
heating_degree_days = np.maximum(0, T_indoor - T_outdoor_monthly)
Q_monthly_load = Q_heating_load * heating_degree_days / np.sum(heating_degree_days) * 720  # kWh

# 太阳能贡献
Q_solar_monthly = A_solar * efficiency_solar * I_monthly * 720 / 1000  # kWh
Q_solar_contribution = np.minimum(Q_solar_monthly, Q_monthly_load)

# 地源热泵承担
Q_gshp_monthly = Q_monthly_load - Q_solar_contribution
E_gshp_monthly = Q_gshp_monthly / COP_gshp

# 年能耗
annual_electricity = np.sum(E_gshp_monthly)
annual_solar = np.sum(Q_solar_contribution)

print(f"年太阳能供热: {annual_solar:.0f} kWh")
print(f"年地源热泵耗电: {annual_electricity:.0f} kWh")
print(f"太阳能保证率: {annual_solar/np.sum(Q_monthly_load)*100:.1f}%")

# 可视化
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 月度能量平衡
ax1 = axes[0]
month_names = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
x_pos = np.arange(12)
width = 0.35

bars1 = ax1.bar(x_pos - width/2, Q_monthly_load/1000, width, label='Heat Load', color='orangered', alpha=0.8)
bars2 = ax1.bar(x_pos + width/2, Q_solar_contribution/1000, width, label='Solar Contribution', color='gold', alpha=0.8)

ax1.set_xlabel('Month', fontsize=11)
ax1.set_ylabel('Energy (MWh)', fontsize=11)
ax1.set_title('Monthly Energy Balance', fontsize=12, fontweight='bold')
ax1.set_xticks(x_pos)
ax1.set_xticklabels(month_names, rotation=45)
ax1.legend(fontsize=10)
ax1.grid(True, alpha=0.3, axis='y')

# 系统效率对比
ax2 = axes[1]
systems = ['Electric\nHeater', 'Air Source\nHeat Pump', 'Ground Source\nHeat Pump', 'GSHP+Solar']
COP_values = [1.0, 2.5, 4.0, 5.5]  # 等效COP
colors_sys = ['orangered', 'gold', 'steelblue', 'forestgreen']

bars = ax2.bar(systems, COP_values, color=colors_sys, alpha=0.8)
ax2.set_ylabel('Effective COP', fontsize=11)
ax2.set_title('System Efficiency Comparison', fontsize=12, fontweight='bold')
ax2.grid(True, alpha=0.3, axis='y')

for bar, val in zip(bars, COP_values):
    ax2.text(bar.get_x() + bar.get_width()/2., bar.get_height() + 0.1,
             f'{val:.1f}', ha='center', va='bottom', fontsize=11, fontweight='bold')

plt.tight_layout()
plt.savefig(f'{output_dir}/hybrid_system.png', dpi=150, bbox_inches='tight')
plt.close()

print("图5:联合系统已保存")

print("\n" + "="*60)
print("仿真6:地埋管热响应测试")
print("="*60)

# 热响应测试(TRT)模拟

# 测试参数
Q_injection = 6000  # W,加热功率
T_initial = 15  # °C,初始土壤温度
k_soil_trt = 2.5  # W/(m·K),土壤导热系数
alpha_soil = 0.08  # m²/day,热扩散系数

# 测试时间
t_days = np.linspace(0, 3, 100)
t_seconds = t_days * 24 * 3600

# 线热源模型
r_borehole = 0.075  # m,钻孔半径
T_borehole = T_initial + Q_injection / (4 * np.pi * k_soil_trt) * \
             np.log(4 * alpha_soil * t_seconds / r_borehole**2) + 0.5772

# 考虑热容的修正
T_corrected = T_borehole * (1 - np.exp(-t_days/0.5))

print(f"初始土壤温度: {T_initial}°C")
print(f"3天后钻孔壁温度: {T_corrected[-1]:.2f}°C")
print(f"温升: {T_corrected[-1] - T_initial:.2f}°C")

# 可视化
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(t_days, T_corrected, 'b-', linewidth=2)
ax.axhline(y=T_initial, color='r', linestyle='--', alpha=0.5, label=f'Initial T = {T_initial}°C')
ax.fill_between(t_days, T_corrected, T_initial, alpha=0.3)
ax.set_xlabel('Time (days)', fontsize=11)
ax.set_ylabel('Borehole Wall Temperature (°C)', fontsize=11)
ax.set_title('Thermal Response Test Simulation', fontsize=12, fontweight='bold')
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig(f'{output_dir}/trt_simulation.png', dpi=150, bbox_inches='tight')
plt.close()

print("图6:热响应测试已保存")
print("\n所有仿真完成!")

4. 工程应用

4.1 住宅建筑

  • 小型垂直埋管系统
  • 地板辐射供暖
  • 与太阳能联合运行

4.2 商业建筑

  • 大型地埋管阵列
  • 热回收系统
  • 冰蓄冷结合

4.3 区域能源系统

  • 分布式地源热泵
  • 地下蓄热系统
  • 多能互补

5. 本章小结

地源热泵是一种高效、环保的建筑空调技术,其性能受土壤热物性、埋管设计和运行策略的影响。通过合理设计和长期热平衡管理,可以确保系统稳定高效运行20年以上。在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐