最优潮流的 Pyomo 约束迭代
Pyomo Constraint iteration for Optimal Power Flow
我正在解决一个 DC 最优功率流问题,我正在尝试集思广益以最有效的方式迭代 Pyomo 中的约束。
下面是数据结构,其中i和k是通过分支连接的节点,X是电抗,分支的属性。
Sample Branch Data
我遇到的问题如下:
constraint
其中符号“delta”和“p”是约束中的变量,每个节点具有单个delta和p值。这个约束的基本作用是确保从所有连接的节点 k 流入节点 i 的所有功率都等于同一节点中的现有功率值。
这是 i=1 和 i=2 的示例,约束的迭代。
Sample constraint
所以我试图找到在 pyomo 中声明此约束的最有效方法,而不是像这样编写多个约束迭代:
def P1_rule(modelo):
return modelo.p[0]-L[0]== ((modelo.d[0]-modelo.d[1])/0.1)+((modelo.d[0]-modelo.d[2])/0.1)
model.P1 = Constraint(rule=P1_rule)
def P2_rule(modelo):
return modelo.p[1]-L[1]==((modelo.d[1]-modelo.d[0])/0.1)+((modelo.d[1]-modelo.d[2])/0.1)
model.P2 = Constraint(rule=P2_rule)
def P3_rule(modelo):
return modelo.p[2]-L[2] ==((modelo.d[2]-modelo.d[0])/0.1)+((modelo.d[2]-modelo.d[1])/0.1)
model.P3 = Constraint(rule=P3_rule)
我想要这样的单行,以便它可以轻松地在庞大的网络上推广:
def P3_rule(modelo):
return modelo.p[i] ==((modelo.d[i]-modelo.d[k])/X[k])
model.P3 = Constraint(rule=P3_rule)
我想出了一种方法,包括重组数据和创建新的索引数组等...我想看看我是否可以使用保持相同结构的数据更直接地应用约束。
好的,我知道怎么做了。最好的方法,我不知道是可能的,是通过在求和内做一个 if 语句,所以基本上在求和内做一个完整的条件迭代。在下面的代码中,G 是节点列表,而“From”和“To”是 FullBranch 数据中的分支编号列 table.
def Try_rule(mod,g):
return mod.p[g] - L[g] == sum((mod.d[i-1]-mod.d[k-1])/FullBranch.loc[x,"X"] for x,(i,k) in enumerate(zip(FullBranch["From"], FullBranch["To"])) if i == g+1)
model.Try = Constraint(G,rule=Try_rule)
我正在解决一个 DC 最优功率流问题,我正在尝试集思广益以最有效的方式迭代 Pyomo 中的约束。
下面是数据结构,其中i和k是通过分支连接的节点,X是电抗,分支的属性。
Sample Branch Data
我遇到的问题如下:
constraint
其中符号“delta”和“p”是约束中的变量,每个节点具有单个delta和p值。这个约束的基本作用是确保从所有连接的节点 k 流入节点 i 的所有功率都等于同一节点中的现有功率值。
这是 i=1 和 i=2 的示例,约束的迭代。
Sample constraint
所以我试图找到在 pyomo 中声明此约束的最有效方法,而不是像这样编写多个约束迭代:
def P1_rule(modelo):
return modelo.p[0]-L[0]== ((modelo.d[0]-modelo.d[1])/0.1)+((modelo.d[0]-modelo.d[2])/0.1)
model.P1 = Constraint(rule=P1_rule)
def P2_rule(modelo):
return modelo.p[1]-L[1]==((modelo.d[1]-modelo.d[0])/0.1)+((modelo.d[1]-modelo.d[2])/0.1)
model.P2 = Constraint(rule=P2_rule)
def P3_rule(modelo):
return modelo.p[2]-L[2] ==((modelo.d[2]-modelo.d[0])/0.1)+((modelo.d[2]-modelo.d[1])/0.1)
model.P3 = Constraint(rule=P3_rule)
我想要这样的单行,以便它可以轻松地在庞大的网络上推广:
def P3_rule(modelo):
return modelo.p[i] ==((modelo.d[i]-modelo.d[k])/X[k])
model.P3 = Constraint(rule=P3_rule)
我想出了一种方法,包括重组数据和创建新的索引数组等...我想看看我是否可以使用保持相同结构的数据更直接地应用约束。
好的,我知道怎么做了。最好的方法,我不知道是可能的,是通过在求和内做一个 if 语句,所以基本上在求和内做一个完整的条件迭代。在下面的代码中,G 是节点列表,而“From”和“To”是 FullBranch 数据中的分支编号列 table.
def Try_rule(mod,g):
return mod.p[g] - L[g] == sum((mod.d[i-1]-mod.d[k-1])/FullBranch.loc[x,"X"] for x,(i,k) in enumerate(zip(FullBranch["From"], FullBranch["To"])) if i == g+1)
model.Try = Constraint(G,rule=Try_rule)