1. 为什么风电、光伏的随机性必须靠场景来刻画做新能源并网分析或者电力系统优化调度的人大概率都碰过这样一个问题风电、光伏出力明明是一个随机过程但传统的确定性计算——取一个典型日、一套典型出力曲线、一组固定负荷——根本没办法反映真实运行中今天大风、明天无风、后天多云的剧烈波动。你拿一套固定数据算出来的结果可能只是一个数学上成立、实际上永远不发生的工况。所以工程上需要一个办法把这种随机性完整地搬进计算模型里同时又不能让计算量爆炸这就是场景生成与场景削减要干的事。把标题里的核心链路拆开看其实是四件事拉丁超立方采样——用尽量少的样本覆盖风电、光伏、负荷联合概率分布的全空间初始场景集构造——把采样得到的多维随机向量还原成有时间结构的风电、光伏、负荷出力序列K-means聚类削减——把几百上千个场景压缩成几个有代表性的典型场景同时保留原始概率信息不确定性分析——基于削减后的场景集做区间预测、风险评估或者随机优化得到带置信度的结论。这套思路在学术论文里经常被包装成基于LHS与K-means的场景生成与削减方法但在工程落地时卡住大家的往往不是算法本身而是那些论文里不会写的细节采样矩阵怎么构造、相关性怎么处理、聚类簇数选多少、削减后概率怎么算、典型场景怎么还原成时序曲线。这篇文章就把我从零搭建这套流程时踩过的坑和验证过的做法完整梳理一遍。需要说明一下这里我默认你的目标是生成一批能代表全年或典型日随机特性的场景拿去跑随机潮流、随机优化或者可靠性评估而不是单纯为了画几张漂亮的概率分布图。目标不同采样数和削减策略的取舍会差很多后面我会专门展开。2. 拉丁超立方采样用分层抽样的思路搞定多维随机变量2.1 为什么不用普通蒙特卡洛很多初学者上来就写蒙特卡洛对风电功率服从的分布直接随机抽样一万次每个样本算一次潮流然后统计结果。这个方法不是不行但有两个隐患。第一纯随机抽样会有聚簇效应——你可能抽到一堆很接近的样本点而某些概率密度高的区间反而抽得稀疏导致统计结果波动很大。一万个样本可能等效只有几千个独立信息量。第二如果你想做的是后续还要接聚类削减那么初始样本的质量会直接影响削减效果。初始样本本身分布不均匀聚类结果自然也不均匀。拉丁超立方采样的核心思路就一句话在每个变量的取值范围内均匀分层每层强制抽取一个点。假设你生成N个场景每个随机变量有M个维度那么LHS会把每个维度的区间等分成N层每个层里随机取一个代表点然后把各维度的点随机组合起来。这样无论N取多少每个变量的边缘分布都被均匀覆盖了一遍不会出现某些区间一个点都没有的情况。用一个简单的类比蒙特卡洛像是朝靶子上乱扔飞镖扔多了总能覆盖个大概拉丁超立方像是先把靶子画成N×N的格子每一行每一列都强制扔一枚飞镖覆盖的均匀性有保证。2.2 如何判断需要多少初始样本场景数量不是拍脑袋定的。我的常规做法是分两步第一步确定你要模拟的时间尺度。如果是全年8760小时的时序场景通常需要对风速、光照、负荷分别建模然后逐小时或逐日生成场景如果是典型日场景比如一天96个时段15分钟一个点那每个场景就是96维的时序向量。第二步根据随机变量的维度决定初始采样数。经验上有两个参考基准如果只有3~5个随机变量比如该小时的风速、光照、负荷初始场景数可以取200~500如果变量维度很高比如96时段的风电序列 96时段的光伏序列 96时段的负荷序列合计接近300维初始场景数至少要500甚至1000以上否则后续聚类时高维空间里样本点会非常稀疏。实际工程中我建议设置一个上下限下限150上限1000。低于150个场景做统计分析时置信度不够高于1000个场景在聚类阶段计算量会明显上升而削减收益开始边际递减。2.3 LHS的两种采样策略独立采样与相关性控制风电、光伏、负荷之间存在天然的相关性。比如风速大的时段通常光照也较强天气尺度效应晚高峰负荷高的时段光伏出力已经归零。如果你天真地认为三个变量互相独立分别独立采样再组合生成出来的场景可能就是大风、大太阳、低负荷这种现实中几乎不出现的组合拿去算潮流全是极端工况结果风险指标会严重虚高。所以在LHS的基础之上通常还需要做一步Cholesky分解或排序法控制相关性。具体流程是这样的先各自独立生成LHS采样矩阵每一列对应一个随机变量计算各变量之间的相关系数矩阵可以用历史数据统计得到对这个相关系数矩阵做Cholesky分解得到一个下三角矩阵把独立采样矩阵按照分解结果做线性变换使采样序列的相关性逼近目标相关系数。这一步的代价是会轻微破坏LHS的分层特性但换来的是场景之间的耦合关系更贴近现实。工程上普遍认为这个交换是值得的。如果你用Python做可以直接借助SciPy的qmc.LatinHypercube配合自定义排序或者干脆用现成的pyDOE2库里的lhs函数虽然它默认不处理相关性但可以配合cholesky类方法自己补一层变换。需要提醒的是不要试图对风电光伏负荷三组完整的96点时序直接做相关性控制。高维相关性矩阵的估计本身就不稳定Cholesky分解在高维下很容易失真。更稳妥的做法是先对每一时刻的三元组风速、光照、负荷做相关性采样再把采到的蒙皮套到典型日形状上形成完整时序。这个降维采样时序重建的思路是工程落地时最实用的。3. 从采样点到位序列如何构造风电、光伏、负荷场景3.1 三种变量的概率建模思路采样拿到了下一步是把这些随机数转换成物理上有意义的出力序列。这一步看起来简单但恰恰是整套流程里最容易出问题的地方——直接对功率做采样和先对气象变量做采样再通过功率曲线转换结果完全不一样。以风电为例。主流做法是对风速做Weibull分布拟合再用风机功率曲线把风速映射成出力。原因有两个一是风速本身服从偏态分布直接对功率拟合分布效果差功率的分布形态在不同风速区间差异极大二是风电功率曲线带有明显的非线性——切入风速以下出力为零额定风速以上出力钳位中间段则近似三次方关系。如果你直接用某个分布对功率采样就会把这些物理约束全部丢掉。光伏则是对光照强度做Beta分布拟合很多文献用Beta分布近似实际上晴空指数分布更准确再通过光伏组件的效率模型转换成出力。负荷更简单一些通常认为服从正态分布或对数正态分布且负荷的时序自相关性非常强——上午的负荷和下午的负荷高度相关这个相关性必须保留。所以我的处理流程分三层第一层对每个时刻t的气象/负荷变量建立边缘分布用LHS抽取原始样本第二层通过功率转换模型把样本转换为出力样本第三层利用历史典型日曲线作为形状模板把离散的采样结果还原成完整时序曲线。3.2 构造时序场景的两种模式实战中有两种常见的场景构造模式一种是逐点采样模式一种是整段平移模式。逐点采样模式适合短期分析比如未来24小时做法是每小时分别采样得到风电/光伏/负荷值直接拼成一条96点曲线。这样做的好处是灵活坏处是曲线会非常毛糙——前一小时大风后一小时无风时序上根本没有平滑过渡看起来完全不真实。整段平移模式更适合中长期分析做法是选取历史中N个典型日或者按照季节、天气类型分类把每个典型日作为基准曲线用LHS采样的结果去调整基准曲线的整体水平或局部波动幅度。这样生成的场景天然具备合理的时序相关性。我自己在项目中两种模式都用过结论是如果场景最终要接入优化调度模型必须用整段平移模式如果只是做静态的概率潮流逐点采样就够了。优化调度对时序平滑性极其敏感你给出的风电场景如果毛糙到一小时一个突变调度模型会为了应对这种虚假突变而把备用容量抬得很高结果就是经济性指标严重失真。3.3 场景图与概率标签场景构造完成后每一条时序曲线称为一个场景还要给每个场景标上概率。在LHS阶段每个场景的初始概率相等都是1/N。这个等概率信息在后面K-means削减时会用到——削减后的每个典型场景概率不再相等而是等于该簇内原始场景概率之和。很多人在这里容易出错后面第4节我会详细说。这一步结束时你应该手上有这样一组数据一个N×T的矩阵N是初始场景数T是时段数每行对应一个场景每列对应一个时刻所有场景当前等概率。如果此时画图你能看到N条密集的曲线簇风电、光伏、负荷各一张。接下来就是重头戏——怎么用K-means把它们缩减到可接受的数量。4. K-means聚类削减从几百条曲线到几个典型场景的完整实操4.1 为什么削减是必须的有了初始场景集之后按理说就可以做分析了。但在实际工程中几百上千个场景直接跑优化模型计算量会让人崩溃。举个例子一个含96时段、20台机组的随机优化模型如果接1000个场景变量规模会扩到接近百万级别求解时间从分钟级变成小时级。更麻烦的是很多分析需要人工检查每个场景的合理性场景太多根本看不过来。所以我们必须做场景削减保留少量有代表性的场景让它们的整体概率分布和原始场景集尽量接近。经典的方法有同步回代消除法又称快速前代消除法和K-means聚类法。同步回代消除法的思路是每次删掉一个与其他场景距离最近的场景同时把被删场景的概率累加到离它最近的保留场景上直到剩余K个场景。这个方法在概率意义上很干净但计算复杂度较高而且聚类形状是鱼骨形的容易把边界场景丢掉。K-means聚类法是把问题转化为把N个场景按距离分成K簇每簇取质心作为典型场景。这个方法实现简单、计算快、聚类结果直观工程上接受度非常高。4.2 K-means在这里和通用K-means的差异这里我有一个很强烈的建议不要直接调包跑标准K-means。标准K-means在聚类坐标点时没问题但直接用在时序场景上有一个致命缺陷——它把你所有的时段维度等权看待。这会导致聚类结果被波动幅度大的时段主导而平缓但重要的时段比如晚高峰负荷被无视。举例说明风电场景中凌晨时段风速波动剧烈K-means会努力把凌晨时段分得很细致因为它对这个维度的方差贡献大但白天时段风速稳定样本间的差异小K-means懒得细分。如果这些场景最终用于经济调度白天时段的准确性反而可能更重要于是结果就跑偏了。我有两种处理方式视情况选用方式一特征降维后再聚类。不要直接对96维的时序曲线聚类而是先提取其特征量——比如峰值、谷值、平均出力、最大爬坡率、出力持续时间等把每条曲线压缩成5~10个特征然后在特征空间做K-means。这样既大幅降低了维度灾难的影响又让聚类聚焦在真正影响决策的特征上。方式二分段加权聚类。如果不想用特征必须直接对时序聚类那么给每个时段加上业务权重。比如对于含光伏的系统白天时段权重提高晚高峰时段权重提高凌晨低谷时段权重降低。具体做法是把原始数据乘上权重再标准化然后进K-means。两种方式都可以我通常优先用方式一因为特征提取后还能顺便做可视化向项目组汇报时更直观。4.3 聚类过程中的关键细节标准化处理。风速、光照、负荷数值量纲不同风电出力单位是兆瓦负荷单位可能也是兆瓦但数值大好几倍如果不做标准化K-means的欧氏距离会被负荷主导。建议对每个特征/时段分别做Min-Max或Z-score标准化。需要注意这个标准化参数必须基于全部初始场景集计算不能基于场景子集否则会引入偏差。距离度量。常用的欧氏距离在很多场景分析里并不是最好的选择。我实测下来动态时间规整DTW距离对时间序列的形态相似性更友好允许曲线发生小幅时间偏移时仍被判为同一类。但是DTW距离计算成本高场景数量上千时会非常慢。折中方案是先用欧氏距离跑一次K-means得到粗分簇再在每簇内部用DTW做二次修正。这个两阶段思路在工程中很实用。簇数的选择。这是所有初学问题里问得最多的问题。K-means的簇数没有标准答案但有一套可复用的评估策略评估指标适用情况使用建议肘部法则SSE快速初筛画SSE随K变化的曲线找拐点轮廓系数判断簇间分离度一般取轮廓系数峰值附近削减前后概率分布偏差业务验证比较削减前后关键指标如期望出力、P90值的偏差偏差小于5%即可接受下游模型灵敏度终极验证把不同K值下的场景集分别喂给优化模型看目标函数变化是否收敛我个人的经验是K的取值通常在5~15之间具体取决于你的业务需求。如果你需要分析极端小风电和极端大光伏这两种风险场景K至少要有8~10否则不同极端场景会挤在同一簇里被平均掉类型特征就消失了。反之如果你只关心期望值K5甚至K3就够了。4.4 削减后概率到底怎么算削减弱算过程中最容易被忽略的是概率归一化。整个计算逻辑如下初始场景i的概率为p_i1/NK-means把所有初始场景分到K个簇第k个簇里包含n_k个场景第k个典型场景质心的概率为P_k Σ_{i属于簇k} p_i所有P_k之和应该等于1如果有浮点误差就归一化一次。这里有个隐含假设同一簇内所有场景在概率意义上是可替换的。实际是否成立取决于聚类质量。如果某个簇内的场景差异还很大说明K取小了需要回头调大K。我还见过一种做法是按距离加权离质心近的原始场景保留更多的概率贡献远的贡献更少。这在理论上是更精细的近似但工程上会造成概率解释复杂化多数论文和项目都直接采用等概率累加法。等概率累加的误差通常在可接受范围内除非你的场景分布特别畸形。我一般只在风资源极端的地区比如台风频繁的沿海才考虑距离加权修正。5. 削减后的不确定性分析从典型场景到靠谱结论5.1 场景集如何支撑不确定性分析场景削减不是终点削减出来的场景集是要拿来回答业务问题的。最常见的三类问题是区间预测类未来某时刻风电出力的90%置信区间是多少风险评估类系统在什么场景下会出现备用不足或者线路越限优化决策类考虑随机性之后最优先的机组组合方案是什么削减后场景集的价值在于每一个典型场景配一个概率你可以把任何确定性的分析工具潮流计算、调度优化、可靠性评估在每个典型场景上各跑一遍然后按概率加权汇总结果。这比单调地取期望值可靠得多——你既能看到平均情况也能看到最坏情况发生的概率。5.2 置信区间的计算方法假设你需要给出风电出力的区间预测操作如下对削减后的K个场景在每个时段t都有一组出力值P_1(t), P_2(t), ..., P_K(t)按每个场景的概率P_k对这些值排序概率加权分位数而不是简单排第几个想要90%置信区间的下界就找累积概率到达5%时对应的出力值上界就找累积概率到达95%时对应的值。需要注意概率加权分位数和普通分位数在场景数少时差异很大。如果你直接对K个值排序然后取第5%和95%分位点等于默认所有场景等概率在K5时会得到非常粗糙的结果。正确做法是把每个场景的概率当成权重加权累积。这里我贴一段计算概率加权分位数的核心伪代码实际项目里可以直接用import numpy as np def weighted_quantile(values, probs, q): # values和probs按同样的顺序排列 order np.argsort(values) sorted_values np.array(values)[order] sorted_probs np.array(probs)[order] cumprob np.cumsum(sorted_probs) # 归一化防止浮点误差 cumprob cumprob / cumprob[-1] return np.interp(q, cumprob, sorted_values) # 示例某时刻削减后有6个场景出力值分别为... scen_values [120, 340, 210, 80, 450, 260] scen_probs [0.25, 0.10, 0.30, 0.15, 0.05, 0.15] p90_low weighted_quantile(scen_values, scen_probs, 0.05) p90_high weighted_quantile(scen_values, scen_probs, 0.95)这个函数几乎可以套用到任何场景集 概率集的组合上用来算风电/光伏/负荷的任意置信区间都通用。5.3 风险评估的核心指标设计如果是风险评估光给置信区间不够最好定义一两个可解释的业务指标。我常用的两个指标场景越限概率在所有削减场景中出现某线路潮流越限或备用容量不足的场景累积概率之和。这个指标直接回答问题发生概率有多大。期望越限严重度把每个越限场景的越限量乘上该场景概率再求和得到期望越限量。这个指标回答如果出问题严重程度多大。这两个指标配合起来就是一套完整的不确定性分析结论。比如你可以对调度员说未来24小时内系统有15%的概率出现旋转备用不足最严重情况下备用缺口达120MW最可能出现的时段是晚间负荷高峰。如果你做的是风光水储联合优化调度场景削减后的概率信息还能直接转化为随机约束条件。例如把备用容量必须覆盖所有场景这类硬约束写成覆盖概率不低于95%的机会约束这样优化模型既能保证可靠性又不会过度保守。这一步是场景法在工程中发挥作用最关键的一环——从描述不确定性走向决策应对不确定性。5.4 削减误差评估怎么判断结果可不可信任何人都会问削减完以后我的结论可靠吗不能只看削减后的曲线好不好看要定量验证。我的标准验证流程有三步第一步分布对比。削减前所有场景在某时段的出力累积分布函数CDF和削减后加权CDF画在同一张图上计算两者之间的最大垂直距离类似K-S检验的统计量。如果最大距离小于0.05~0.08说明削减质量不错。如果大于0.1就得考虑增加K值或者换距离度量。第二步统计量对比。分别计算削减前后的期望值、方差、5%分位点、95%分位点做表格对比。期望值的偏差一般要控制在2%以内分位数偏差可以宽松到5%。第三步下游结果对比。拿削减前后的场景集分别跑同一个优化模型或者潮流计算对比目标函数或者关键潮流结果的偏差。如果偏差小于工程接受阈值比如经济调度总成本的偏差小于1%那就说明这个K值是够用的。第三步是最有说服力的因为场景削减的最终目的不是让曲线长得像而是让决策结论一致。我遇到过一个案例削减前后曲线的CDF对比很好但跑经济调度时总成本差了6%进一步排查发现是因为聚类把小风电高负荷这类关键场景和中等风电中等负荷合并了导致备用配置偏低。这充分说明不能只看统计距离必须做下游验证。6. 完整流程的工程落地代码框架与参数整定心得6.1 一套可复用的处理流程综合前面各部分我的完整流程是这样的历史数据准备获取至少一年的风电、光伏实测出力数据和负荷数据清洗异常值统一时间分辨率概率建模根据数据分布特性为风速拟合Weibull分布或根据实测数据使用非参数核密度估计光照用Beta分布或晴空指数分布负荷用正态分布相关性估计用历史数据估计风电-光伏-负荷之间的相关系数矩阵并做显著性检验——很多相关系数实际上不显著不用强行控制LHS采样设定初始场景数N通常取200~500生成多维相关样本时序重建结合典型日曲线模板将样本转换为完整时序场景特征提取对每条时序曲线提取特征压缩维度K-means聚类基于标准化特征做聚类用肘部法则轮廓系数选择初始K再用削减误差评估工具修正K概率计算按簇内场景数等概率累加得到每个典型场景的概率不确定性分析基于加权分位数公式计算置信区间基于场景概率计算越限概率和期望越限严重度。6.2 参数设置的工程建议这里我把几个关键参数的建议值整理成一个表格方便照抄到自己的项目里参数建议范围依据初始场景数N200~500保证边缘分布覆盖度与聚类稳定性聚类簇数K5~15兼顾典型性与下游模型计算量标准化方法Z-score对不同量纲变量统一处理距离度量欧氏距离快速/ DTW精确优先欧氏必要时二阶修正时序时段数24小时/ 9615分钟取决于分析精度与调度周期置信区间概率90%覆盖极端情况又不至于太宽这些参数不是死的。如果做的是日前调度96时段太细可以聚合到24时段如果做的是规划层面的可靠性评估场景时段可以拉到8760小时但因为维度过高聚类前务必做特征压缩。6.3 我踩过的三个大坑坑一忽略了风电出力的截断特性。风速的Weibull分布拟合看起来拟合得很好生成的风速样本也没有问题但通过功率曲线映射后大量风速样本落在切入风速以下出力直接为零或者落在额定风速以上出力封顶。结果就是初始场景里成片的零出力场景聚类时被归为一簇这一簇概率巨大典型场景是一条接近零的低出力曲线。这不是算法问题而是物理约束的要求——在处理之前就要预料到风电出力的分布一定是在0和额定功率处有质量堆积的。解决办法在对风速拟合分布之前先用历史数据统计出停机概率和满发概率把这两块概率单独建模剩下的部分再用连续分布拟合。坑二K-means对初始质心敏感。K-means的结果依赖初始质心位置不同的随机种子可能给出不同的聚类结果。我刚开始做的时候固定N和K换一个随机种子跑出来的场景削减概率分布偏差居然差了3倍。后来我在代码里固定了随机种子同时用了k-means初始化方法问题才缓解。更进一步的做法是跑多次聚类比如20次取轮廓系数最好的一次作为最终结果代价是计算时间增加但对K只有10以内的情况完全负担得起。坑三概率加权的浮点累积误差。场景概率累加后理论上等于1但浮点计算经常出现0.9999999或1.0000001的情况。如果直接把这样的概率带进优化模型可能出现约束条件轻微失配。解决方法是每次计算完场景概率后强制做一次归一化再四舍五入到保留四位小数。6.4 代码组织上的建议工程上我建议分模块写不要把所有逻辑塞进一个脚本里。我的项目目录大概长这样scene_generation/ ├── data_loader.py # 历史数据加载与清洗 ├── distribution_fit.py # 概率分布拟合与检验 ├── lhs_sampler.py # 拉丁超立方采样与相关性控制 ├── scenario_builder.py # 时序场景重建 ├── kmeans_reduction.py # 特征提取K-means削减 ├── uncertainty_analysis.py # 置信区间与风险评估 └── main.py # 主流程编排这样的好处是每个模块可以单独测试。尤其是distribution_fit.py和lhs_sampler.py它们出错时症状不会立刻暴露往往要到聚类结束才看出来——这时候排查成本已经很高了。分模块写可以早早上层模块单测避免后期连锁返工。7. 什么时候这套方法会失效边界条件与替代方案7.1 小样本场景不适用如果历史数据只有几个月甚至只有几十天的有效出力记录那么概率分布拟合本身就不稳定LHS采样的优势发挥不出来。这时候我建议考虑非参数方法——直接用历史观测值作为初始场景跳过分布拟合这一步用重采样Bootstrap的方式扩充样本。虽然理论规范性差一些但至少不会把错误的分布假设带进模型。7.2 高维强非线性问题时K-means力不从心K-means假定簇是凸形的对于风电、光伏出力的多模态、非凸联合分布它可能把两个物理上完全不同的运行模式比如台风天和静稳天强行合并。如果你的场景分布呈现出明显的非线性流形结构可以考虑用高斯混合模型GMM或者谱聚类替代K-means。GMM的好处是每个簇可以给出协方差信息后续做抽样也更自然。代价是调参复杂度上升而且GMM在高维下更容易过拟合。7.3 时序强相关的场景要优先考虑自相关约束当场景的时间跨度长、随机过程的记忆效应强比如连续多日的天气过程普通的LHS采样会把逐日相关性切断——第1天大风、第2天大风、第3天平静这在现实中可能存在但第1天平静、第2天大风、第3天再次平静这个两段式过程的可能性也应该被体现。如果完全不考虑时间相关性削减后典型场景可能都是模式单一的类型。改进方案是在LHS采样前先对时间序列做ARIMA或马尔可夫过程建模把时间相关性作为采样约束条件加进去。这个做法更复杂但在做月度和季度级随机生产模拟时极有价值。7.4 场景削减后的场景漂移问题聚类削减本质上是信息压缩压缩就必然有损失。当原始场景集中存在小概率但严重后果的极端事件比如极端高温导致负荷尖峰风电零出力光伏高发这类事件如果是独立的孤立点K-means很可能把它当噪声并入邻簇。如果你很在意这类极端场景保留有两个办法一个是混合法——先单独筛选出所有尾部风险场景比如出力落在分布5%以下的场景强制保留为独立簇再对其余场景做K-means。这样既保证极端事件不丢失又不干扰常规场景的聚类质量。另一个是分层抽样法——把场景按季节/天气类型分层每层单独做聚类最后合并。这在风资源季节性差异大的地区非常有效比如北方冬季和夏季的风电出力特性几乎完全不同混在一起聚类会把过渡季节场景丢掉。我在西北地区某风电场做项目时就被这个问题坑过。当时把所有季节混在一起聚类K8的聚类结果里居然找不出一个冬季大风典型场景因为冬季场景数量占比不高都被并进了其他簇。后来改成季节分层聚类每个季节单独出3个典型场景12个场景完整覆盖了全年特征。所以如果你处理的数据存在明显的季节性或者天气分型强烈建议先分型再聚类。8. 从复现到应用的最后一公里工程化需要注意的事前面讲的都是方法本身但在真实项目中做完技术正确还不够还有几个工程层面的细节直接决定了这套工具能不能用起来。8.1 场景结果必须可视化做过工程项目的人都有体会给业主单位或调度运行人员汇报时一组数字表格远不如一张图有说服力。我通常输出三类图削减前后场景对照图左图是初始场景的灰色细线簇右图是削减后的彩色典型场景每个场景线宽对应概率置信区间走廊图风电、光伏、负荷各自的P10-P90区间带在图上形成一个走廊业务人员看一眼就知道波动范围概率加权分位数表把关键时段如早晚负荷高峰的P5、P50、P95列一个表配合图使用。8.2 随机种子与可复现性场景生成方法的随机性很强如果不锁定随机种子同样的历史数据每次跑出来的场景削减结果都会略有不同。这在研究阶段问题不大但工程验收时风险很大——几天前汇报的场景结果现在重新跑一遍变了业主大概率会质疑方法的可靠性。所以代码里所有涉及随机数的环节LHS内的分层随机、K-means的初始质心、正态噪声注入等都要设定固定种子。我的习惯是在主配置文件中定义全局随机种子并把它作为参数记录到结果输出日志里。这样任何一次结果都可以追溯到完整的生成条件。8.3 场景集要有版本管理最后一个小经验场景集是中间产品但它影响下游所有计算的结论所以一定要做版本管理。我的做法很简单把生成时间、随机种子、初始场景数N、簇数K、数据版本、程序版本等全部元信息写进场景文件的命名或属性中。例如文件名可以类似scen_wind_K8_N500_seed42_v2.nc这样后续回溯问题或者对比不同参数的影响时一眼就能看出差异来源。这个习惯帮我避免过很多次这个结果是用哪套参数跑出来的的尴尬问题。如果你把这些细节都处理到位整套拉丁超立方K-means场景生成方法在工程中的价值会成倍放大——它不再是一个飘在论文里的方法而是一个真正能支撑日常决策分析的工具。
