pandapower新版本(1.5.1)中OPF成本计算公式的变化

OPF成本计算公式的变化

With the new pandapower Version 1.5.1, the cost formulation for the pandapower OPF changes. Basically, you'll be good if you just multiply all your cost functions with -1 and your results will be the same as before. Maybe you already realized yourself, that there was an inconsistency with the costs.

在新的版本pandapower 1.5.1中,pandapower的OPF成本计算公式发生了变化。基本上,如果你只是用-1乘以所有的成本函数,那么你不会收到影响,你的计算结果也将和以前一样。可能你已经意识到了成本之间的矛盾。

This tutorial will explain why we made this change and how you can refactor your old code. It is based on the opf_basic tutorial.
So let's remember one convention in pandapower:
For all bus-based power values, the signing is based on the consumer viewpoint:

本教程将解释为什么要做出这一步改变和如何重构你原来的代码。本教程基于opf_basic教程。
让我们记得pandapower中的一个规定:
对所有母线上的功率值,都是从电力消费者的观点上出发的。

  • positive active power is power consumption, negative active power is power generation

  • positive reactive power is inductive consumption, negative reactive power is capacitive consumption

  • 正值有功功率表示消耗功率值,负值有功功率表示发电功率值

  • 正值无功功率表示感性无功,负值无功功率表示容性无功

Let's say I wan't to define linear costs of 1€ per kW for a generator, then I need to keep this in mind!
The respective cost function has a negative slope:

假设我不想定义发电机每千瓦1欧元的线性成本,那我需要牢记一点!
相应的成本函数具有负斜率:

cost1.png

在pandapower中,该成本函数可以采用如下的命令创建

  • pp.create_polynomial_cost(net, 1, 'gen', np.array([-1, 0]))

或者

  • pp.create_piecewise_linear_cost(net, 1, "gen", np.array([[p_min_kw, abs(p_min_kw)], [0,0]]))

例如:当我们拥有一台100kW的发电机时:

  • pp.create_piecewise_linear_cost(net, 1, "gen", np.array([[-1000, 1000], [0,0]]))

以下面的例子说明。我们首先创建电网,与以前无异。

import pandapower as pp
import numpy as np
net = pp.create_empty_network()

#create buses
bus1 = pp.create_bus(net, vn_kv=220.)
bus2 = pp.create_bus(net, vn_kv=110.)
bus3 = pp.create_bus(net, vn_kv=110.)
bus4 = pp.create_bus(net, vn_kv=110.)

#create 220/110 kV transformer
pp.create_transformer(net, bus1, bus2, std_type="100 MVA 220/110 kV")

#create 110 kV lines
pp.create_line(net, bus2, bus3, length_km=70., std_type='149-AL1/24-ST1A 110.0')
pp.create_line(net, bus3, bus4, length_km=50., std_type='149-AL1/24-ST1A 110.0')
pp.create_line(net, bus4, bus2, length_km=40., std_type='149-AL1/24-ST1A 110.0')

#create loads
pp.create_load(net, bus2, p_kw=60e3, controllable = False)
pp.create_load(net, bus3, p_kw=70e3, controllable = False)
pp.create_load(net, bus4, p_kw=10e3, controllable = False)

#create generators
eg = pp.create_ext_grid(net, bus1)
g0 = pp.create_gen(net, bus3, p_kw=-80*1e3, min_p_kw=-80e3, max_p_kw=0,vm_pu=1.01, controllable=True)
g1 = pp.create_gen(net, bus4, p_kw=-100*1e3, min_p_kw=-100e3, max_p_kw=0, vm_pu=1.01, controllable=True)

网损最小化

We specify the same costs for the power at the external grid and all generators to minimize the overall power feed in. This equals an overall loss minimization. With the former pandapower versions, you must've specified the costs like this to get to the goal of having positive costs for high feed in:
- costeg = pp.create_polynomial_cost(net, 0, 'ext_grid', np.array([1, 0]))
- costgen1 = pp.create_polynomial_cost(net, 0, 'gen', np.array([1, 0]))
- costgen2 = pp.create_polynomial_cost(net, 1, 'gen', np.array([1, 0]))

But as we leared above, this is not right! This was due to a mix up in the signs, but from now on, the cost function signing is based on the consumer viewpoint as well.

我们指定外部电网和所有发电机的功率成本相同的情况下,最小化总的供应功率。这等同于总的网损最小化。在之前的pandapower版本中,你必须指定如下的成本以获得正的成本。

- costeg = pp.create_polynomial_cost(net, 0, 'ext_grid', np.array([1, 0]))
- costgen1 = pp.create_polynomial_cost(net, 0, 'gen', np.array([1, 0]))
- costgen2 = pp.create_polynomial_cost(net, 1, 'gen', np.array([1, 0]))

但是正如我们上面分析的,这是不对的。这是由于对于符号的混淆,但从现在起,成本函数符号都是基于电力消费者的角度。

costeg = pp.create_polynomial_cost(net, 0, 'ext_grid', np.array([-1, 0]))
costgen1 = pp.create_polynomial_cost(net, 0, 'gen', np.array([-1, 0]))
costgen2 = pp.create_polynomial_cost(net, 1, 'gen', np.array([-1, 0]))

运行OPF运算:

pp.runopp(net, verbose=True)
The OPF cost definition has changed! Please check out the tutorial 'opf_changes-may18.ipynb' or the documentation!


PYPOWER Version 5.1.4, 27-June-2018 -- AC Optimal Power Flow
Python Interior Point Solver - PIPS, Version 1.0, 07-Feb-2011
Converged!

看下计算结果:

print(net.res_ext_grid)
           p_kw       q_kvar
0 -56530.133524 -1974.471614
print(net.res_gen)
           p_kw       q_kvar  va_degree     vm_pu
0 -71313.545821  1969.654618  -3.712804  1.000009
1 -12299.610412  1451.160058  -3.712782  1.000010

Since all costs were specified the same, the OPF minimizes overall power generation, which is equal to a loss minimization in the network. The loads at buses 3 and 4 are supplied by generators at the same bus, the load at Bus 2 is provided by a combination of the other generators so that the power transmission leads to minimal losses.

因为指定都为相同的成本,OPF最小化总的发电功率。这等同于网损最小化。母线3和母线4上的负荷由各自母线上的发电机供应,母线2上的负荷由其他发电机联合供应,从而输电的功率损失最小。

What about the cost result? We expect costs of 1 for each kW fed into the net. So let's check the overall fed in power:

那么成本是多少呢?我们假定每1kW输入到网络中的成本为1.因此我们计算所有的输入功率:

print(net.res_gen.p_kw.sum() + net.res_ext_grid.p_kw.sum())
-140143.28975736868

因此OPF的成本为140143.29!

print(net.res_cost)
140143.28975736868

现在我们有了具有一致性的OPF成本函数了!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 巨石虽大,跌落无情,但是大灾后必有大爱,爱字虽小,能量无穷,只要人人心中有大爱,一切困难都能解决
    江南水乡阅读 310评论 0 1
  • 我的感冒是从年初四开始,一直折磨着我苟延残喘直至元宵才算勉强痊愈。在这期间我独自买药吃药,独自在大半夜不断的起身揉...
    Katherina_猫阅读 461评论 0 7
  • 用Chrome调试web页面 1、下断点(breakpoints) 2、最右边分析:Call stack:调用堆栈...
    壹个正经人阅读 277评论 0 0
  • ------似水年华,我在征途 。过去属于历史,未来属于自己!------弗吉尼亚·伍尔芙说过:“让我们记住共...
    唐moumou阅读 1,129评论 0 0
  • 大坪 我用心灵触碰你 荷花织了件婚纱,大坪美得像出嫁。爱上一个地方,如同爱上一个人。可以是因为一张照片、一段文字、...
    荷花宣传阅读 188评论 0 0