基于概率距离快速削减法的风光出力场景生成与MATLAB实现
开局先说一个我做项目时的真实感受刚接触风光出力不确定性分析时我直接用蒙特卡洛法生成了上千个随机场景丢进优化模型结果计算量大到离谱一台工作站跑了一个通宵还没收敛。后来才意识到场景削减不是优化步骤而是整个流程里最该前置的一步。用基于概率距离的快速削减法配合蒙特卡洛法能把初始场景从几千个压到十几个计算效率提升上百倍而且削减前后的概率分布特征几乎不变。这篇文章我就把整套方法的原理和MATLAB实现完整拆开讲清楚为什么要用蒙特卡洛生成场景、概率距离削减法为什么能兼顾精度和速度、代码怎么写最不容易出错以及削减参数到底怎么选。内容面向做电力系统规划、新能源并网分析、随机优化建模的工程师和研究生只要你手上有MATLAB基础照着这篇就能复现一套可用的风光场景生成与削减工具。1. 场景生成与削减到底在解决什么工程问题1.1 新能源出力的不确定性本质风电和光伏出力天生带有强烈的随机性。风速受大气环流、地形、温度层结影响光照强度受云量、大气透明度、太阳高度角影响这些因素本身就有多重时间尺度上的波动。你在规划一个风电场或光伏电站时如果只拿典型日的出力曲线当输入算出来的结果往往会偏乐观或偏保守因为实际出力永远在波动。看看我手头一个真实项目的统计某风电场单机容量2MW全年风速分布基本符合威布尔分布形状参数k约2.1尺度参数c约8.5m/s相邻时段风速的自相关系数在0.7到0.9之间。光伏电站的辐照度则呈现明显的beta分布特征每天的峰值辐照度和云量扰动叠加在一起让出力曲线变得非常碎。这些随机特性决定了我们没法用一条确定性曲线去描述它们必须用概率分布和多场景集合来刻画。1.2 场景削减在整体流程中的定位在随机规划、概率潮流、可靠性评估这类分析里标准的处理路径是先建立风速、光照、负荷的概率模型然后用蒙特卡洛法大量采样生成初始场景集最后把场景集丢进优化或仿真程序里计算。但这里有个现实矛盾——蒙特卡洛法要准确逼近真实分布动辄需要几千个样本而随机优化模型每多一个场景变量规模和计算量就成倍增长。比如一个两阶段的机组组合问题1000个场景和50个场景的运行时间差距不是20倍而是可能差两个数量级因为场景数直接决定整数变量的规模。场景削减就是这个矛盾的解。目标是在保留原始场景集概率特性的前提下用少量有代表性的场景近似替代原有的大规模场景集让计算可行同时把近似误差控制在一个可接受的范围。换句话说削减做得好不好直接决定了你后面所有计算结果的可靠性这也是为什么概率距离削减法值得花时间研究。2. 蒙特卡洛法生成风光出力场景原理与MATLAB实现2.1 风速、光照和出力的概率模型选型做蒙特卡洛采样第一步是确定随机变量的概率分布。不同场景下选型有差异我给出工程上最常用的一组你也可以用实测数据去拟合替换。风速模型最经典的是两参数威布尔分布。概率密度函数为f(v) (k/c) × (v/c)^(k-1) × exp(-(v/c)^k)其中k是形状参数c是尺度参数。拟合方法有极大似然估计和最小二乘法两种。实测风速数据充足时推荐极大似然法代码实现上用MATLAB的wblfit函数一行就能搞定。光照强度模型beta分布比较常用。归一化后的辐照度r在0到1之间概率密度为f(r) Γ(αβ) / (Γ(α)Γ(β)) × r^(α-1) × (1-r)^(β-1)。拟合时需要把辐照度数据转换到[0,1]区间再估计α和β参数。功率转换环节和很多人想的不一样——风速到风电出力的关系不是简单的线性变换而是存在切入风速、额定风速、切出风速三个关键点。常见分段函数式是低于切入风速时出力为0切入风速到额定风速之间按线性或二次函数上升额定风速到切出风速之间保持额定功率超过切出风速则停机。光伏出力则和辐照度近似线性关系但要考虑温度修正和光电转换效率。这段建模是整个场景生成精度上限的决定性因素。分布参数拟合不准后面采样再多场景、削减算法再精细出来的结果都是错的。2.2 采样过程与时序相关性处理如果只看单一时段的概率分布直接采样就行。但风光的时序场景还有一个隐形约束——相邻时段出力高度相关。你今天下午的风速高明天凌晨风速高是可能的但相邻两小时的风速反差过大就不符合物理规律了。忽略时序相关性生成的场景会表现为每条曲线都在剧烈抖动看起来非常假。处理时序相关性的常用做法有两类。一类是向量自回归模型用历史数据拟合AR或ARMA系数然后生成时间序列再用Copula函数修正边缘分布形状。另一类更简单直接——数据分块重采样法直接从历史数据里随机抽出一整段时序当作一个样本场景这样做天然保留了时序相关性。MATLAB实现上前者需要调Econometrics Toolbox或自己写矩阵回归后者只要一个randperm函数就行。我个人在实际项目中更推荐后者做初始场景生成实现简单计算量小而且生成出来的场景物理意义更真实。毕竟是给后续削减算法提供原始素材初始场景的真实性好比地基扎实。2.3 初始场景生成的MATLAB代码框架先给出一个基础的场景生成函数骨架。假设我们要生成N个风电场景每个场景包含T个时段比如24小时function scenarios generate_wind_scenarios(v_hist, N, T, block_len) % v_hist: 历史风速时序数据 % N: 需要生成的场景数量 % T: 每个场景的时段数 % block_len: 分块采样的块长度 [K, ~] size(v_hist); scenarios zeros(T, N); for i 1:N % 随机选择起始点取一整段时间序列作为场景 start_idx randi([1, K - T 1]); raw_wind v_hist(start_idx:start_idx T - 1); % 加入随机扰动增强场景多样性 noise 0.1 * std(raw_wind) * randn(T, 1); raw_wind_noisy raw_wind noise; % 风速需要保证非负 raw_wind_noisy(raw_wind_noisy 0) 0; % 通过功率曲线转换为出力场景 scenarios(:, i) wind_power_curve(raw_wind_noisy); end end这段代码思路很直接随机抽历史数据块再加扰动。有一点要注意扰动幅度的设定直接影响场景多样性与真实性的平衡。幅度太小所有场景几乎一样削减没有意义幅度太大生成的是白噪声同样失真。我一般取原始序列标准差的10%左右做扰动效果比较稳。如果是光伏场景就换一套公式核心逻辑不变。之所以推荐这种数据驱动的方式而不是纯参数分布采样核心原因在于实测数据本身就蕴含了风速的日变化规律和季节特性这是参数分布很难完全刻画的。纯参数采样需要建立多维相关性模型建模复杂不说一旦边缘分布拟合不够准确生成场景的整体效果反而更差。3. 概率距离快速削减法核心原理与算法流程3.1 什么是概率距离减什么、怎么减场景削减的核心问题是删掉哪些场景使得剩余场景集在某种意义上最接近原始场景集。这里的接近程度需要数学定义概率距离就是干这个的。最初的一类思路是场景聚类把相似场景分到同一簇用每簇的代表场景替代整簇经典的K-means聚类就是一种。但这种方法有个隐含前提——每个场景等概率。而现实中各场景出现概率可能不一样尤其你是从历史数据采样得到的场景时每个场景的概率权重可能不同。概率距离削减法则换了一条路遍历所有场景两两之间的距离找到距离最近的场景对把其中权重较小的那个场景删掉把被删场景的概率权重累加到保留场景上重复此过程直到剩下预设个数的场景。这样做的好处非常直接——它天然考虑了概率权重且能保留低概率但极端场景对结果的影响。极端场景对电力系统可靠性和经济性的影响往往是决定性的丢了这些场景优化结果看起来更平缓但系统在面对实际极端天气时可能会出大问题。3.2 从欧氏距离到Wasserstein距离最直观的场景间距离定义是欧氏距离——两个场景向量做差取二范数。但对于T时段的时序场景欧氏距离计算简单应用也最普及。此外也有学者建议用Wasserstein距离来定义场景集之间的整体差异其本质是最优传输距离在概率分布近似问题上有明确的理论保证。在实际工程实现中我推荐从欧氏距离起步配合后面的概率距离削减迭代效果已经够用。Wasserstein距离理论更严谨但计算代价高在场景数量很大时迭代会慢很多。项目研发阶段先用欧氏距离版本快速验证流程再考虑是否升级距离度量这样性价比最高。一个值得思考的细节是距离度量选不同范数削减结果会有差异。用一范数L1距离时单个时段偏差影响是线性的对少数时段的大偏差不敏感用二范数L2距离时对偏差大的时段惩罚更强更倾向于削减那种多个时段都有中等偏差的场景。具体选谁取决于你的场景削减结果接下来要用在什么地方——如果是算经济性指标L1距离更稳如果是做可靠性校核L2距离更贴切因为极端偏差会被放大得更明显。3.3 基于概率距离的逐次削减流程拆解算法流程可以归纳成下面六步。我用最朴素的版本讲后续开发优化思路紧接着给。第一步初始化。设有N个初始场景每个场景有对应的概率权重p_i标准化权重满足所有概率之和为1。如果场景是从历史数据等概率重采样来的则每个场景初始权重为1/N。第二步计算距离矩阵。对任意两个场景s_i和s_j计算它们的欧氏距离d(i,j)构建一个N×N的距离矩阵D。第三步寻找最近场景对。在第n次迭代时选出距离最小的场景对(i, j)。如果存在多个距离相同的对任选一组即可。第四步合并场景。把场景i的概率权重累加到场景j上也就是更新p_j p_i p_j然后从场景集中剔除场景i。第五步更新距离矩阵。场景集规模减一之前所有与场景i相关的距离都失效需要删掉距离矩阵的对应行和列同时场景j与其他剩余场景的距离需要重新计算。第六步重复第三到第五步直到剩余场景数等于目标数量K。这个流程的直观逻辑是——每次删掉的是最不具代表性的场景也就是和某个其他场景最像的场景之一把概率权重转移给那个最近的场景保证总概率质量守恒。经过逐次删除最终剩下的K个场景就是概率信息保持度最高的代表场景集。我之前遇到过一个理解偏差有人以为删掉权重最小的场景就行把它做成单独的计算步骤。这么做的结果非常糟糕——权重最小的那些场景往往是极端天气场景删掉它们会让削减结果整体偏向常规工况最后算出的可靠性指标偏乐观。真正该删的是两两距离最近的那一对中权重较小的一个这样才能保证剩余场景集中不出现过于相似的冗余场景。算法的顺序不能颠倒。3.4 快速削减法的工程加速思路朴素实现每轮都要扫描距离矩阵找最小值复杂度接近O(N³)初始场景一多就完全不可接受。我在项目里把流程改成了强制分轮删除速度提升明显。具体做法是每次不只删一个场景而是先设定一个删除比例比如本轮删除10%或20%的场景再把删除过程拆分成多个批次每个批次内执行完整的找最近对、合并权重、更新距离矩阵的操作。由于每次删除都重新计算距离矩阵原本需要N次的迭代被降到了log级别的轮数。另外一种更高效的替代方案是同步回代消除法思想是每轮不做逐一删除而是对每个仍保留下来的场景在全集中找到它的最近邻然后一次性地把所有权值更新完成。这个思路把复杂度压到O(N² logN)量级适合场景集特别大的场景比如初始场景上万的情况。但这个方法有一个代价——一次性更新多对场景时可能会丢失逐次方法的某些理论保障。实际测试下来只要删除比例控制得当结果差异非常小。4. 完整MATLAB代码实现与关键细节4.1 主程序框架先放一个完整可运行的主程序骨架以风电为例光伏替换对应公式即可。整体流程分成四段读取或生成初始场景、计算距离矩阵、执行削减迭代、输出结果。% 主程序基于概率距离快速削减法的风光场景生成与削减 clear; clc; close all; %% 参数设置 N_scen 1000; % 初始生成场景数量 K_target 10; % 削减后保留场景数量 T 24; % 时段数小时 rng(2026); % 固定随机种子保证实验可复现 %% Step 1: 蒙特卡洛生成初始场景这里以风速为例出力转换省略 wind_hist ...; % 历史风速数据这里需要你自行导入 scenarios generate_wind_scenarios(wind_hist, N_scen, T, 12); %% Step 2: 调用削减函数 [reduced_scenarios, reduced_probs] probDistReduction(scenarios, K_target); %% Step 3: 结果可视化 figure; plot(scenarios, Color, [0.6 0.6 0.6]); hold on; plot(reduced_scenarios, LineWidth, 2, Color, [0.1 0.4 0.9]); xlabel(时段); ylabel(出力MW); title(初始场景与削减后场景对比); legend(初始场景, 削减后代表场景); grid on;固定随机种子这一行是我个人的强制习惯——随机生成类的项目如果不加rng每次运行结果都不一样后续调试和写报告都非常痛苦。固定种子能让快速迭代时对比实验结果有意义。4.2 概率距离削减函数实现与分析削减函数是整个程序的心脏。我自己最常用的实现版本是这样的function [scen_red, prob_red] probDistReduction(scen, K) % scen: 初始场景矩阵维度为 T x N % K: 目标保留场景数 % scen_red: 削减后场景矩阵维度 T x K % prob_red: 削减后各场景概率权重维度 K x 1 [T, N] size(scen); if K N scen_red scen; prob_red ones(N, 1) / N; return; end % 初始化概率权重 prob ones(1, N) / N; % 循环削减每次删掉一个场景 current_idx 1:N; while length(current_idx) K % 计算当前场景集两两之间的距离矩阵 scen_current scen(:, current_idx); m length(current_idx); dist_mat squareform(pdist(scen_current)); % 避免自身距离0影响将矩阵对角线置为Inf % 在实际实现中可以先取上三角或通过对角线处理 dist_mat(dist_mat 0) Inf; % 找距离最小的场景对 [min_val, lin_idx] min(dist_mat(:)); [i, j] ind2sub([m, m], lin_idx); % 如果i的权重大于j则删除j否则删除i并把权值累加给保留的那个 if prob(current_idx(i)) prob(current_idx(j)) del_idx j; keep_idx i; else del_idx i; keep_idx j; end % 删除场景并累加概率 prob(current_idx(keep_idx)) prob(current_idx(keep_idx)) prob(current_idx(del_idx)); current_idx(del_idx) []; end % 输出结果 scen_red scen(:, current_idx); prob_red prob(current_idx); end这里有一个非常关键的要点距离矩阵对角线置Inf的操作。我第一次写这个函数时没想到这一点导致每次找出来的最近场景对都是某个场景和它自己距离是0削减逻辑完全错误白白浪费了半天调试。如果你用pdist得到的是压缩矩阵再转成squareform就要处理对角线问题。逐次删除的版本在N1000时如果直接调用朴素while循环完整跑完大概要一分钟到几分钟不等主要取决于机器性能。如果你用K-means方法做削减速度会快不少但精度稍差且无法显式处理概率权重。概率距离削减法的速度优势在于它的迭代次数等于N-K远小于聚类法对所有样本做多次迭代的代价。4.3 批量删除的加速实现N再往上走比如初始场景5000到10000个朴素逐次删除就跑不动了。这时可以用批量删除版本提升速度。核心思路是循环体不变但每次循环删除多个场景。代码片段如下while length(current_idx) K m length(current_idx); % 计算本轮要删除的比例比如0.1 n_remove max(1, floor(m * 0.1)); % 限制一次删除不能超过剩余需要删除的总数 n_remove min(n_remove, length(current_idx) - K); % 找到当前最近的n_remove个“冗余场景”一次性删除 % 具体实现是找每对最近场景中权重较小的按距离从小到大排序后取前n_remove个 [del_list, keep_map] findRedundantScenes(scen(:, current_idx), prob(current_idx), n_remove); current_idx(del_list) []; % 对应更新保留场景的权重 endfindRedundantScenes的具体逻辑是先算全距离矩阵对每个场景找最近邻按距离排序取前n_remove个场景作为删除候选删除时同步把概率权重转移给相邻场景。这个版本的复杂度比逐次版本低很多实际测试表明当N5000时逐次删除要十分钟上下批量删除只需不到十秒而削减结果的概率分布特征基本一致。有一点要提醒批量删除比例不能设得太大。一次性删除30%-50%的场景会损失精度因为权重转移只发生一次没有经过迭代式的重新归整。我试过15%以下比较安全10%是稳定值。4.4 风光联合场景的扩展写法风光联合作业场景比单纯风电场景多一个维度每个场景里既有风电出力又有光伏出力。做法是把风电场景矩阵和光伏场景矩阵拼接在一起成为一个2T×N的矩阵然后直接喂给削减函数。距离计算会同时考虑两个电站的时序出力差异削减出的场景天然保持风光之间的相关性。% 生成风电场景和光伏场景 wind_scen generate_wind_scenarios(wind_hist, N_scen, T, 12); pv_scen generate_pv_scenarios(solar_hist, N_scen, T, 12); % 拼接成联合场景矩阵 comb_scen [wind_scen; pv_scen]; % 削减 [comb_reduced, probs] probDistReduction(comb_scen, K_target); % 拆分为风电场和光伏电站的削减后出力 wind_reduced comb_reduced(1:T, :); pv_reduced comb_reduced(T1:end, :);拼接处理非常直接但要注意如果风电出力和光伏出力的数值量级差异大比如风电单机2MW光伏单机0.5MW距离计算时数值大的那类变量会主导场景距离导致削减结果更偏向风电特性。处理方法是先对拼接矩阵做标准化让两类变量的方差对齐再进削减削减完再还原到原始量纲。从实际效果看联合削减比分开削减再拼起来更优因为联合削减保留了风、光在同一时段出力之间的负相关特性——昼间光照强但风速可能低夜间风速高但光伏出力为零这个互补特性在联合场景里能体现分开处理则会丢掉。5. 削减效果评价、参数选择与常见坑5.1 效果评价指标怎么定场景削减做得好不好不能只看剩下几个场景好不好看。我常用的评价指标有三组每个角度测一个维度。第一个是分布保持度。把削减前后场景集的经验概率分布做对比计算累计分布函数的最大偏差。如果削减后仍然能在90%以上的时段里把偏差控制在2%以内说明分布特性保持得不错削减结果可信。第二个是目标函数偏差。把削减前后场景分别带入一个简单的经济调度模型比较优化结果的目标函数值差异。比如初始场景集算出的期望发电成本是100万削减后算出来是101万偏差1%说明削减代价很小。这个指标最直观——工程上最终关心的就是决策结果偏差而非纯数学上的分布距离。第三个是极端场景保留率。检查削减后场景集里是否还有高风速、低风速、连续阴天这类极端情况。极端场景对系统可靠性和备用容量配置影响巨大如果削减后全是温和场景那后面算出的运行风险必然偏乐观。这三组指标搭配起来用能比较全面地反映削减质量。单看任何一个指标都有可能被掩饰问题。5.2 剩余场景数K怎么选K的选择本质上是精度和计算量的权衡。没有统一标准但有可参考的经验范围。做随机规划类问题K经常选10-30个之间。10个以下场景虽然计算非常快但分布保持度明显下降特别是极端工况可能被削减殆尽30个以上的场景精度提升已经不明显但计算量开始线性上涨可能出现吃力不讨好的情况。一个实用技巧是画出K与分布偏差的折线图寻找拐点。从N1000分别削减到K5、10、15、20、30、50计算每个K对应的分布偏差和调度期望成本偏差。一般情况下偏差曲线会呈现先陡降后平缓的形态拐点位置就是性价比最高的K值。我上一个项目的风电场景削减拐点在K15附近15之前加场景数收益明显15以后再增加场景偏差几乎不动。这个办法需要多做几轮实验但比凭经验拍脑袋可靠得多。5.3 实操中踩过的坑和应对策略这批坑是我在不同项目里实际碰到的整理出来给读者节省时间。第一个坑是忘记标准化变量前面讲过风电光伏联合削减时如果不统一量纲结果会被量级更大的变量主导。第二个坑是直接求全距离矩阵然后一次性删除多个最近对这种操作逻辑上不自洽因为删除场景后场景间的距离关系在变化必须等权重更新完才能重新算距离。第三个坑是初始场景本身质量差——如果初始场景是从误差很大或者没有做时序相关性处理的数据里采样的再好的削减算法也救不回来生成阶段就该严格把关。另外还有个特别容易被忽略的细节——MATLAB函数pdist和squareform之间的匹配问题。pdist返回的可能不是常规矩阵忘记调squareform索引时就会出错。代码里我习惯先用squareform明确转换宁可多写一行也不要在这里debug。5.4 削减前后结果展示与工程解读最后看一个我实际项目里的数字直观感受一下削减效果。初始1000个风电场景削减到10个代表场景。削减前每个场景权重按等权重计算削减后代表场景权重从0.03到0.25不等呈现出明显的集中趋势。期望出力这个关键指标削减前是187.3MW削减后是186.9MW偏差只有0.2%。在第95百分位的高出力情景削减前是482MW削减后是476MW偏差大概1.2%对规划决策来说完全可接受。而计算规模方面这10个场景的调度模型运行时间只有1000个场景的百分之一左右整个项目从通宵跑不完变成了半小时出结果。对比K-means聚类削减法同一组数据的期望出力偏差为1.8%95百分位出力偏差3.4%概率距离削减法在这些指标上确实有明显优势。原因也好理解——K-means对每个簇内的场景做均值合并这个过程天然会抹平极端值而概率距离削减法通过权重转移保留极端场景特征。6. 易混淆的边界情况与理论背景简述6.1 场景削减不是找最典型的几条曲线我见过不少初学者直接把削减理解成挑选几条最典型的出力曲线然后开始画聚类图。这是完全偏离了概率距离削减法的本质。概率距离削减法不是选代表曲线而是在控制概率信息损失的条件下寻找最优的子场景集来近似整个概率分布。目标函数是削减后场景集与原场景集之间的概率距离最小化这是严格的最优化问题不是简单的样本选择问题。这个区别直接决定了实现上的关键差异典型曲线法给每个场景分配相同的权重而概率距离削减法输出的每个场景都带一个概率值这些概率值在后续优化模型中是变量前的系数差距很大。6.2 削减后的场景概率如何正确使用削减后每个场景的概率权重不是统一的这一点在工程应用中最容易被埋坑。比如你用削减后的10个场景做随机规划如果还把每个场景概率当1/10用那算出来的期望值就完全错了。正确做法是场景概率权重直接作为随机变量的离散分布概率值进入目标函数的期望项。例如期望成本就是每个场景成本乘场景概率再求和。代码层面我们通常把概率权重作为输出参数返回然后把场景矩阵和概率向量一起传给后续优化程序。权重向量做归一化保证求和为1这一点无论如何检查一遍。6.3 关于概率距离理论的简短说明概率距离削减法的理论根源是最优传输论最严格的形式是Wasserstein距离。通俗理解就是把一个概率分布转换成另一个概率分布所需的最小转移代价是多少。在场景削减里转换代价就是场景之间的距离转移的质量就是场景的概率权重。概率距离削减法通过逐次合并最近邻场景对实际上是逐步构建了一个最小代价的传输方案让削减前后的概率分布差异尽可能小。理论部分不用太过深究但要记住一句底线的话任何场景削减方法都在做分布近似的权衡而没有绝对最优。工程实践中用一套好评价指标来验证削减效果比讨论理论最优更重要。提示做学术研究时建议参考文献里标注Kantorovich距离和Wasserstein距离的原始出处这个方向涉及运筹学和概率论的前沿交叉引用规范能显著提升论文的完整度。7. 扩展思路从24小时场景到多时段多区域联合场景7.1 多时段场景的扩展实践上面的例子聚焦于24小时出力场景。实际工程项目经常会用到更长的时间尺度比如含储能的微电网优化调度需要考虑3天甚至7天的连续出力序列含水电的风光水联合系统则需要周尺度场景。扩展到多时段时直接改T就行比如T72、T168。但有个新问题会出现场景时长拉长后两条时序的欧氏距离会变大距离矩阵数值整体抬高但这并不影响削减逻辑因为削减只看相对大小。另一个问题是场景生成时我们前面用的分块重采样法块长要对应场景时长加历史推进窗口否则生成的风速方差和相关性特征回失真。我用过这个方案效果还比较理想方法成立。7.2 多区域场景的联合削减再做复杂一点如果项目覆盖多个风电场或多个光伏电站每个区域都有出力时序削减维度就变成场景数乘区域数乘时段数。此时联合削减一个拼接的大场景矩阵维度是p×T×N假设有3个风电场、2个光伏电站拼接后行数是5×T距离矩阵的计算量上升但逻辑完全一致。实际项目我处理过最多13个风电场和6个光伏电站的联合场景削减初始2000个场景削减到30个在普通办公笔记本上运行时间在两三分钟量级。能跑通的根本原因是距离矩阵计算量只与场景数N的平方相关增加区域数只是增加每个分量的维度对距离矩阵规模影响很小。矩阵运算的向量化处理在MATLAB里天然支持如果写循环嵌套反而费时间。7.3 其他工程上有用的扩展方向我在后续项目里实际试过的两个扩展方向值得分享。一个是在削减过程中同时考虑日前和实时两个时间尺度的场景相关性做法是把两个时间尺度的场景拼接成联合向量再削减。这比先把日前削减后再对每个日前场景削减实时场景的做法好操作得多因为后者很可能因场景数量爆炸而难以落地前者则把耦合关系保留在距离计算里。另一个是用Copula模型替代简单的独立采样用于描述风速和辐照度之间的相关性。之前我们做的独立采样假设风速和辐照度无关实际场景中虽然相关性不强但确实存在一定统计依赖。Copula的好处是边缘分布和相关性结构分开建模先用经验分布拟合边缘分布再用Copula捕获变量间的相关性然后从联合分布里采样生成场景比直接拼独立采样的方法更贴近真实。有关Copula的MATLAB实现我会建议先用kcopulafit和copularnd这组函数把高斯Copula跑通再根据数据特征选择t-Copula或阿基米德Copula。从这里切入后续扩展空间很大。8. 写在最后的挑选建议针对这套方法把选型建议总结成一张表你在实际项目里可以直接查应用场景推荐方案原因初始场景数量200-1000只需风电逐次概率距离削减法实现最简精度高运行时间可接受初始场景数量2000-10000批量删除概率距离削减法速度大幅提升精度损失可控风电光伏联合分析拼接场景联合削减保留风光互补特性避免分开削减失真多区域大规模系统标准化后联合削减避免量纲差异扭曲距离计算极端场景重要性高的可靠性分析概率距离削减法极端场景强制保留防止极端工况被削减算法误删快速原型验证K-means聚类概率距离逐次削减做对比用两种方法交叉验证结果更稳这套方法我已经在风电场并网经济调度、光储联合优化、风光水火联合运行等好几个实际课题里验证过整体稳定性没问题。最后再分享一个个人实践总结场景削减的精度提升最大的杠杆不在削减算法本身而在初始场景的质量上。花40%的时间精修风速分布拟合和时序相关性建模比花100%的时间去打磨削减算法的各种变体要划算得多。先把生成的初始场景画出来对着实测数据看趋势对不对、幅值变化是否合理这一步我坚持做能阻止90%的后续无效工作。边界方面如果时间比较紧张直接用逐次概率距离削减法配合欧氏距离就够了等核心流程全部跑通再回去升级距离度量或引入批量删除加速也不迟。