笔者前一段时间有幸手写了一遍SCUC和SCED算法,以及节点电价的计算模型;虽然总体还算顺利,但对其中的一些细节机制仍有不解,下文特别描述其中一个技术问题,笔者认为这个问题是模型需要解释清楚的。
(来源:微信公众号“兰木达电力现货”作者:王超一)
众所周知,现货出清大致分为三个部分,第一部分,是SCUC部分,笔者认为,SCUC要解决的问题是全部0-1变量的取值确定,主要包括三类变量,第一个是机组开停机示性变量,二是机组中标出力在哪一个段这种变量,三是为了模型线性化引入的额外的0-1变量。SCUC步引来了现货出清的第一个黑盒,表现在两个方面,1. SCUC未必能收敛到全局最优;2. 即使收敛到全局最优,最优解未必唯一,那么到底出来哪个解就会取决于实际程序是怎么写的。
第二部分,是SCED部分,由于在SCUC部分通过近似等手段已经解决了NP难特性,所以在SCED部分是一个简单的线性规划,那么一定可以找到最优解。这里的最优解也未必唯一,这导致了SCED的黑盒特性(我们通过一个自研的后处理算法保证了机组中标的相对公平性,不知道实际出清有没有类似的机制)。一般来说,找到最优解,可以由节点定价模型确定唯一的节点电价,这意味着需要拉格朗日乘子是唯一确定的。然而,事实上并不尽然。这导致了节点电价的模型问题。
第三部分,是节点电价的确定,求解KKT条件实质上是等价于解一个线性方程组。我们回顾一下可能的约束,每一个约束对应一个拉格朗日乘子(后文简称乘子)。理论上,每增加一个约束,就增加一个乘子变量(不同时点是不同的变量),求解KKT条件本质上是解等式约束成立(即乘子非0)的乘子方程;增加一个机组,由于需要对机组出力求偏导,就增加一个方程(不同时点是不同方程)。
最重要的约束是负荷平衡约束,这个约束和所有机组都有关系,乘子变量个数等于时点个数。其次是潮流约束,同样不同时点的潮流约束是不同的乘子。负荷约束和潮流约束对应的乘子是定价的乘子,这两类乘子比较复杂。接下来是机组最大出力的乘子,由于不同时点是不同的乘子,当某个时点该约束满足时,对应机组的方程的乘子系数不为0,而其他时点或其他机组对应的方程该乘子系数为0,所以可以简单地通过线性表出这个乘子,这样消去一个未知数(乘子),减少一个方程,这也就是为什么某时段达到最大出力的机组几乎一定不参与定价的数学原因。这种乘子我们称之为独立乘子,即它一定带来一个独立的未知数和一个独立的方程。
显然,如果所有的乘子都这么简单,那这个方程就很容易求解。其他的不定价的乘子还有最小出力限制,爬坡约束最大出力,爬坡约束最小出力。爬坡约束的乘子在两个相邻时点的对应机组的系数都不为0,进一步增加了方程的复杂性。以上我们大致描述了这个大的方程组,可以看到,由于复杂的约束很多,约束关联的变量相当复杂,并没有机制保证这个大的方程组是良定义的,或者说这个方程组的系数满秩(实际中我们的确大量发现出现不满秩情况)。这时候,会出现一个问题,即我们的变量个数大于了独立的方程个数,这时候怎么办?
为了更直观解释这种情况,下文举一系列直观的例子。这些例子目标函数是一个二次函数,虽然和电力现货场景不一致,但与要描述的问题本质上是类似的。
第一个例子
上述这个例子比较简单,假设乘子变量为a,我们化简KKT条件得到如下方程,
2x+a=0
2y-a=0
x+2-y=0
得到 x=-1,y=1,a=2;这种情况是目标函数与约束相切,对应着唯一最优解,并且拉格朗日乘子唯一确定,这时,节点电价计算不会出现任何分歧。
第二个例子
比第一个例子多一个约束,唯一最优解与第一个例子一致。
假设两个约束对应的拉格朗日乘子为a和b,同样利用KKT条件列方程,得到
2x+2a+1/2b=0
2y-a-b=0
x=-1
y=1
得到 a=2/3, b=4/3; 这种情况也很愉快,两个约束都起到了作用,否则目标函数在和其中一个约束相切时更小一些,然而两个约束共同作用,导致了目标函数在约束的交点处取得了最小值。
第三个例子
第三个例子,这个例子又比第二个例子多了一个约束,如下所示:
假设3个约束对应的乘子为a,b,c; 则化简KKT条件可得
2x+2a+1/2b+1/3c=0
2y-a-b-c=0
x=-1
y=1
这时候就麻烦了,有3个乘子但只有2个有效的方程,假设其中有乘子代表着潮流约束或负荷约束,那么其实不能解出来确定的值。笔者曾咨询过业内同行,其中一个答案是通过加入随机扰动,破除约束共点的情况。或者通过一些硬规则,当某些约束不独立时,规定约束起作用的优先级,不起作用的乘子用0代入。这两种解决方案都带来了现货电价的又一个黑盒!当然如果有更正确的做法,麻烦读者不吝赐教~
综上,现有现货模型在主要的三大步骤中都存在黑盒特性,如果这些细节没有严格的数学论证,那就很不严肃了。所以需要保存现场数据并进行第三方监管,以进一步保障电力现货价格形成的公平公正。