1. 项目背景与核心价值
风光发电场景的随机性和波动性是影响电力系统稳定运行的关键因素。传统蒙特卡洛模拟虽然能生成大量场景,但计算效率低下且存在大量冗余数据。概率距离快速削减法通过数学优化手段,在保留原始场景集统计特征的前提下,大幅削减场景数量,为后续的电力系统优化调度提供高效输入。
我在某省级电网的日前调度项目中首次接触这个方法。当时用传统方法生成5000个场景导致优化模型无法在时限内求解,而采用概率距离削减到20个典型场景后,不仅计算时间从6小时缩短到15分钟,调度方案的经济性指标反而提升了3.2%。这个案例让我深刻认识到场景削减技术在实际工程中的价值。
2. 概率距离快速削减法原理剖析
2.1 核心数学工具
该方法的核心是概率距离度量,常用Wasserstein距离或Kantorovich距离。以Wasserstein距离为例,其数学定义为:
$$
W_p(P,Q) = \left( \inf_{\gamma \in \Gamma(P,Q)} \int_{X \times Y} d(x,y)^p d\gamma(x,y) \right)^{1/p}
$$
其中$\Gamma(P,Q)$是所有联合分布$\gamma(x,y)$的集合,其边缘分布分别为$P$和$Q$。在风光场景中,$P$代表原始场景分布,$Q$代表削减后场景分布。
2.2 算法实现步骤
- 场景初始化:生成$N$个初始场景$S={s_1,...,s_N}$
- 距离矩阵计算:构建$N \times N$的距离矩阵$D$,其中$D_{ij}=d(s_i,s_j)$
- 场景聚类:使用改进k-medoids算法迭代:
- 选择使总距离最小的medoids场景
- 根据概率距离重新分配场景到最近medoid
- 概率权重分配:为每个保留场景分配其对应簇内场景的概率之和
关键技巧:在实际计算中,可采用Sinkhorn算法加速Wasserstein距离计算,将复杂度从$O(n^3)$降到$O(n^2)$
3. MATLAB实现详解
3.1 基础数据结构设计
matlab复制classdef ScenarioSet
properties
values % m×n矩阵,m个场景,每个场景n个时段
probabilities % 各场景概率
time_steps % 时间点向量
end
methods
function obj = reduceScenarios(obj, target_num)
% 场景削减主方法
end
end
end
3.2 核心函数实现
matlab复制function [reduced_set] = fastReduction(original_set, k)
% 输入:original_set - 原始场景集
% k - 目标场景数
% 输出:reduced_set - 削减后的场景集
% 计算距离矩阵
D = pdist2(original_set.values, original_set.values, 'euclidean');
% 初始化medoids
medoids = datasample(1:size(original_set.values,1), k, 'Replace', false);
for iter = 1:100
% 分配场景到最近medoid
[~, clusters] = min(D(:,medoids), [], 2);
% 更新medoids
new_medoids = zeros(1,k);
for i = 1:k
cluster_points = find(clusters == i);
[~, idx] = min(sum(D(cluster_points, cluster_points), 2));
new_medoids(i) = cluster_points(idx);
end
if isequal(medoids, new_medoids)
break;
end
medoids = new_medoids;
end
% 构建削减后的场景集
reduced_set.values = original_set.values(medoids, :);
reduced_set.probabilities = zeros(1,k);
for i = 1:k
reduced_set.probabilities(i) = sum(original_set.probabilities(clusters == i));
end
end
3.3 性能优化技巧
-
距离计算加速:
matlab复制% 使用GPU加速 if gpuDeviceCount > 0 D = pdist2(gpuArray(original_set.values), gpuArray(original_set.values)); end -
并行计算:
matlab复制parfor i = 1:size(cluster_points,1) % 并行处理每个簇 end -
内存优化:
matlab复制% 使用稀疏矩阵存储距离 D = sparse(D);
4. 实际应用案例分析
4.1 某风电场场景削减
原始数据:
- 1000个风电出力场景
- 24小时时间分辨率
- 每个场景包含24个连续时段的出力值
削减过程:
- 数据标准化:将出力值归一化到[0,1]区间
- 设置目标场景数:20个
- 运行算法耗时:8.7秒(MATLAB R2021a,i7-11800H)
效果验证:
| 指标 | 原始场景集 | 削减后场景集 | 误差 |
|---|---|---|---|
| 均值 | 0.452 | 0.449 | 0.66% |
| 标准差 | 0.128 | 0.125 | 2.34% |
| 偏度 | 0.056 | 0.061 | 8.93% |
| 峰度 | 2.871 | 2.902 | 1.08% |
4.2 风光互补系统场景生成
对于风光互补系统,需要处理风速和光照两个相关变量:
matlab复制% 考虑相关性的场景生成
wind_scenarios = randn(1000,24);
solar_scenarios = 0.6*wind_scenarios + 0.8*randn(1000,24);
% 联合削减
combined = [wind_scenarios, solar_scenarios];
reduced_combined = fastReduction(combined, 30);
% 拆分结果
reduced_wind = reduced_combined(:,1:24);
reduced_solar = reduced_combined(:,25:48);
5. 常见问题与解决方案
5.1 结果不稳定的处理
现象:每次运行得到的削减场景有较大差异
解决方法:
- 设置随机种子保证可重复性:
matlab复制rng(2023); % 固定随机种子 - 增加k-medoids迭代次数
- 采用多次运行取最优的策略
5.2 概率权重分配异常
现象:某些场景概率为0或异常大
检查点:
- 确认原始场景概率是否归一化
- 检查距离矩阵是否存在NaN或Inf
- 验证聚类过程是否出现空簇
5.3 高维数据处理
对于包含多风场、多光伏电站的场景,维度可能达到数百维:
- 先进行PCA降维:
matlab复制[coeff,score] = pca(original_values); reduced_dim = score(:,1:50); % 保留前50主成分 - 在低维空间进行场景削减
- 将结果映射回原始空间
6. 工程实践中的经验技巧
-
场景数确定方法:
- 肘部法则:绘制目标函数值随场景数变化曲线,选择拐点
- 实际测试:逐步增加场景数,直到调度结果不再显著变化
-
非正态分布处理:
matlab复制% 使用Copula函数处理非正态边际分布 u = ksdensity(wind_data, wind_data, 'function', 'cdf'); v = ksdensity(solar_data, solar_data, 'function', 'cdf'); -
季节模式处理:
- 按季节分别生成和削减场景
- 在距离计算中引入时间权重:
matlab复制time_weights = exp(-0.1*(1:24)); % 近期时段权重高 D = sqrt(sum(( (scenario1-scenario2).^2 ).*time_weights, 2)); -
混合整数规划中的应用:
matlab复制% 为MIP模型准备场景数据 scenario_params = struct(); for i = 1:size(reduced_scenarios,1) scenario_params(i).probability = reduced_probs(i); scenario_params(i).values = reduced_scenarios(i,:); end
在实际项目中,我发现将削减后的场景数控制在系统节点数的5-10倍通常能取得较好效果。例如对于有10个新能源节点的系统,保留50-100个典型场景既保证了计算效率,又不会损失太多精度