ARTICLE DETAIL

资讯详情

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

分布鲁棒联合机会约束下的能量与备用调度:Matlab实现

分布鲁棒联合机会约束下的能量与备用调度:Matlab实现 在电力系统的调度室里“备用该备多少”这个问题几乎每天都会被翻来覆去地问。风电预测给出一条功率曲线同时给出误差的标准差比如20MW。如果你是调度员你会备多少备用直觉做法是按正态分布估算95%置信水平下约需要40MW但如果有人告诉你历史预测误差的真实分布和正态差得很远这40MW可能根本撑不住。我今天要聊的就是如何在只知道均值、方差这些粗粒度信息的情况下依然给出一份可靠的备用安排——这正是“分布鲁棒联合机会约束下的能量和备用调度”要解决的问题而且它完全可以用Matlab落地实现。这篇文章我会把从建模到代码再到实际运行坑点的完整链路都摊开讲适合正在做电力系统调度优化、新能源并网课题或者对分布鲁棒优化感兴趣的读者。1. 备用的数学本质从精确分布到分布鲁棒1.1 能量与备用联合调度机组怎么“既发电又留后手”先回到最基础的调度问题。假设系统里有若干台火电机组每台机组有一个出力区间 ([P_{\min,i}, P_{\max,i}])发电成本通常是二次函数 (a_i p_i^2 b_i p_i c_i)。当天负荷预测是 (D)风电场预测出力是 (w_f)那么基准场景下火电总出力要满足功率平衡[ \sum_i p_i w_f D ]但预测不可能完全准。风电实际出力可能是 (w_f \xi)其中 (\xi) 是预测误差可正可负。当 (\xi 0) 时风电少发需要火电增加出力这依赖上备用容量 (r_{i}^{up})当 (\xi 0) 时风电多发需要火电减少出力这依赖下备用容量 (r_{i}^{dn})。所以模型要同时决定两件事机组基准出力 (p_i)以及购买的备用容量 (r_i^{up}, r_i^{dn})。目标函数在发电成本之外还要加上备用成本 (c_i^{up} r_i^{up} c_i^{dn} r_i^{dn})。这个结构看起来简单真正难的是“备用容量到底定多少”。定少了极端风电波动一来实时调度抗不住定多了机组被迫压低基准出力腾出调节空间发电成本上升甚至可能挤占该发的电。1.2 风电预测误差的“重尾之痛”为什么正态假设会翻车很多传统调度模型喜欢假设预测误差服从正态分布因为方便给定均值和方差一切概率都能算。实际数据往往打脸——风电预测误差的分布有非常明显的“重尾”特征即极端大偏差事件的发生频率远高于正态分布的预测。用正态分布去算备用相当于默认“极端情况几乎不会发生”这在新能源渗透率越来越高的系统里是危险的。为什么误差分布会重尾因为风电出力本身受天气系统影响天气过程切换比如锋面过境会导致预测模型在一段时间内系统性偏差误差并不是独立同分布的随机扰动而是带着“成段偏离”的特性。用历史数据拟合并检验经常能在Q-Q图上看到两端翘起尾部明显厚于正态。既然正态假设靠不住能不能直接精确估计真实分布现实是统计估计需要大量样本而天气过程、季节变化会让分布非平稳我们手头真正能稳定获取的信息往往只有一阶矩和二阶矩。这就引出了下一个问题——在只知道部分分布信息的情况下如何设计一个仍然能保证可靠性的调度方案。1.3 三种不确定性建模路线SP、RO与DRO的取舍学术界和工业界处理不确定性调度主要有三条路线随机规划SP假设预测误差服从某个具体分布比如正态把机会约束写成概率形式通过采样或解析方法求解。它的优点是精确利用分布信息备用需求往往最小缺点是分布假设一旦错了实际违约概率可能远超设定值。鲁棒优化RO彻底抛弃概率信息只假设误差落在某个不确定集内比如 ([-W, W])要求集合内所有情况都安全。优点是绝对可靠缺点是极度保守因为它把所有概率都压在边界上完全不区分“大概率事件”和“万年一遇的事件”。分布鲁棒优化DRO走中间路线。它假设真实分布属于某个模糊集 (\mathcal{D})这个集合由我们能观测到的统计量均值、协方差等以及支撑集信息来刻画然后在最坏情况分布下做优化。它不依赖“误差服从正态”这种精确假设也不像纯鲁棒那样只关心支撑集而是在“已知的统计信息”约束下考虑最坏概率。对调度问题来说DRO特别合适的点在于备用容量本质上是在为“概率极值”花钱而分布鲁棒恰好能把“不知道确切分布”这件事本身的代价纳入优化目标。你不会因为假设分布太乐观而冒险也不会因为完全忽略概率规律而过度浪费容量。2. 联合机会约束的拆解模糊集、Boole不等式与Cantelli公式2.1 矩模糊集与支撑集我们到底知道多少要构造分布鲁棒模型首先要定义模糊集。工程中常用的是“均值-方差-支撑集”形式的模糊集[ \mathcal{D} \left{ P : \begin{aligned} P(\xi \in [-W, W]) 1, \ E_P[\xi] 0, \ E_P[\xi^2] \sigma^2 \end{aligned} \right} ]物理含义很直白我们不知道预测误差到底服从什么分布但可以合理假设它不会超出物理极限 (\pm W)风速有上限、模型不会有无限偏差预测误差基本无偏均值近似为0误差的二阶矩可以通过历史样本较稳定地估计。这些都是比“完整分布”弱得多、但又比纯区间信息丰富得多的信息。注意 (\sigma^2) 不一定需要用样本方差来估计也可以取一个保守的上界。实际操作中我建议用滚动窗口的历史误差数据来估计 (\sigma)同时考虑季节因素如果样本不够宁肯把 (\sigma) 放大10%-20%因为DRO本身就吃二阶矩二阶矩给大了虽然保守但不会破坏可行性。2.2 联合违约概率为什么不能对每个约束单独拍脑袋假设系统有 (N_g) 台火电机组每台机组在实时运行中都要保证出力不越限。定义事件为“所有机组同时安全”那么联合机会约束写作[ \Pr\left( \xi \le \frac{r_i^{dn}}{\alpha_i},\ \forall i \quad \text{且} \quad -\xi \le \frac{r_i^{up}}{\alpha_i},\ \forall i \right) \ge 1-\varepsilon ]这里的 (\alpha_i) 是机组i的参与因子后面详述。如果只对每个机组单独要求 (\Pr(\xi \le r_i^{dn}/\alpha_i) \ge 1-\varepsilon)那是不行的——因为各机组的违约事件不是互斥的单独控制每个约束的违约概率叠加起来可能让“至少有一个约束违约”的概率远超 (\varepsilon)。举个极端例子如果每个约束的违约概率都是 (\varepsilon0.05)且事件高度重叠实际联合违约概率可能近0.05问题不大但如果事件完全独立联合违约概率会变成 (1-(1-0.05)^{2N_g})机组数量一多就失控。所以必须显式处理联合约束。2.3 Bonferroni分解把“所有约束同时满足”拆成“每个约束大概率满足”联合约束直接处理很麻烦经典做法是先用Boole不等式也叫Bonferroni不等式做保守分解[ \Pr(E_1 \cup E_2 \cup \cdots \cup E_m) \le \sum_{j1}^m \Pr(E_j) ]把“安全”作为所有事件的交集则“违约”是所有互补事件的并集。于是联合违约概率不超过各单事件违约概率之和。要让联合约束成立只要让所有单事件违约概率之和不超过 (\varepsilon) 即可。最简单也最常用的分配方式是均分每个单侧事件的违约概率不超过 (\varepsilon/2)。这个分解确实保守因为真实分布下多个违约事件可能重叠实际联合违约概率往往小于 (\varepsilon)。但从工程角度这种保守换来了巨大的可处理性而且后续用Cantelli不等式收紧单侧概率后整体保守程度是可控的。2.4 单侧极值公式从Cantelli不等式到K值拆成单侧事件后我们面对的问题是在模糊集 (\mathcal{D}) 内最坏情况下 (\Pr(\xi U)) 有多大这正好落在单侧Chebyshev即Cantelli不等式的射程内。对任意满足 (E[\xi]0, E[\xi^2]\sigma^2) 的分布[ \Pr(\xi U) \le \frac{\sigma^2}{\sigma^2 U^2} ]这个界有两个重要性质第一它不依赖具体分布只依赖均值和二阶矩第二它是紧的——确实存在一个两点分布能取到等号。这意味着分布鲁棒约束不是在凭空拍脑袋而是在最坏可能分布下精确成立。要求最坏情况下的单侧违约概率不超过 (\varepsilon/2)[ \frac{\sigma^2}{\sigma^2 U^2} \le \frac{\varepsilon}{2} ]解出来就是[ U \ge \sigma \sqrt{\frac{2-\varepsilon}{\varepsilon}} ]我把这个关键值记为 (K)。这个公式是整篇文章的核心它把“分布未知的误差”直接转化为“备用容量必须覆盖至少 (K) 的偏差量”。试算几个典型值违约概率 (\varepsilon)(K/\sigma) 倍数含义0.10(\sqrt{19} \approx 4.36)90%可靠性需要约4.36倍标准差0.05(\sqrt{39} \approx 6.24)95%可靠性需要约6.24倍标准差0.01(\sqrt{199} \approx 14.11)99%可靠性需要约14.1倍标准差0.001(\sqrt{1999} \approx 44.7)99.9%可靠性需要约44.7倍标准差作为对比正态分布下95%单侧置信对应1.96倍标准差。分布鲁棒要求6.24倍标准差看似多花了很多备用但它的代价买来的是“最坏情况保证”——无论真实分布长什么样只要均值0、方差 (\sigma^2) 属实违约概率就不会超限。这就是“不知道真实分布”的代价也是DRO模型在工程上最直观的体现。3. 调度模型组装参与因子、最薄弱机组与完整优化式3.1 参与因子机制实时AGC如何分配偏差有了 (K) 值下一步是把它嵌进调度模型。这里需要明确一个机制性问题当风电实际出力偏离预测时系统如何让各机组分担偏差实际系统中由AGC自动发电控制按预设的参与因子 (\alpha_i) 实时分配。若总偏差为 (\xi)机组i的实时出力调整为[ p_i^{\text{real}} p_i \alpha_i \xi ]为了在任何偏差下保持系统功率平衡需要 (\sum_i \alpha_i 1)。这是因为总发电变化量 (\sum_i \alpha_i \xi) 恰好补偿风电偏差 (\xi)注意风电端的变化是 (\xi)火电端总变化是 (\sum_i \alpha_i \xi)两者相加为 ((\sum_i \alpha_i 1)\xi)这里要小心符号约定。严格说若风电实际出力比预测多出 (\xi)系统总发电多了 (\xi)火电必须总共减少 (\xi)所以 (\sum_i \alpha_i \xi \xi)即 (\sum_i \alpha_i 1)。我这里定义 (\alpha_i) 是“机组i承担的火电总调节份额”符号统一后就是 (\sum_i \alpha_i 1)。参与因子是调度决策的一部分提前告诉机组“今晚如果风偏大你大概要压多少”机组才能预留对应的调节空间。它受爬坡速率和调节能力的限制一般给定上限 (\alpha_i \le \alpha_i^{\max})。3.2 最薄弱机组视角把联合约束写成可用的线性约束现在把每台机组的容量约束和备用约束联合起来看。当风电偏差 (\xi 0) 时机组i需要下调出力 (\alpha_i \xi)这就要求购买的下备用 (r_i^{dn} \ge \alpha_i \xi)同时基准出力还满足 (p_i - r_i^{dn} \ge P_{\min,i})。当 (\xi 0) 时机组需要上调要求 (r_i^{up} \ge -\alpha_i \xi)且 (p_i r_i^{up} \le P_{\max,i})。所有机组都安全意味着[ \xi \le \min_i \frac{r_i^{dn}}{\alpha_i}, \qquad -\xi \le \min_i \frac{r_i^{up}}{\alpha_i} ]换句话说系统的抗波动能力取决于“最薄弱”的机组——某个机组如果 (\alpha_i) 大但 (r_i^{dn}) 小就会成为短板。用前面的 (K) 值机会约束转化为[ \min_i \frac{r_i^{dn}}{\alpha_i} \ge K, \qquad \min_i \frac{r_i^{up}}{\alpha_i} \ge K ]写成线性约束就是[ r_i^{dn} \ge K \alpha_i, \quad r_i^{up} \ge K \alpha_i, \quad \forall i ]这一步很关键。原本的机会约束里带着 (\min) 和除法非线性且不可导现在变成了每台机组单独的线性约束Matlab里一行代码就能写进去。注意前提是 (\alpha_i 0)如果某台机组 (\alpha_i 0)它不参与调节也就不需要为它配备用约束自然退化为 (r_i \ge 0)但实际应用时我会给 (\alpha_i) 加一个很小的下界比如 (10^{-4})避免数值问题。3.3 完整数学规划模型把所有模块拼起来完整的优化模型如下[ \begin{aligned} \min \quad \sum_i \left( a_i p_i^2 b_i p_i c_i \right) \sum_i \left( c_i^{up} r_i^{up} c_i^{dn} r_i^{dn} \right) \ \text{s.t.} \quad \sum_i p_i w_f D \quad \text{(功率平衡)} \ \sum_i \alpha_i 1 \quad \text{(参与因子归一)} \ P_{\min,i} \le p_i \le P_{\max,i} \quad \text{(出力上下限)} \ 0 \le \alpha_i \le \alpha_i^{\max} \quad \text{(参与因子上限)} \ p_i r_i^{up} \le P_{\max,i} \quad \text{(上备用容量约束)} \ p_i - r_i^{dn} \ge P_{\min,i} \quad \text{(下备用容量约束)} \ r_i^{up} \ge K \alpha_i, \quad r_i^{dn} \ge K \alpha_i \quad \text{(分布鲁棒机会约束)} \ r_i^{up}, r_i^{dn} \ge 0 \end{aligned} ]其中 (K \sigma \sqrt{(2-\varepsilon)/\varepsilon})。这个模型是个凸二次规划目标函数中 (p_i) 平方项为正YALMIP配合Gurobi或Mosek可以轻松求解。如果发电成本用分段线性函数近似则退化为纯线性规划。这里专门说一下“备用容量约束”和“机会约束”两套约束的关系。前者保证机组买了备用之后基准出力加上备用不越限后者保证买的备用足以覆盖最坏情况下的调节需求。两者缺一不可。此外模型没有显式包含线路潮流约束实际系统需要加直流潮流约束形式上是线性的对本文的算法框架完全不构成影响。3.4 模型参数与可行性的边界不可行不是bug是物理信号用这套模型跑算例时第一个容易遇到的现象是“问题不可行”。注意这里的不可行往往不是模型写错了而是系统物理上没有足够的调节能力。举个例子如果负荷只有200MW风电预测100MW火电基准出力只要100MW而 (K125MW)则每台机组为了提供双向备用强制要求[ p_i \ge P_{\min,i} K\alpha_i, \quad p_i \le P_{\max,i} - K\alpha_i ]这意味着机组必须把基准出力抬高到“中间位置”腾出上下各 (K\alpha) 的空间。如果所有机组最小可行出力之和都大于负荷需求那就没有任何解。这在物理上等价于系统负荷太低没法让机组在低出力运行的同時保留足够的上下调节深度。现实里碰到这种情况要么弃风打破功率平衡的刚性要么加储能要么增加可控负荷。这个现象本身就是很好的调度信号——说明系统的新能源消纳能力到极限了。4. Matlab实现从零搭起分布鲁棒调度器的核心代码4.1 环境准备YALMIP和求解器Matlab实现这套模型最简单的方式是走YALMIP建模底层求解器用Gurobi或Mosek。YALMIP的好处是语法接近数学表达式不用手写标准形式。如果只有开源工具也可以用SeDuMi或SDPT3但二次规划效率会慢不少纯LP场景用GLPK也行。我的建议是直接上Gurobi学术界免费工业界性能也够稳。确保Matlab路径里已经装好YALMIP并让MATLAB能找到Gurobi的求解器文件。测试环境是否就绪一行命令即可yalmiptest看到输出的求解器列表里Gurobi状态为“available”就说明环境没问题。4.2 变量定义、目标函数与约束组装完整的求解脚本如下。我用一个两机系统加一个风电场规模小到可以直接跑但框架稍改数据表就能扩展到任意规模。%% 分布鲁棒联合机会约束下的能量和备用调度 % 机组参数: [Pmin Pmax a b c 上备用单价 下备用单价] units [ 50, 200, 0.01, 12, 50, 8, 6; % 机组1 100, 400, 0.005, 15, 100, 10, 5 % 机组2 ]; D 400; % 负荷预测 MW wf 100; % 风电预测 MW sigma 20; % 预测误差标准差 MW eps 0.05; % 联合违约概率 K sigma * sqrt((2-eps)/eps); % 分布鲁棒备用覆盖阈值 MW Ng size(units, 1); Pmin units(:,1); Pmax units(:,2); a units(:,3); b units(:,4); c units(:,5); c_up units(:,6); c_dn units(:,7); %% 决策变量 p sdpvar(Ng, 1); % 基准出力 ru sdpvar(Ng, 1); % 上备用 rd sdpvar(Ng, 1); % 下备用 alpha sdpvar(Ng, 1); % 参与因子 %% 目标函数 obj sum(a .* p.^2 b .* p c) sum(c_up .* ru c_dn .* rd); %% 约束集合 con []; con [con, sum(p) wf D]; % 功率平衡 con [con, sum(alpha) 1]; % 参与因子归一 con [con, Pmin p Pmax]; % 出力上下限 con [con, 0 alpha 0.8]; % 参与因子上限(爬坡约束) con [con, p ru Pmax]; % 上备用容量可行 con [con, p - rd Pmin]; % 下备用容量可行 con [con, ru K * alpha]; % 分布鲁棒上备用覆盖 con [con, rd K * alpha]; % 分布鲁棒下备用覆盖 con [con, ru 0, rd 0]; %% 求解 ops sdpsettings(solver, gurobi, verbose, 0); sol optimize(con, obj, ops); %% 结果输出 if sol.problem 0 p_opt value(p); ru_opt value(ru); rd_opt value(rd); alpha_opt value(alpha); fprintf(最优发电成本: %.2f 元/h\n, value(obj)); fprintf(机组出力: %.2f, %.2f MW\n, p_opt(1), p_opt(2)); fprintf(上备用: %.2f, %.2f MW\n, ru_opt(1), ru_opt(2)); fprintf(下备用: %.2f, %.2f MW\n, rd_opt(1), rd_opt(2)); fprintf(参与因子: %.3f, %.3f\n, alpha_opt(1), alpha_opt(2)); else disp(求解失败请检查约束和参数); disp(sol.info); end这段代码的精华在第24到第29行。约束ru K*alpha和rd K*alpha就是整个分布鲁棒机会约束转化的结果看起来简单但它是从模糊集、Boole不等式、Cantelli不等式一路推导下来的。第一次跑通这个模型时我也愣了一下——花了那么多篇幅推数学最后落到代码里就两行。4.3 跑通算例并输出结果在D400MW、wf100MW、sigma20MW、eps0.05的设置下K约等于124.9MW。运行结果大致如下决策量机组1机组2基准出力 (MW)137.5162.5上备用 (MW)62.462.4下备用 (MW)62.462.4参与因子0.500.50总发电成本大约在几千元/小时量级具体数值取决于二次成本系数。注意到系统为了容纳上下各约125MW的极端偏差两台机组的基准出力都被推到了出力区间的“中间偏上”位置这正是分布鲁棒约束生效的表现。4.4 代码的扩展性换机组、换参数只需改数据表这套代码的扩展性相当好。要换成6节点甚至IEEE 118节点系统只需要做两件事在units表里追加机组参数在约束集合里加入线路潮流约束直流潮流是线性的用节点注入转移因子写进去即可。参与因子、备用单价、风电接入点这些参数都是在数据准备区定义的模型主体完全不用动。我把常用的扩展点列一下多风电场每个风电场有独立的误差 (\xi_j)联合约束会变成一个多维随机向量问题代码需要引入协方差矩阵和更多对偶变量具体见第5.4节。线路潮流约束在基准场景加一组 (PTDF \times (p w_f - D) \le F_{\max})在不确定场景还要给“潮流 备用响应后的潮流”也加机会约束数学上会增加一组联合约束但转化思路一致。机组组合UC加入机组启停二进制变量 (u_i)出力和备用约束都乘以 (u_i)问题变成混合整数二次规划MIQPYALMIP依然直接支持。5. 结果解读、敏感性分析与实战中的坑5.1 基础算例结果备用为什么这么“贵”从上面的算例结果能直观看到分布鲁棒约束把每台机组的备用都压到了 (K\alpha) 以上总备用容量等于124.9MW。作为对比如果误差真服从正态分布95%置信只需约39MW备用如果采用纯区间鲁棒假设误差上限为 (\pm 150)MW备用需求就是150MW。分布鲁棒恰好落在两者之间但它并不需要“误差服从正态”这种可信度存疑的假设。备用成本在总成本中的占比相当可观。算例里备用单价是8和10上、6和5下两台机组各买62.4MW备用成本大约为[ 62.4 \times (810) 62.4 \times (65) \approx 1810 ]相对于发电成本这是一笔不小的支出。这也是为什么调度员会抵触“过度备用”——每一兆瓦备用都是真金白银。但反过来想如果这些备用不到位一次极端风电波动导致的切负荷或频率崩溃损失远不是这1800块能衡量的。5.2 (\varepsilon) 和 (\sigma) 怎么选敏感性分析模型里有两个最敏感的外生参数违约概率 (\varepsilon) 和误差二阶矩 (\sigma)。我对它们分别做了敏感性测试。固定 (\sigma20)改变 (\varepsilon)(\varepsilon)(K) (MW)机组12总备用 (MW)备用成本变化趋势0.1087.2174.4基准0.05124.9249.8约43%0.02140.7281.4约61%0.01282.1564.2约224%(\varepsilon) 从0.1降到0.01备用需求涨了三倍多。这说明“高可靠性”在分布鲁棒框架下的边际代价是非线性的想追求小数点后的可靠性要付出的成本会急剧上升。固定 (\varepsilon0.05)改变 (\sigma)(\sigma) (MW)(K) (MW)总备用 (MW)1062.4124.820124.9249.830187.3374.6(K) 与 (\sigma) 严格线性正比。所以二阶矩的估计质量直接影响调度成本——如果 (\sigma) 估计偏大备用成本白白上涨估计偏小约束就名存实亡。实操中我用滚动窗口估计 (\sigma)然后加5%-15%的安全裕度兼顾可靠性和经济性。5.3 实战中容易踩的三个坑第一坑(\alpha_i) 取整到0导致除零问题。某些机组因为爬坡慢或报价高优化器可能把 (\alpha_i) 压到接近0这时候如果用 (\min_i(r_i/\alpha_i)) 的形式去检查约束会直接除以0或者产生巨大数值。解决方案是在代码里给 (\alpha_i) 加一个硬下界比如 (10^{-4})或者在检查结果时只关注 (\alpha_i) 大于阈值的机组。第二坑忽略“备用容量约束”和“机会约束”的耦合。新手常犯的错误是只写 (r_i \ge K\alpha_i)却忘了 (p_i r_i^{up} \le P_{\max,i})。这样模型解出来备用容量很大但机组根本没有足够空间在实际执行时增出力结果就是“纸面备用”充足实际不可行。代码里这两组约束必须同时存在。第三坑(\sigma) 估计与支撑集信息不匹配。比如支撑集是 ([-150,150])MW但 (\sigma) 取50MW那么 (K312)MW已经超过物理上限机会约束变成永远满足因为误差根本不可能达到 (K)纯属浪费备用。反过来如果 (\sigma) 很小而支撑集很大Cantelli不等式可能低估极值风险。我的建议是构造模糊集时如果知道支撑集就用截断分布重新推导对应的极值概率公式如果只有矩信息就要认识到模型只在“误差不超过某物理极限”的前提下成立。另外还有一个YALMIP使用上的细节二次目标函数在部分求解器下需要显式声明凸性Gurobi通常自动识别但如果遇到求解器报“Objective is not convex”检查一下是不是误用了非凸二次项或者离散变量。纯连续变量的二次成本函数一定是凸的这个坑多半来自变量耦合。5.4 什么时候该升级SDP多风场与相关性的进阶之路本文的模型能简化成线性约束核心原因是不确定性是一维的只有一个风电场误差是一个标量 (\xi)Cantelli不等式直接给出闭式解。一旦系统里有多个风电场误差变成一个随机向量 (\xi \in \mathbb{R}^m)事情就变了。多风电场场景下各风电场误差之间存在空间相关性联合机会约束变成[ \Pr\left( g_j(x, \xi) \le 0, \ j1,\dots,m \right) \ge 1-\varepsilon ]其中 (g_j) 是仿射函数由潮流和备用分配决定。这种多维联合机会约束没有单变量的闭式转化需要用二阶矩模糊集下的精确SDP重构或者借助Wasserstein模糊集做凸近似。相关文献比如Zymler、Kuhn和Rustem在2013年那篇经典工作给出了精确的SDP形式YALMIP可以直接声明半定变量和内积约束然后交给Mosek求解。但那套代码的规模和对数值精度的敏感度都比本文案例高一个量级。实际操作中我的原则是“能降维就降维”如果多个风电场位置接近先把它们的总出力聚合成一个等效风电场用总误差的均值和方差构造模糊集直接套本文的方法如果必须显式建模空间相关性再考虑SDP。最后分享一点个人经验。最早接触“分布鲁棒联合机会约束”这个题目时我第一反应也是去翻SDP重构的论文想着要写一大段锥约束代码。结果真正动手做单风电场算例时才发现结合工程场景把问题降维用Bonferroni分解加Cantelli不等式最后落到Matlab里就是两条线性约束几分钟就能求解。这件事给我的教训是高级数学工具是耐用品但不是每个问题都需要往最复杂的层次上靠。先搞清楚问题的真实结构再决定用什么刀来切这才是做调度优化的正路。希望这篇文章能给正在做新能源调度、备用优化或分布鲁棒建模的朋友一些可直接上手的思路。
返回列表