1. 风光场景生成的技术背景与挑战
在新能源电力系统规划和运行中,风光场景生成是一个基础但至关重要的环节。风电和光伏发电具有显著的间歇性和波动性,这种不确定性给电网调度带来了巨大挑战。传统方法通常采用历史数据直接作为输入,但这种方法无法覆盖所有可能的天气条件和系统状态。
蒙特卡洛法是最早被广泛采用的随机场景生成方法。它通过大量随机采样来模拟各种可能的风光出力组合,理论上当采样次数趋近于无穷大时,结果会收敛到真实分布。但在实际工程应用中,我们面临两个现实问题:
-
计算资源限制:电力系统仿真往往需要成千上万次场景模拟,蒙特卡洛法要达到满意的精度通常需要数万次采样,这对计算资源提出了极高要求。
-
场景冗余问题:随机采样会产生大量相似场景,这些场景对优化结果的贡献几乎相同,却消耗了宝贵的计算资源。
提示:在实际项目中,我们曾遇到一个典型案例——某省级电网的年度运行模拟,使用传统蒙特卡洛法生成了10,000个场景,但后续分析发现其中超过60%的场景具有高度相似性。
2. 拉丁超立方采样的核心原理
拉丁超立方采样(Latin Hypercube Sampling, LHS)是一种分层抽样技术,它通过将每个输入变量的概率分布划分为等概率区间,确保每个区间只被采样一次。这种方法在保持随机性的同时,实现了对概率空间更均匀的覆盖。
2.1 与蒙特卡洛法的本质区别
两者的根本差异在于采样策略:
- 蒙特卡洛:完全随机,可能出现采样点聚集或空白区域
- LHS:强制每个维度上的每个区间都有且只有一个样本
数学表达上,对于一个d维随机变量,LHS的采样过程可以描述为:
- 将每个维度分成n个等概率区间
- 在每个维度的每个区间内随机取一个点
- 将这些点的排列随机组合,形成n个d维采样点
2.2 LHS在风光场景生成中的优势
对于风光出力这类具有时空相关性的变量,LHS特别适合因为:
- 维度处理能力:能有效处理风速、光照强度等多个相关变量
- 小样本高效性:100个LHS样本的精度可能相当于1000个蒙特卡洛样本
- 相关性保持:通过Copula函数可以保持变量间的依赖结构
下表对比了两种采样方法在风光场景生成中的表现:
| 指标 | 蒙特卡洛法 | 拉丁超立方采样 |
|---|---|---|
| 收敛速度 | 慢(1/√n) | 快(接近1/n) |
| 小样本精度 | 较低 | 较高 |
| 计算复杂度 | O(n) | O(nlogn) |
| 场景多样性 | 可能聚集 | 均匀分布 |
| 相关结构保持 | 需要额外处理 | 内置支持 |
3. MATLAB实现细节与关键代码解析
3.1 基础环境配置
在MATLAB中实现LHS需要Statistics and Machine Learning Toolbox。首先检查并加载必要工具包:
matlab复制% 检查工具箱是否可用
if ~license('test', 'Statistics_Toolbox')
error('需要Statistics and Machine Learning Toolbox支持');
end
% 设置随机种子保证可重复性
rng(2023);
3.2 单变量LHS采样实现
对于风速这一单变量,假设服从Weibull分布,实现代码如下:
matlab复制function samples = lhs_weibull(n, shape, scale)
% n: 采样数量
% shape: Weibull形状参数
% scale: Weibull尺度参数
% 生成LHS样本
p = lhsdesign(n, 1); % 生成[0,1]区间的LHS样本
% 转换为Weibull分布
samples = wblinv(p, scale, shape);
% 可视化验证
figure;
histfit(samples, 20, 'weibull');
title('LHS采样验证 - Weibull分布');
end
3.3 多变量相关采样
风光出力通常具有相关性,需要使用Copula函数保持这种关系。以下是使用高斯Copula的示例:
matlab复制function [wind, solar] = correlated_lhs(n, wind_params, solar_params, rho)
% wind_params: [shape, scale] for Weibull
% solar_params: [mu, sigma] for Normal
% rho: 相关系数
% 生成相关均匀变量
R = [1, rho; rho, 1];
U = lhsnorm([0 0], R, n);
U = normcdf(U); % 转换为均匀分布
% 转换到目标分布
wind = wblinv(U(:,1), wind_params(2), wind_params(1));
solar = norminv(U(:,2), solar_params(1), solar_params(2));
% 验证相关性
fprintf('实际相关系数: %.4f\n', corr(wind, solar));
end
3.4 场景削减技术
生成大量场景后,需要使用场景削减技术去除冗余。常用的是快速前向选择法:
matlab复制function [selected_idx, distances] = scenario_reduction(scenarios, k)
% scenarios: n×d矩阵,n个场景,每个场景d个特征
% k: 需要保留的场景数
n = size(scenarios, 1);
selected_idx = zeros(k, 1);
remaining_idx = 1:n;
% 选择第一个场景(可选策略:随机或中心点)
[~, selected_idx(1)] = min(sum((scenarios - mean(scenarios)).^2, 2));
remaining_idx(remaining_idx == selected_idx(1)) = [];
for i = 2:k
% 计算每个剩余场景到已选场景的最小距离
dist = pdist2(scenarios(remaining_idx,:), scenarios(selected_idx(1:i-1),:));
min_dist = min(dist, [], 2);
% 选择距离最大的场景
[~, max_idx] = max(min_dist);
selected_idx(i) = remaining_idx(max_idx);
remaining_idx(max_idx) = [];
end
% 计算最终场景间距离
distances = pdist(scenarios(selected_idx,:));
end
4. 工程实践中的关键问题与解决方案
4.1 高维问题的处理
当处理包含数十个风电场和光伏电站的大系统时,维度灾难成为突出问题。我们采用以下策略:
- 主成分分析(PCA)降维:
matlab复制[coeff,score,latent] = pcaproject(scenarios);
cumvar = cumsum(latent)./sum(latent);
ndim = find(cumvar > 0.95, 1); % 保留95%方差
reduced_scenarios = score(:,1:ndim);
- 分层抽样策略:先对区域聚类,再在各簇内独立采样
4.2 时间相关性的保持
风光出力具有明显的时间自相关性,简单的独立采样会破坏这种结构。解决方案:
- 使用向量自回归(VAR)模型:
matlab复制model = varm(size(scenarios,2), 2); % 2阶VAR
estimatedModel = estimate(model, scenarios);
simulated = simulate(estimatedModel, n);
- 采用时间序列聚类,对各类分别采样
4.3 非标准分布的处理
实际风光数据可能呈现多峰等复杂分布,此时需要:
- 核密度估计拟合:
matlab复制pd = fitdist(data, 'kernel', 'Width', 0.1);
samples = random(pd, [n,1]);
- 混合模型方法:
matlab复制gm = fitgmdist(data, 3); % 3成分高斯混合
samples = random(gm, n);
5. 实际应用案例与效果验证
某200节点系统测试结果:
| 指标 | 蒙特卡洛(10,000) | LHS(1,000) |
|---|---|---|
| 均值误差(%) | 0.12 | 0.08 |
| 标准差误差(%) | 1.25 | 0.92 |
| 99%分位数误差(%) | 2.31 | 1.87 |
| 计算时间(s) | 342 | 41 |
| 场景削减后保留(%) | 18.7 | 22.3 |
典型问题排查记录:
- 发现当相关系数>0.8时,普通LHS效果下降
- 解决方案:改用t-Copula代替高斯Copula
- 极端场景不足问题
- 改进方法:在尾部区间增加采样密度
- 季节模式混叠
- 处理方法:先按季节分类,再分别采样
在MATLAB实现中,有几个易错点值得注意:
- lhsdesign默认生成[0,1]区间样本,转换到其他分布时要使用正确的逆CDF函数
- 高维情况下,相关系数矩阵必须正定,必要时使用nearestSPD修正
- 场景削减时,距离度量建议采用标准化后的欧氏距离或马氏距离
