ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

蒙特卡洛+Copula+FCM分时电价下电动汽车配电网调度优化

蒙特卡洛+Copula+FCM分时电价下电动汽车配电网调度优化 去年第一次看到这个课题思路时我的第一反应是这不就是把“蒙特卡洛”“Copula函数”“FCM聚类”“分时电价调度”这些工具拼在一起做个配电网调度优化吗真正动手之后才发现每一个环节单独拎出来都不难难的是把它们按正确顺序串起来并且让每两个环节之间的数据接口不打架。这篇内容主要面向正在做电力系统方向课题的研究生、做配电网调度或充电站运营的工程师也适合那些想从确定性调度转向随机优化但不知从何下手的同行。我会按照“问题拆解—方法实现—模型构建—求解流程—避坑经验”的顺序把整套逻辑讲清楚最后给出我实际跑代码时最值得注意的几个细节。1. 问题拆解为什么这个调度问题非得绕这么多弯1.1 表面上是费用优化核心难点是“不确定性怎么处理”先把这个课题的本质说透。所谓“多类型电动汽车采用分时电价调度”不是简单让电动汽车充放电就行而是在一个含有风电场、光伏电站、上级电网、多座充电站、大量不同类型电动汽车的配电网里做一天24小时甚至更长时间的日前调度决策。决策的结果是每一小时各台机组出多少电、联络线从上级电网买多少电、每座充电站让电动汽车充多少放多少。这些决策必须满足安全约束同时让总费用尽量低。问题在于风电出力、光伏出力和电动汽车的到达时间与充电需求都是随机量。你如果只用预测值做确定性优化那么某一天实际出力比预测低、或者电动汽车集中到达调度方案就会失效出现功率缺口或电压越限。反过来如果你用最保守的场景做“鲁棒优化”系统永远在给最极端情况预留调节能力经济性又会差很多在峰谷差本来就比较大的地区尤其吃亏。随机优化的思路是把不确定性表示成一组离散场景每个场景对应一个概率然后优化目标变成“在这组场景下总期望费用最小”。这里就出现了两个工程问题。第一随机变量不是独立存在的风和光在同一区域往往有相关性简单独立抽样会得到很多实际中根本不存在的“强风同时强光”组合第二蒙特卡洛抽样动辄上千个场景直接塞进优化模型会导致变量和约束爆炸根本没法求解。于是就有了“Copula函数”和“FCM聚类”这两层处理的立足点。1.2 为什么风光出力不能“各抽各的”相关性问题必须由Copula来建模我第一次做这个课题的时候犯过一个印象深刻的错误用蒙特卡洛抽样时风速从威布尔分布抽、光照从Beta分布抽然后直接拿去算风电功率和光伏功率。结果生成的一千个场景里有相当一部分是“大风速强光照”同时出现。表面上看没什么但把这些场景扔进调度优化后系统会以为风光互补性很差、可调节压力很大实际上同一地区的风光出力往往存在明显的负相关。比如江南梅雨季光照弱但风速相对大夏季晴热天光照强但风可能很小。把这种相关结构忽略掉生成的场景就不“像”真实天气后续优化出来的调度方案自然缺乏参考价值。Copula函数解决的核心问题是把每个随机变量的边缘分布和变量之间的相关性结构分离开来建模。你可以先用历史数据拟合出风速、光照各自的边缘分布然后用Copula去描述它们之间的“联结方式”。这样抽出来的随机数组合既保留了各自分布的形状又还原了变量之间的相关关系。Copula的价值就是两个字联结。它像一个接头把两个独立变量的边缘分布焊在一个联合分布框架里而且不用假设它们的联合分布是常见的多元正态或多元指数分布自由度大很多。实际建模时风、光、负荷三个随机量如果都要建模通常的做法是构建三维Copula。不过三维阿基米德Copula选择空间比较小t-Copula在高维场景下更灵活因为它的相关性矩阵可以自由设置自由度参数又能兼顾尾部相关。这一点在做三维或者更高维联合建模时特别重要。1.3 典型场景缩减为什么选FCM而不是普通K-means蒙特卡洛抽完场景后关键步骤到了要把上千个场景缩减成6个典型场景。为什么要缩减因为调度优化模型里每一个场景都会把决策变量和约束条件复制一份场景越多模型规模越大。1000个场景的MILP问题Gurobi也未必能在可接受时间内收敛。把场景压缩到6个模型规模会从“不可能求解”变成“几分钟出结果”。那为什么选模糊C均值聚类Fuzzy C-Means, FCM而不是K-meansK-means属于硬聚类每个原始场景要么属于A簇要么属于B簇边界上的场景被强制归到某一个簇然后取簇内平均代表场景容易失真。风、光、负荷这些天气过程是连续渐变的一个场景兼有“类A特征”和“类B特征”其实很正常硬划分丢失了这种过渡信息。FCM给每个场景分配一组隶属度比如某个场景属于簇1的隶属度是0.7、属于簇2的隶属度是0.3这样算出来的聚类中心更像是对连续分布的合理近似。另外6这个数字不是拍脑袋定的。做课题时通常要跑一轮聚类有效性分析从聚类数2试到10分别计算轮廓系数、Xie-Beni指数、模糊划分系数再结合工程经验确定最优聚类数。题目里取6个典型场景在工程上是比较常见的折中——太少覆盖不了风光出力的多种形态太多又会让优化模型变成“大块头”。不过具体取几个最终还是要看你所在系统的实际气象与负荷特征。2. 方法核心蒙特卡洛、Copula、FCM逐个实操拆解2.1 蒙特卡洛模拟抽什么分布、抽多少次、怎么抽蒙特卡洛在这套流程里的任务是根据随机变量的概率分布生成足够多样化的初始场景。最常用的三个分布是这几类。风速一般用两参数威布尔分布Weibull概率密度为[ f(v)\frac{k}{c}\left(\frac{v}{c}\right)^{k-1}\exp\left(-\left(\frac{v}{c}\right)^k\right) ]这里(k)是形状参数控制风速分布的形状(c)是尺度参数控制平均风速大小。参数一般用历史风速数据做极大似然估计得到。光照强度常用Beta分布因为它的定义域在([0,1])之间正好对应光照强度的归一化标幺值[ f(x)\frac{1}{B(\alpha,\beta)}x^{\alpha-1}(1-x)^{\beta-1} ]负荷预测误差一般假设服从正态分布但要注意均值是零、标准差按历史预测精度确定。这三类随机变量是整套随机优化的“原料”。抽样次数的选择直接关系后续聚类质量和计算开销。经验上1000次是下限2000到5000次是常用区间。抽太少一些低概率但高影响的极端场景根本不会被覆盖到聚类出来的6个典型场景会“偏乐观”抽太多虽然全面了但每一次场景都要计算联络线功率、网损聚类迭代也会更慢。我自己习惯的做法是先抽2000次试跑检查聚类后典型场景的均值、方差是否和全量场景集基本一致如果偏差大就加到3000或5000次。还有一个细节是关于逆变换抽样。如果直接用randn生成正态随机数再模拟某个分布其实生成的是独立随机数。要做带相关性的抽样需要先用Copula生成相关均匀分布随机数再通过各自边缘分布的逆CDF映射回去。顺序不能反否则相关性结构会被破坏。2.2 Copula联合分布建模家族选择、参数估计与相关性校验Copula函数的本质是一个连接函数把多个边缘分布“拼”成一个联合分布。常用家族大致分两类。一类是椭圆型Copula包括Gaussian Copula和t-Copula它们基于多元正态分布和多元t分布构造支持任意维度和任意相关矩阵。另一类是阿基米德Copula常见的有Clayton、Gumbel、Frank等它们定义简单而且擅长描述某一种尾部相关关系。Clayton Copula对下尾相关敏感适合描述“极端低出力同时发生”的场景Gumbel Copula擅长上尾相关适合描述“极端高出力同时发生”的场景Frank Copula则适合对称的相关结构。实际做课题时你不会事先知道该用哪个所以通常的做法是把几种候选Copula都拟合一遍用AIC或BIC选一个最优的。完整的Copula建模流程按常见实践大致是这样的。第一步用历史风速、光照、负荷数据分别做核密度估计得到各自的边缘累积分布函数把原始观测值转换成([0,1])区间的“伪观测值”。第二步把伪观测值代入候选Copula用极大似然估计求参数。第三步用AIC/BIC比较各Copula家族选出拟合优度最好的。第四步用Copula生成相关随机数再逆变换回原始物理量的量纲用于后续蒙特卡洛场景生成。这一步我特别想提醒一个坑如果你直接用原始风速和光照数据去拟合Copula相关系数有时候会得到一个很高的相关值然后生成场景后发现不合理。原因可能是你把风速、光照之间的非线性相关和线性相关混在一起了。Copula更适合描述秩相关Kendall’s tau、Spearman’s rho而不是Pearson线性相关。所以在做参数估计前最好先算一下历史数据的Kendall’s tau这能帮你判断Copula拟合结果是否异常。2.3 FCM聚类目标函数、关键参数与代表场景提取模糊C均值聚类的目标函数是[ J\sum_{j1}^{N}\sum_{i1}^{C}u_{ij}^m \cdot d^2(x_j, c_i) ]其中(u_{ij})表示第(j)个原始场景对第(i)个聚类中心的隶属度满足每行之和为1(m)是模糊指数控制聚类模糊程度(d(x_j,c_i))是场景与聚类中心的欧氏距离。迭代过程就是反复更新隶属度矩阵和聚类中心直到目标函数变化量小于阈值。关于参数这里给出我验证过比较稳定的组合模糊指数(m)取2这是最经典的选择小于1.5聚类会偏硬、大于3聚类会过于模糊容易把所有场景都揉成一团迭代次数上限设100到300次终止阈值设1e-5或1e-6初始聚类中心建议先用K-means跑一遍得到一组初值再进入FCM迭代能显著降低随机初始化导致的局部最优问题。聚类完成后提取典型场景时有两点值得注意。第一每个簇要统计原始场景的个数占比作为该典型场景在随机优化中的概率。第二每个典型场景本身怎么取值很多实现是直接对簇内所有原始场景求算术平均这在簇内场景分布比较紧凑时问题不大但如果簇内场景跨度大算术平均可能对应一个“中庸但现实中不存在”的天气形态。更稳妥的做法是在簇内寻找一个离聚类中心最近的原始场景把它作为代表场景。我个人经验是先用最近原始场景方案跑一版再用加权平均方案对比一次看对调度结果的影响大不大如果不大就用最近原始场景因为它在物理上更“真实”。3. 优化模型与费用项细化3.1 目标函数里六类费用每项到底在算什么把目标函数拆开看一共六块费用每一块都有明确的物理意义。第一块上级电网购电费用。昨天到电网调度的时间尺度上上级电网出力体现为联络线功率即配电网从主网购电的功率。这块费用等于联络线功率乘以分时购电价再积分求和。别小看这项它通常是总费用的绝对大头所以调度方案首先要保证的就是尽量在电价低的时段买电。第二块峰谷差惩罚费用。它的存在是为了避免电动汽车都挤在同一个时段充电形成新的负荷尖峰。具体计算时通常是对优化后的净负荷峰谷差超过某个目标值或基准值的部分乘一个较大的惩罚系数。这个系数的大小很影响结果设得太小削峰填谷效果不明显设得太大可能把所有场景都拉成一条几乎平直的负荷线反而牺牲经济性。第三块风光调度费用。在含高比例可再生能源的配电网中这一项一般理解成弃风弃光的惩罚成本或者风光出力的调节成本。因为电网能消纳的风光容量有限当某个场景下风光出力过大系统不得不削减一部分出力削减掉的电量要按一定单价计入成本。这一项直接决定调度方案“敢不敢”让风光多发电。第四块电动汽车负荷调度费用。这块要看你站在谁的视角建模。站在配电网调度中心视角它是引导EV参与充放电的激励成本比如给在谷时充电、峰时放电的用户补偿站在充电站运营商视角它还包含电池损耗成本、运维成本。多类型电动汽车私家车、出租车、公交车的电池容量、充放电功率上下限、可调度时间窗口各不相同费用项也要按类型分别统计。第五块网损费用。配电网线路上的功率损耗按购电电价折算成费用。这块数值一般比前几项小但它跟潮流分布强相关能反映调度方案对网络拓扑的友好程度。如果忽略了网损费用优化结果可能出现线路重载但整体费用依然很低的情况。把这些项加在一起目标函数的标准形式是[ \min \sum_{s1}^{6} p_s \left( C_{grid,s} C_{peak,s} C_{res,s} C_{ev,s} C_{loss,s} \right) ]其中(p_s)是第(s)个典型场景的概率整个目标函数是在随机场景下的期望总费用。注意这个形式是通用框架具体到你的课题根据“什么场景下哪些费用成立”还要做场景展开处理。3.2 随机优化里的场景概率到底怎么用随机优化不是“每个场景单独求解一次再把结果加权平均”那么简单。正确做法是把所有典型场景放进同一个优化模型让决策变量要么对全部场景都成立第一阶段决策、要么按场景调整第二阶段决策并通过概率加权进入目标函数。简单说第一阶段决策是“看到实际风光和EV需求之前就必须定的”比如日前签订的购电合同、分时电价的时段设置第二阶段决策是“每个场景实现之后才能确定的”比如实际充放电功率、实际弃风弃光量。把场景概率和决策变量展开到目标函数和约束条件里模型会自动在“经济性”和“安全性”之间找平衡。高概率场景的权重高优化结果自然优先照顾它们低概率极端场景至少不能越限这就保证了方案的可行性。实际建模时如果不做两阶段区分也可以把所有决策都当作第二阶段决策直接展开6个场景。这种做法在模型规模可控时是没问题的尤其适合刚上手时验证逻辑。但要清楚它的实质是让调度员在每个场景都能做完全不同的决策这和日前调度“提前一天定方案”的现实约束不完全一致。正式课题里建议至少区分“日前固定变量”和“实时调整变量”两组。3.3 分时电价如何引导电动汽车参与调度分时电价在这个模型里扮演的是“价格信号”的角色。它的基本逻辑是把一天分成峰、平、谷多个时段不同时段电价不同。电动汽车用户是理性的会倾向于在谷时充电、避开峰时充电如果配合V2G电动汽车向电网放电机制用户在峰时放电还能获得卖电收益。模型里怎么体现用户的这种响应一种做法是建立价格弹性模型EV充电需求随着电价升高而下降另一种做法是把用户充电费用直接写进目标函数调度中心在总费用最小的目标下自发选择让EV在谷时多充、峰时少充。题目中“电动汽车负荷调度费用”指的就是调度EV产生的成本而分时电价通过改变这个成本项的大小来引导EV的行动。峰谷差惩罚费用则作为第二道防线防止EV全部挤在同一个谷时段充电造成“峰谷倒挂”。实操中分时电价时段设置很关键常见方法是以负荷预测曲线和风光出力预测为依据划分峰、平、谷。峰值时段电价高、谷值时段电价低这个价格差要足够大才能让EV用户有动力响应。但价格差也不是越大越好过大的峰谷价差可能导致大量EV集中在深夜充电形成新的“峰谷差转移”问题。3.4 约束条件的取舍与简化思路目标函数之外约束条件直接决定模型是否可解。这里列一下常用约束以及我个人的简化建议。功率平衡约束是硬约束每个场景、每个调度时段都必须满足表达式是“上级电网出力 风电出力 光伏出力 EV放电功率 常规负荷 EV充电功率 网损”。上级电网传输功率有上下限对应联络线容量。风光出力约束是出力不能超过当前场景下的可用功率上限也就是弃风弃光不超上限。EV相关约束最复杂充电功率上下限、放电功率上下限、电池SOC状态转移、SOC上下限、以及“同一时刻不能同时充放电”的互斥约束后者需要引入0-1变量直接决定模型是MILP还是LP。对于“多类型电动汽车”我强烈建议先按类型聚合成几组可调度资源而不是逐台EV建模。比如1000辆私家车如果逐台建SOC变量变量数会爆炸。合理做法是同一类型的EV在某个时段内聚合用聚合功率上下限和聚合SOC描述虽然丢失了一些个体差异但对日前调度的结果影响很小求解速度却能提升一个量级。题目的核心目标是研究分时电价策略和随机场景的作用不是研究EV用户行为细节这个简化是值得做的。4. 模型求解与MATLAB实操流程4.1 完整实现流程从历史数据到调度结果整个项目的实现流程按顺序可以拆成八个步骤。第一步收集历史风速、光照、负荷数据做预处理和异常值剔除。第二步拟合各随机变量的边缘分布。第三步用Copula对多变量相关结构建模并完成参数估计与优选。第四步用蒙特卡洛抽样生成初始场景集一般1000到5000个。第五步用FCM聚类得到6个典型场景和对应概率。第六步搭建目标函数与约束条件。第七步选择求解器并求解。第八步对结果做分析包括各场景下的费用明细、EV充放电曲线、负荷曲线峰谷差变化等。在这个流程里第五步和第六步之间的接口最容易出错。聚类输出的是每个典型场景下每个时段的风电功率、光伏功率、常规负荷值而优化模型需要的输入格式是按“场景×时段”组织的矩阵。接口没对齐后面的模型全是白搭。我自己的做法是聚类完成后立即做一次数据维度校验打印出[场景数 × 时段数]的矩阵再进入模型搭建。4.2 关键MATLAB实现代码骨架下面给出三个关键步骤的代码骨架基于MATLAB 统计工具箱实现求解部分用YalmipGurobi这是这类课题最常见的组合。Copula抽样部分的核心操作以t-Copula为例% 假设 hist_wind 和 hist_solar 是历史风速、光照序列 % 1. 用核密度估计得到边缘CDF u_wind ksdensity(hist_wind, hist_wind, function, cdf); u_solar ksdensity(hist_solar, hist_solar, function, cdf); % 2. 用伪观测值拟合 t-Copula U [u_wind, u_solar]; [rho, nu] copulafit(t, U); % 3. 生成 2000 组带相关性的随机数 R copularnd(t, rho, nu, 2000); % 4. 逆变换回原始物理量 wind_samples icdf(hist_wind, R(:,1)); solar_samples icdf(hist_solar, R(:,2));这里copulafit返回的是相关性矩阵rho和自由度nucopularnd生成的是在([0,1])区间服从Copula联合分布的随机数最后用核密度估计得到的逆CDF映射回实际风速、光照值。如果要用Gaussian Copula把t换成Gaussian即可但没有尾部参数nu。FCM聚类部分MATLAB自带的fcm函数位于模糊逻辑工具箱可以直接调用% scenarios_matrix 是 2000 x 72 的矩阵每行是一个场景72 24小时 * 3类随机变量 [centers, U] fcm(scenarios_matrix, 6, [2, 100, 1e-5]); % 计算每个簇的原始场景占比作为概率 [~, idx] max(U, [], 2); probs accumarray(idx, 1, [6,1]) / size(scenarios_matrix, 1); % 提取代表场景选离聚类中心最近的原始场景 representative_scenes zeros(6, size(scenarios_matrix,2)); for k 1:6 cluster_members find(idx k); [~, min_idx] min(sum((scenarios_matrix(cluster_members,:) - centers(k,:)).^2, 2)); representative_scenes(k,:) scenarios_matrix(cluster_members(min_idx),:); endfcm的第三个参数是选项向量分别表示模糊指数、最大迭代次数、终止阈值。这段代码生成的probs是6个场景的概率representative_scenes就是供优化模型使用的典型场景数据。Yalmip求解部分目标函数骨架如下% 假设已经定义决策变量 Pgrid(24,1), Pch(24,1), Pdis(24,1), Pcurtail_wind(24,1) 等 % 以及场景数据 wind_avail(s,:), solar_avail(s,:), load(s,:) Objective 0; Constraints []; for s 1:6 for t 1:24 % 上级电网购电费用 C_grid price_buy(t) * Pgrid(t); % 峰谷差惩罚费用简化形式 C_peak peak_penalty * max(0, net_load_peak(s) - target_peak); % 弃风弃光惩罚 C_res curtail_penalty * (Pcurtail_wind(t) Pcurtail_solar(t)); % EV调度费用 C_ev ev_cost * (Pch(t) Pdis(t)); % 网损费用用线性化近似或潮流计算结果 C_loss loss_price * P_loss_approx(t); Objective Objective probs(s) * (C_grid C_peak C_res C_ev C_loss); end end % 功率平衡约束等加入 Constraints optimize(Constraints, Objective, sdpsettings(solver, gurobi));网损如果是二次项Gurobi处理起来会慢。常见做法是先做一次基础潮流计算把网损近似为节点功率的线性函数或者用二阶锥松弛把潮流方程变成凸约束。这两种方法都能让模型在可接受时间内收敛。4.3 参数设置参考与调参经验以下是我的实战参数表不同系统略有差异但区间可以照抄参数经验值/区间说明蒙特卡洛抽样次数2000~5000先2000试跑尾部分布不足再补边缘分布拟合核密度估计比假设固定分布更稳避免分布假设错误Copula家族Gaussian / t / Clayton / Gumbel / Frank用AIC/BIC选别先入为主FCM模糊指数m2低于1.5过硬高于3过软聚类数4~8优选6用轮廓系数、Xie-Beni指数辅助判断峰谷差惩罚系数50~200元/MW要做敏感性分析别一把梭弃风弃光惩罚单价300~500元/MWh一般设得较高确保优先消纳EV充电/放电功率限值按类型设0.1~0.3MW出租车高私家车低调参阶段我强烈建议做一次敏感性分析尤其是峰谷差惩罚系数和分时电价价差。只固定一组参数跑通并不代表模型稳健系数变化后结果趋势应该符合物理直觉如果出现“惩罚系数越大峰谷差反而越大”这种反直觉结果多半是约束写错了。5. 常见问题与避坑实录5.1 Copula拟合没报错生成场景的相关性却和原始数据差很多这个问题我遇到过不止一次。表面上拟合代码没报错相关性矩阵也正常但生成的风光场景相关性明显偏弱或方向不对。原因大概率是两个。一个是用原始数据直接做Pearson相关比较而Copula拟合得到的是秩相关两者数值上本来就有差异需要比较Kendall’s tau。另一个是边缘分布选择不合理如果先用某一种参数分布拟合边缘而这个分布本身不适合数据即使Copula参数估对了逆变换回去的物理量也会变形。排查思路先计算历史风速、光照的Kendall’s tau再用生成样本重新计算Kendall’s tau两者对比偏差应该在0.05以内才算正常。如果偏差大优先换边缘分布其次换Copula家族。5.2 FCM聚类结果每次跑不一样FCM和K-means一样对初始聚类中心敏感。如果每次都随机初始化聚类结果可能跳到不同的局部最优。解决办法是先用K-means跑一遍把K-means得到的聚类中心作为FCM的初始值这样可复现性会好很多。另一个细节是数据标准化风速、光照、负荷的量纲不一样如果不做归一化负荷数值大就会主导距离计算聚类结果几乎等于只对负荷聚类。正确的做法是在聚类之前对每个特征维度做Z-score标准化聚类完成后再把聚类中心反标准化回实际物理值。这一步不做6个典型场景可能全是“负荷高风光低”或“负荷低风光高”失去代表性。5.3 6个场景概率差异太大优化结果总是偏向高概率场景如果某一两个场景的概率之和超过了0.8其他场景基本是“陪跑”调度结果会高度偏向那几个高概率场景对极端场景的应对能力变弱。这通常说明聚类数太少了或者场景本身分布过于集中。一种解决方法是增加聚类数到8或10让低概率极端场景有独立成簇的机会。另一种方法是引入条件风险价值CVaR之类的风险度量在目标函数里加入对低概率高损失场景的惩罚而不是纯粹优化期望费用。不过CVaR会让模型从纯线性变成分段线性或者引入更多辅助变量先确认课题有没有这个需求再动手。5.4 网损二次项导致求解慢或不收敛网损费用在配电网优化里最常见的问题就是二次项。传统交流潮流约束是非凸的直接丢给求解器很可能陷入局部最优或者长时间不收敛。工程上有一个标准套路用Distflow支路潮流方程配合二阶锥松弛把非凸问题转成凸问题再用Gurobi/Cplex求解。如果系统规模不大也可以直接把网损近似成节点功率的线性函数先跑通全流程之后再做精确化。我的建议是第一版模型别追求极致的潮流精度先保证逻辑正确和求解收敛后续再逐步加精确潮流、加电压约束。5.5 多类型EV逐台建模导致变量爆炸逐台EV建模的“魅力”在于很快能把一个调度模型撑爆。1000辆私家车每辆车一个SOC状态变量再加上0-1充放电互斥变量24小时时段数叠加变量数量就奔着五六位数去了。聚合建模的思路是按EV类型、所在充电站、可调度时段三个维度把同类型EV聚合为“虚拟电池”。虚拟电池有聚合容量、聚合最大充放电功率、聚合SOC状态约束和单台EV类似但变量数量降到两位数。实践证明对日前调度和分时电价策略研究来说聚合模型和逐台模型的优化结果差距在工程可接受范围内。另外提醒一下EV聚合时要保留每辆车的“出行需求”作为聚合约束。不能一堆EV被调度到早晨放电放空了结果用户要开车却没电。这个问题在聚合模型里尤其容易出建议给聚合SOC加一个“时段下限”约束保证各时段聚合电量不低于该类型车辆的最低续航要求。5.6 常见问题速查表现象可能原因解决办法Copula生成场景相关性弱边缘分布不合适或比较了错误的相关指标换核密度边缘对比Kendall’s tauFCM聚类结果不重复随机初始化用K-means预聚类结果初始化代表场景全是某个特征主导未做数据标准化聚类前Z-score标准化一个场景概率超过0.5聚类数过少或场景集中调大聚类数或引入CVaR风险度量求解不收敛网损二次项/非凸潮流Distflow线性化或二阶锥松弛聚合EV变量爆炸逐台建模按类型聚合成虚拟电池峰谷差惩罚结果反常约束写错或系数过大做敏感性分析检查净负荷计算口径最后再分享一个实操层面的体会整套流程做下来我个人觉得最值得养成的习惯是“分模块验证”。不要一上来就把蒙特卡洛、Copula、FCM、优化模型全部串起来跑那样出了问题根本不知道是哪个环节的锅。先把Copula生成场景和历史数据做统计对比确认相关性OK再把聚类场景和全量场景做均值方差对比确认缩减不严重失真最后才把场景数据喂进优化模型。我最初就是在这一步吃了亏聚类结果看着正常但喂给优化模型后发现峰谷差惩罚项算出来是负数查了两天才发现是净负荷峰谷差的计算口径弄反了。另一个小技巧是所有参数都写在一个独立的config.m脚本里包括抽样次数、Copula类型、FCM模糊指数、聚类数、惩罚系数、分时电价表。这样当你需要做敏感性分析或者换一组历史数据重新跑课题时改参数一分钟就能完成不会在代码里翻来翻去找“当时设的50到底是哪个变量”。这类课题往深了扩展还可以加入碳交易成本、储能系统协调以及把分时电价策略本身作为优化变量而不是固定输入。但不管怎么扩展核心的那条链路——不确定性建模、相关性描述、场景缩减、随机优化——是始终不变的。搞清楚了这条链路上每个环节的作用和数据流向你就具备了解读绝大多数配电网随机优化问题的基础能力。
返回列表