2025-04-27 17:25:43 +08:00
|
|
|
|
import pandas as pd
|
|
|
|
|
import math
|
|
|
|
|
|
2025-04-28 08:22:03 +08:00
|
|
|
|
def wind_farm_analysis(device_name, area_km2, file_path, avg_temp, avg_wind_speed,
|
|
|
|
|
lateral_spacing_factor=5, longitudinal_spacing_factor=10, altitude=11,
|
|
|
|
|
hub_height=100, Cp=0.45, eta=0.8):
|
|
|
|
|
"""
|
|
|
|
|
封装函数:分析风电场的风机数量及各项经济和技术指标,直接输入年平均气温和年平均风速
|
2025-04-27 17:25:43 +08:00
|
|
|
|
参数:
|
2025-04-28 08:22:03 +08:00
|
|
|
|
device_name (str): 风力发电机型号名称
|
2025-04-27 17:25:43 +08:00
|
|
|
|
area_km2 (float): 风电场面积(平方公里)
|
2025-04-28 08:22:03 +08:00
|
|
|
|
file_path (str): 包含风机参数的Excel文件路径
|
|
|
|
|
avg_temp (float): 年平均气温(摄氏度)
|
|
|
|
|
avg_wind_speed (float): 年平均风速(m/s)
|
|
|
|
|
lateral_spacing_factor (float): 横向间距因子(默认为5倍叶片直径,5D)
|
|
|
|
|
longitudinal_spacing_factor (float): 纵向间距因子(默认为10倍叶片直径,10D)
|
|
|
|
|
altitude (float): 海拔高度(m),默认11m
|
|
|
|
|
hub_height (float): 轮毂高度(m),默认100m
|
|
|
|
|
Cp (float): 风能利用系数(功率系数),默认0.45,反映风能转换效率
|
|
|
|
|
eta (float): 总系统效率(包括机械和电气效率),默认0.8
|
2025-04-27 17:25:43 +08:00
|
|
|
|
返回:
|
2025-04-28 08:22:03 +08:00
|
|
|
|
dict: 包含风电场分析结果的字典,包括装机容量、发电量、环境效益等
|
2025-04-27 17:25:43 +08:00
|
|
|
|
"""
|
|
|
|
|
def estimate_wind_turbine_count(area_km2, blade_diameter):
|
2025-04-28 08:22:03 +08:00
|
|
|
|
"""
|
|
|
|
|
估算风电场可容纳的风机数量,基于面积和风机间距
|
|
|
|
|
参数:
|
|
|
|
|
area_km2 (float): 风电场面积(平方公里)
|
|
|
|
|
blade_diameter (float): 风机叶片直径(m)
|
|
|
|
|
|
|
|
|
|
返回:
|
|
|
|
|
int: 估算的风机数量
|
|
|
|
|
"""
|
|
|
|
|
# 将面积从平方公里转换为平方米
|
2025-04-27 17:25:43 +08:00
|
|
|
|
area_m2 = area_km2 * 1_000_000
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 计算横向和纵向间距(以叶片直径为单位)
|
2025-04-27 17:25:43 +08:00
|
|
|
|
lateral_spacing = lateral_spacing_factor * blade_diameter
|
|
|
|
|
longitudinal_spacing = longitudinal_spacing_factor * blade_diameter
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 单台风机占地面积 = 横向间距 * 纵向间距
|
2025-04-27 17:25:43 +08:00
|
|
|
|
turbine_area = lateral_spacing * longitudinal_spacing
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 风机数量 = 总面积 / 单台风机占地面积(取整数)
|
2025-04-27 17:25:43 +08:00
|
|
|
|
turbine_count = int(area_m2 / turbine_area)
|
|
|
|
|
print(f"单台风机占地面积: {turbine_area:,} 平方米 "
|
|
|
|
|
f"(横向间距: {lateral_spacing} 米, 纵向间距: {longitudinal_spacing} 米)")
|
|
|
|
|
print(f"估算风机数量: {turbine_count} 台")
|
|
|
|
|
return turbine_count
|
|
|
|
|
|
|
|
|
|
def get_wind_turbine_specs(device_name, file_path):
|
2025-04-28 08:22:03 +08:00
|
|
|
|
"""
|
|
|
|
|
从Excel文件中获取指定风机的参数
|
|
|
|
|
参数:
|
|
|
|
|
device_name (str): 风机型号名称
|
|
|
|
|
file_path (str): Excel文件路径
|
|
|
|
|
返回:
|
|
|
|
|
tuple: 额定功率(kW)、扫风面积(m²)、叶片直径(m)
|
|
|
|
|
"""
|
2025-04-27 17:25:43 +08:00
|
|
|
|
try:
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 读取Excel文件
|
2025-04-27 17:25:43 +08:00
|
|
|
|
df = pd.read_excel(file_path)
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 查找匹配的设备名称
|
2025-04-27 17:25:43 +08:00
|
|
|
|
match = df[df.iloc[:, 0] == device_name]
|
|
|
|
|
if not match.empty:
|
2025-04-28 08:22:03 +08:00
|
|
|
|
rated_power = match.iloc[0, 1] # 额定功率(kW)
|
|
|
|
|
swept_area = match.iloc[0, 7] # 扫风面积(m²)
|
|
|
|
|
blade_diameter = match.iloc[0, 6] # 叶片直径(m)
|
2025-04-27 17:25:43 +08:00
|
|
|
|
print(f"找到设备 '{device_name}',额定功率: {rated_power} KW, "
|
|
|
|
|
f"扫风面积: {swept_area} m², 叶片直径: {blade_diameter} 米")
|
|
|
|
|
return rated_power, swept_area, blade_diameter
|
|
|
|
|
else:
|
|
|
|
|
raise ValueError(f"未找到设备名称: {device_name}")
|
|
|
|
|
except FileNotFoundError:
|
|
|
|
|
raise FileNotFoundError(f"文件未找到: {file_path}")
|
|
|
|
|
except Exception as e:
|
|
|
|
|
raise Exception(f"发生错误: {str(e)}")
|
|
|
|
|
|
2025-04-28 08:22:03 +08:00
|
|
|
|
def air_density(altitude, hub_height, T0):
|
2025-04-27 17:25:43 +08:00
|
|
|
|
"""
|
2025-04-28 08:22:03 +08:00
|
|
|
|
计算空气密度,考虑海拔和轮毂高度的影响
|
|
|
|
|
参数:
|
|
|
|
|
altitude (float): 海拔高度(m)
|
|
|
|
|
hub_height (float): 轮毂高度(m)
|
|
|
|
|
T0 (float): 地面平均气温(摄氏度)
|
|
|
|
|
|
|
|
|
|
返回:
|
|
|
|
|
float: 空气密度(kg/m³)
|
|
|
|
|
公式:
|
|
|
|
|
ρ = (353.05 / T) * exp(-0.034 * (z / T))
|
|
|
|
|
其中 T = T0 - LR * z + 273.15(T0为地面温度,LR为温度递减率,z为总高度)
|
2025-04-27 17:25:43 +08:00
|
|
|
|
"""
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 计算总高度(海拔 + 轮毂高度)
|
2025-04-27 17:25:43 +08:00
|
|
|
|
z = altitude + hub_height
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 温度递减率(lapse rate),每升高1米温度降低0.0065°C
|
2025-04-27 17:25:43 +08:00
|
|
|
|
LR = 0.0065
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 计算绝对温度(K),考虑高度引起的温度变化
|
2025-04-27 17:25:43 +08:00
|
|
|
|
T = T0 - LR * z + 273.15
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 计算空气密度
|
2025-04-27 17:25:43 +08:00
|
|
|
|
return (353.05 / T) * math.exp(-0.034 * (z / T))
|
|
|
|
|
|
2025-04-28 08:22:03 +08:00
|
|
|
|
def wind_power_density(density, velocity_avg):
|
|
|
|
|
"""
|
|
|
|
|
计算风功率密度(单位面积的风能功率)
|
|
|
|
|
参数:
|
|
|
|
|
density (float): 空气密度(kg/m³)
|
|
|
|
|
velocity_avg (float): 平均风速(m/s)
|
|
|
|
|
返回:
|
|
|
|
|
float: 风功率密度(W/m²)
|
|
|
|
|
公式:
|
|
|
|
|
P = 0.5 * ρ * v³(按照年平均风速来算)
|
|
|
|
|
"""
|
|
|
|
|
return 0.5 * density * velocity_avg**3
|
2025-04-27 17:25:43 +08:00
|
|
|
|
|
|
|
|
|
def estimated_wind_power(num_turbines, rated_power):
|
2025-04-28 08:22:03 +08:00
|
|
|
|
"""
|
|
|
|
|
计算风电场总装机容量
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
num_turbines (int): 风机数量
|
|
|
|
|
rated_power (float): 单台风机额定功率(kW)
|
|
|
|
|
返回:
|
|
|
|
|
float: 总装机容量(kW)
|
|
|
|
|
"""
|
2025-04-27 17:25:43 +08:00
|
|
|
|
if not isinstance(num_turbines, int) or num_turbines < 0:
|
|
|
|
|
raise ValueError("风机数量必须为非负整数")
|
|
|
|
|
return rated_power * num_turbines
|
|
|
|
|
|
2025-04-28 08:22:03 +08:00
|
|
|
|
def calculate_power_output(S, w, Cp, eta, num_turbines):
|
|
|
|
|
"""
|
|
|
|
|
计算风电场年发电量
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
S (float): 扫风面积(m²)
|
|
|
|
|
w (float): 风功率密度(W/m²)
|
|
|
|
|
Cp (float): 风能利用系数
|
|
|
|
|
eta (float): 系统效率
|
|
|
|
|
num_turbines (int): 风机数量
|
|
|
|
|
返回:
|
|
|
|
|
float: 年发电量(Wh)
|
|
|
|
|
公式:
|
|
|
|
|
E = w * S * Cp * 8760 * η * N (N为风机个数)
|
|
|
|
|
其中 8760 为一年小时数
|
|
|
|
|
"""
|
|
|
|
|
return w * S * Cp * 8760 * eta * num_turbines
|
2025-04-27 17:25:43 +08:00
|
|
|
|
|
|
|
|
|
def calculate_equivalent_hours(P, P_r):
|
2025-04-28 08:22:03 +08:00
|
|
|
|
"""
|
|
|
|
|
计算等效满负荷小时数
|
|
|
|
|
参数:
|
|
|
|
|
P (float): 年发电量(Wh)
|
|
|
|
|
P_r (float): 单台风机额定功率(kW)
|
|
|
|
|
返回:
|
|
|
|
|
float: 等效小时数(小时)
|
|
|
|
|
"""
|
2025-04-27 17:25:43 +08:00
|
|
|
|
if P_r == 0:
|
|
|
|
|
raise ValueError("额定功率不能为 0")
|
|
|
|
|
return (P / 1000) / P_r
|
|
|
|
|
|
|
|
|
|
def calculate_environmental_benefits(E_p_million_kwh):
|
2025-04-28 08:22:03 +08:00
|
|
|
|
"""
|
|
|
|
|
计算环境效益(减排量)
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
E_p_million_kwh (float): 年发电量(万kWh)
|
|
|
|
|
|
|
|
|
|
返回:
|
|
|
|
|
dict: 包含标准煤、CO₂、SO₂、NOx减排量的字典
|
|
|
|
|
|
|
|
|
|
假设:
|
|
|
|
|
每万kWh可节约标准煤0.404吨,减排CO₂ 0.977吨,SO₂ 0.03吨,NOx 0.015吨
|
|
|
|
|
"""
|
2025-04-27 17:25:43 +08:00
|
|
|
|
if E_p_million_kwh < 0:
|
|
|
|
|
raise ValueError("年发电量需≥0")
|
|
|
|
|
return {
|
2025-04-28 08:22:03 +08:00
|
|
|
|
"coal_reduction": E_p_million_kwh * 0.404 * 10, # kg
|
|
|
|
|
"CO2_reduction": E_p_million_kwh * 0.977 * 10, # kg
|
|
|
|
|
"SO2_reduction": E_p_million_kwh * 0.03 * 10, # kg
|
|
|
|
|
"NOX_reduction": E_p_million_kwh * 0.015 * 10 # kg
|
2025-04-27 17:25:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 获取风机参数
|
2025-04-27 17:25:43 +08:00
|
|
|
|
rated_power, swept_area, blade_diameter = get_wind_turbine_specs(device_name, file_path)
|
|
|
|
|
|
|
|
|
|
# 估算风机数量
|
|
|
|
|
num_turbines = estimate_wind_turbine_count(area_km2, blade_diameter)
|
|
|
|
|
|
|
|
|
|
# 计算空气密度
|
2025-04-28 08:22:03 +08:00
|
|
|
|
avg_density = air_density(altitude, hub_height, avg_temp)
|
2025-04-27 17:25:43 +08:00
|
|
|
|
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 计算风功率密度(W/m²)
|
|
|
|
|
wpd = wind_power_density(avg_density, avg_wind_speed)
|
2025-04-27 17:25:43 +08:00
|
|
|
|
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 计算总装机容量(kW)
|
2025-04-27 17:25:43 +08:00
|
|
|
|
total_power = estimated_wind_power(num_turbines, rated_power)
|
|
|
|
|
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 计算年发电量(Wh)
|
|
|
|
|
P_test = calculate_power_output(swept_area, wpd, Cp, eta, num_turbines)
|
2025-04-27 17:25:43 +08:00
|
|
|
|
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 计算等效满负荷小时数
|
2025-04-27 17:25:43 +08:00
|
|
|
|
h = calculate_equivalent_hours(P_test, rated_power)
|
2025-04-28 08:22:03 +08:00
|
|
|
|
|
|
|
|
|
# 转换为万kWh以计算环境效益
|
|
|
|
|
E_p_million_kwh = P_test / 10000000
|
2025-04-27 17:25:43 +08:00
|
|
|
|
env_benefits = calculate_environmental_benefits(E_p_million_kwh)
|
|
|
|
|
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 返回结果字典
|
2025-04-27 17:25:43 +08:00
|
|
|
|
return {
|
|
|
|
|
"device": device_name,
|
|
|
|
|
"rated_power": rated_power,
|
|
|
|
|
"swept_area": swept_area,
|
|
|
|
|
"blade_diameter": blade_diameter,
|
|
|
|
|
"num_turbines": num_turbines,
|
|
|
|
|
"avg_density": avg_density,
|
|
|
|
|
"wpd": wpd,
|
2025-04-28 08:22:03 +08:00
|
|
|
|
"total_power": total_power / 1000, # 转换为MW
|
|
|
|
|
"annual_power_output": P_test / 10000000, # 转换为万kWh
|
2025-04-27 17:25:43 +08:00
|
|
|
|
"equivalent_hours": h,
|
|
|
|
|
"coal_reduction": env_benefits["coal_reduction"],
|
|
|
|
|
"CO2_reduction": env_benefits["CO2_reduction"],
|
|
|
|
|
"SO2_reduction": env_benefits["SO2_reduction"],
|
2025-04-28 08:22:03 +08:00
|
|
|
|
"NOX_reduction": env_benefits["NOX_reduction"]
|
2025-04-27 17:25:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# 主程序
|
|
|
|
|
if __name__ == "__main__":
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 定义输入参数
|
|
|
|
|
file_path = r".\wind_product.xlsx" # 风机参数文件路径
|
|
|
|
|
device_name = 'GW165-4.0' # 风机型号
|
|
|
|
|
area_km2 = 10 # 风电场面积(平方公里)
|
|
|
|
|
avg_temp = 13.0 # 年平均气温(摄氏度)
|
|
|
|
|
avg_wind_speed = 6 # 年平均风速(m/s)
|
|
|
|
|
|
|
|
|
|
# 调用风电场分析函数
|
2025-04-27 17:25:43 +08:00
|
|
|
|
result = wind_farm_analysis(
|
|
|
|
|
device_name=device_name,
|
|
|
|
|
area_km2=area_km2,
|
|
|
|
|
file_path=file_path,
|
2025-04-28 08:22:03 +08:00
|
|
|
|
avg_temp=avg_temp,
|
|
|
|
|
avg_wind_speed=avg_wind_speed
|
2025-04-27 17:25:43 +08:00
|
|
|
|
)
|
|
|
|
|
|
2025-04-28 08:22:03 +08:00
|
|
|
|
# 输出结果
|
2025-04-27 17:25:43 +08:00
|
|
|
|
print(f"\n设备: {result['device']}")
|
|
|
|
|
print(f"额定功率: {result['rated_power']:.2f} KW")
|
|
|
|
|
print(f"扫风面积: {result['swept_area']:.2f} m^2")
|
|
|
|
|
print(f"叶片直径: {result['blade_diameter']:.2f} m")
|
|
|
|
|
print(f"风机数量: {result['num_turbines']} 台")
|
|
|
|
|
print(f"平均空气密度: {result['avg_density']:.3f} kg/m^3")
|
|
|
|
|
print(f"风功率密度: {result['wpd']:.2f} W/m^2")
|
|
|
|
|
print(f"项目装机容量: {result['total_power']:.2f} MW")
|
|
|
|
|
print(f"年发电量: {result['annual_power_output']:.3f} 万 kWh")
|
|
|
|
|
print(f"等效小时数: {result['equivalent_hours']:.2f} 小时")
|
2025-04-28 08:22:03 +08:00
|
|
|
|
print(f"标准煤减排量:{result['coal_reduction']:,.0f} kg")
|
2025-04-27 17:25:43 +08:00
|
|
|
|
print(f"CO₂减排量:{result['CO2_reduction']:,.0f} kg")
|
|
|
|
|
print(f"SO₂减排量:{result['SO2_reduction']:,.0f} kg")
|
2025-04-28 08:22:03 +08:00
|
|
|
|
print(f"NOx减排量:{result['NOX_reduction']:,.0f} kg")
|