任务:用RTS-79系统测算风电容量可信度。
1.RTS79系统的介绍
RTS(Reliability Test System)提供了一个基准模型,用于研究电力系统的可靠性和稳定性问题 。
它包含了24个节点、32个发电机组、38条输电线路。
设计动机:为了给比较不同方法得到的电力系统可靠性结果提供依据,最好有一个包含可靠性评估所需的基本数据的参考或“试验”系统。这个系统被设计为具有高度的代表性,能够模拟现实世界电力系统的各种操作条件和故障情况。
2.测算风电容量前,先算LOLE(加风电的情况)
目前问题是不明确风电如何接入,用那部分的数据。
机组容量(MW) | 强迫停运率(%) |
20 | 10.00 |
20 | 10.00 |
76 | 2.00 |
76 | 2.00 |
20 | 10.00 |
20 | 10.00 |
76 | 2.00 |
76 | 2.00 |
100 | 4.00 |
100 | 4.00 |
100 | 4.00 |
197 | 5.00 |
197 | 5.00 |
197 | 5.00 |
12 | 2.00 |
12 | 2.00 |
12 | 2.00 |
12 | 2.00 |
12 | 2.00 |
155 | 4.00 |
155 | 4.00 |
400 | 12.00 |
400 | 12.00 |
50 | 1.00 |
50 | 1.00 |
50 | 1.00 |
50 | 1.00 |
50 | 1.00 |
50 | 1.00 |
155 | 4.00 |
155 | 4.00 |
350 | 8.00 |
录入数据,我们算此时的LOLE。
% 发电机组的容量和可靠性数据
gen_capacity =table2array(fuhe(:,1)); % 发电机组容量(MW)
gen_failure_rate = table2array(fuhe(:,2)) * 0.01; % 发电机组故障率,我直接用了强迫停运率,有问题
gen_work_rate=table2array(fuhe(:,4));
average_wind_output=0;%风电取0
% 假设有一个负荷需求
load_demand = 3045;% 负荷需求(MW)3045
% 计算系统的总可用容量(包括风电)
total_capacity = sum(gen_capacity) + average_wind_output;
suoyin=@(num_remain)...
randperm(length(gen_capacity), num_remain);
remaining_capacity = @(num_remain)...
sum(gen_capacity(suoyin(num_remain))) + average_wind_output;
%randperm(length(gen_capacity), num_fails))生成1到32索引
% 计算LOLP
lolp = 0;
p=0;
for i = 1:32
fails = i-1; % 失败的发电机组数量
num_remain=32-fails;
% 计算在各种故障状态下系统的剩余容量
if remaining_capacity(num_remain)<load_demand
% 得到要保留的索引
indices_to_keep = setdiff(1:32, suoyin(num_remain));
% 使用索引数组来提取元素
filtered_arr = gen_work_rate(indices_to_keep);
p=prod(filtered_arr);%相乘
lolp=lolp+p;
end
end
% 显示LOLP结果
disp(['LOLE with wind power integration: ', num2str(lolp)]);
上述为运行结果。(不加风电)值只能作为平均值。问题一:这是因为我在代码中犯了错,没有完全遍历。
问题2:结果甚至不是定义的LOLE。因为LOLE是对时间指标上的相加,我的数据里并没有用时间上的指标?
加风电,我查到:
% 计算风电场的平均出力
average_wind_output = wind_capacity * wind_output_factor;
% 计算系统的总可用容量(包括风电)
total_capacity = sum(gen_capacity) + average_wind_output;
然后直接加到容量里,我认为是有误的。
问题3:风电的接入是需要利用什么数据呢?是用所谓平均出力来描述?
我们改一下代码:
%该系统是由10条 发电母线、17个负荷节点、33条输电线、5台变压器和32台发电机组组成,该系统的
% 总装机容量是3405MW,系统最大负荷是2850MW。
% 负荷模型数据、常规发电机组模型数据将采用IEEE—RTS79系统中的可靠性分析数据。
% 假设数据
gen_capacity =table2array(fuhe(:,1)); % 发电机组容量(MW)
wind_turbines = 50; % 风电机组数量
wind_capacity = wind_turbines * 200; % 风电机组总容量,假设每台风机容量为2MW
load_demand =3045; % 系统负荷需求
% 系统可靠性评估参数
num_simulations = 10000; % 蒙特卡罗仿真次数
% 初始化可靠性指标
total_outages = 0; % 总停电次数
total_duration = 0; % 停电总时长
% 蒙特卡罗仿真
for i = 1:num_simulations
% 随机生成系统运行状态
gen_status = randi([0, 1], length(gen_capacity), 1); % 发电机组运行状态(0-故障,1-运行)
wind_output = randi([0, wind_capacity], 1, 1); % 风电输出,假设风电输出在0到风电总容量之间随机
% 计算当前可用容量
available_capacity = sum(gen_capacity .* gen_status) + wind_output;
% 检查是否发生停电
if available_capacity < load_demand
total_outages = total_outages + 1; % 停电次数加1
% 假设每次停电持续时间为1小时,可以根据实际情况调整
total_duration = total_duration + 1;
end
end
% 计算LOLP和EENS
LOLP = total_outages / num_simulations; % 失负荷概率
EENS = total_duration / num_simulations * 8760; % 年期望能量不供应量
% 输出结果
fprintf('LOLP: %.4f\n', LOLP);
fprintf('EENS: %.2f MWh\n', EENS);
这里风电机组取了50个。想确认下这样的算法正确吗,与论文结果比对发现:
LOLP相差较大,EENS相差在可容忍范围内。
3.算好之后,用截弦法来求交点
记录一些AI写的:
def secant_method(f, x0, x1, tolerance):
"""
使用截弦法求解方程 f(x) = 0 的根。
参数:
f -- 需要求解的函数
x0 -- 第一个初始近似值
x1 -- 第二个初始近似值
tolerance -- 容许误差
返回:
x -- 方程的近似根
"""
while abs(x1 - x0) > tolerance:
# 计算新的近似值
x = x1 - f(x1) * (x1 - x0) / (f(x1) - f(x0))
# 更新近似值
x0, x1 = x1, x
return x
# 定义一个示例函数
def example_function(x):
return x**2 - 2 # 例如,求解 x^2 - 2 = 0
# 初始近似值
x0 = 1.0
x1 = 1.5
# 容许误差
tolerance = 1e-5
# 调用截弦法求解
root = secant_method(example_function, x0, x1, tolerance)
print(f"方程 {example_function.__name__} 的近似根是: {root}")
当然可以求f(x)=a的根。