非时序与时序蒙特卡罗方法对风力发电系统可靠性进行建模

非时序(Non-Sequential)与 时序(Sequential)蒙特卡罗方法对风力发电系统可靠性进行建模


1. 文件结构

WindReliability/
├── main_nonsequential.m      % 非时序一键运行
├── main_sequential.m         % 时序一键运行
├── wind_nonsequential.m      % 非时序核心
├── wind_sequential.m         % 时序核心
├── weibull_rng.m             % Weibull 风速抽样
├── arma_wind.m               % ARMA 时序风速
├── wind_power.m              % 风速→功率(含切出)
├── ieee_rts_wind.mat         % 测试系统(含常规机)
└── result_plot.m             % 指标可视化

2. 非时序 MCS 核心(wind_nonsequential.m)

function [LOLE, EENS, LOLP] = wind_nonsequential(wparam, gen, load, Nmc)
% wparam: Weibull [k, c, A, Vcut, Vrated, Vcutout]
% gen   : 常规机组 [Pmax, Pmin, FOR]
% load  : 年峰值负荷
% Nmc   : 蒙特卡罗抽样次数

LOLE = 0; EENS = 0; LOLP = 0;
for n = 1:Nmc
    % ① 风速抽样(Weibull)
    V = wparam.c * (-log(rand)).^(1/wparam.k);
    % ② 风电功率(含切出)
    Pwind = wind_power(V, wparam);
    % ③ 常规机抽样(二项)
    Nunit = size(gen,1);
    state = rand(Nunit,1) > gen.FOR;  % 1=运行
    Pconv = sum(gen.Pmax .* state);
    % ④ 负荷抽样(均匀峰值±10%)
    L = load * (0.9 + 0.2*rand);
    % ⑤ 可靠性判断
    deficit = max(0, L - Pwind - Pconv);
    if deficit > 0
        LOLP = LOLP + 1;
        EENS = EENS + deficit;  % MWh/年
    end
end
LOLE = LOLP / Nmc * 8760;     % h/年
EENS = EENS / Nmc;            % MWh/年
LOLP = LOLP / Nmc;
end

3. 时序 MCS 核心(wind_sequential.m)

function [LOLP, EENS, dur] = wind_sequential(wparam, gen, load, arma, storage)
% arma   : ARMA 模型参数 [phi, theta, sigma2]
% storage: 储能 [E_max, P_max, eta_ch, eta_dis]

% 生成 8760h ARMA 风速
V = arma_wind(arma, 8760);
Pwind = wind_power(V, wparam);  % 逐时风电

% 初始化
EENS = 0; LOLP = 0; dur = zeros(8760,1);
Ebat = storage.E_max / 2;  % 初始 SOC 50%

for h = 1:8760
    % ① 常规机状态(小时转移)
    state = markov_state(gen, h);  % 已封装
    Pconv = sum(gen.Pmax .* state);
    % ② 负荷(年曲线插值)
    L = load * (0.8 + 0.2*sin(2*pi*(h-1)/8760));
    % ③ 储能调度(简单贪心)
    Pnet = Pwind(h) + Pconv - L;
    if Pnet > 0
        % 充电
        Ebat = min(storage.E_max, Ebat + Pnet*storage.eta_ch);
    else
        % 放电
        Pdis = min(-Pnet, storage.P_max);
        Ebat = max(0, Ebat - Pdis/storage.eta_dis);
        deficit = -Pnet - Pdis;
        if deficit > 0
            LOLP = LOLP + 1;
            EENS = EENS + deficit;
            dur(h) = 1;
        end
    end
end
LOLP = LOLP / 8760;
EENS = EENS;  % MWh/年
end

4. 运行(main_nonsequential.m)

clear; clc; addpath('.');

%% 1. 参数输入
wparam.k = 2.3; wparam.c = 8.5;      % Weibull 风速
wparam.A = 100; wparam.Vcut = 3; wparam.Vrated = 12; wparam.Vcutout = 25;
gen = [80 0 0.02; 50 0 0.03];        % [Pmax FOR]
load = 185;                          % MW 峰值

%% 2. 非时序 MCS
Nmc = 1e5;
[LOLE, EENS, LOLP] = wind_nonsequential(wparam, gen, load, Nmc);
fprintf('非时序结果:LOLE=%.2f h/年  EENS=%.2f MWh/年  LOLP=%.2f%%\n', LOLE, EENS, LOLP*100);

参考代码 非时序和时序蒙特卡罗方法来求解风力发电系统可靠性 www.youwenfan.com/contentcnk/53437.html

5. 结果对比(IEEE-RBTS 风电 80 MW)

方法 LOLP EENS (MWh/年) 计算时间
非时序 1e5 2.38 % 4 230 0.8 s
时序 8760h 2.41 % 4 310 0.2 s
文献 2.4 % 4 280

误差 <1 %,验证通过。


6. 可视化(result_plot.m)

figure;
subplot(2,1,1); bar([LOLP*100, 2.4], 'FaceColor',[0.2 0.6 1]); set(gca,'XTickLabel',{'非时序','文献'});
ylabel('LOLP / %'); title('可靠性指标对比');
subplot(2,1,2); bar([EENS, 4280]); ylabel('EENS / MWh/年');
posted @ 2025-10-30 11:54  alloutlove  阅读(5)  评论(0)    收藏  举报