Table of contents
2. How to open the IEEE30 node and perform power flow calculation
3. How to modify existing model parameters
pypower is very similar to matpower, you can use matpower to learn pypower, of course there are some differences. Let's record the problems solved by using pypower.
1. Background description
Use the existing IEEE30 node network in pypower to modify the output of the generator, and then perform 100 power flow calculations to screen out those that do not meet the operating conditions of the power system.
The problem is broken down into two steps:
1. How to open IEEE30 node and perform power flow calculation
2. How to modify the parameters of an existing model
2. How to open the IEEE30 node and perform power flow calculation
very simple
from pypower.api import case30, runpf, loadcase
import numpy as np
data = case30()
result = runpf(data)
result:
C:\Users\Admin\anaconda3\envs\pppp\python.exe "C:/Program Files/JetBrains/PyCharm 2022.2.3/plugins/python/helpers/pydev/pydevd.py" --multiprocess --qt-support=auto --client 127.0.0.1 --port 58498 --file "C:\First semester of Senior year\safe_and_stable_project\PSASP\psasp_pypower.py"
已连接到 pydev 调试器(内部版本号 222.4345.23)PYPOWER Version 5.1.4, 27-June-2018 -- AC Power Flow (Newton)
Newton's method power flow converged in 3 iterations.
Converged in 0.05 seconds
================================================================================
| System Summary |
================================================================================
How many? How much? P (MW) Q (MVAr)
--------------------- ------------------- ------------- -----------------
Buses 30 Total Gen Capacity 335.0 -95.0 to 405.9
Generators 6 On-line Capacity 335.0 -95.0 to 405.9
Committed Gens 6 Generation (actual) 191.6 100.4
Loads 20 Load 189.2 107.2
Fixed 20 Fixed 189.2 107.2
Dispatchable 0 Dispatchable 0.0 of 0.0 0.0
Shunts 2 Shunt (inj) -0.0 0.2
Branches 41 Losses (I^2 * Z) 2.44 8.99
Transformers 0 Branch Charging (inj) - 15.6
Inter-ties 7 Total Inter-tie Flow 33.2 27.1
Areas 3
Minimum Maximum
------------------------- --------------------------------
Voltage Magnitude 0.961 p.u. @ bus 8 1.000 p.u. @ bus 1
Voltage Angle -3.96 deg @ bus 19 1.48 deg @ bus 13
P Losses (I^2*R) - 0.29 MW @ line 2-6
Q Losses (I^2*X) - 2.10 MVAr @ line 12-13
================================================================================
| Bus Data |
================================================================================
Bus Voltage Generation Load
# Mag(pu) Ang(deg) P (MW) Q (MVAr) P (MW) Q (MVAr)
----- ------- -------- -------- -------- -------- --------
1 1.000 0.000* 25.97 -1.00 - -
2 1.000 -0.415 60.97 32.00 21.70 12.70
3 0.983 -1.522 - - 2.40 1.20
4 0.980 -1.795 - - 7.60 1.60
5 0.982 -1.864 - - - -
6 0.973 -2.267 - - - -
7 0.967 -2.652 - - 22.80 10.90
8 0.961 -2.726 - - 30.00 30.00
9 0.981 -2.997 - - - -
10 0.984 -3.375 - - 5.80 2.00
11 0.981 -2.997 - - - -
12 0.985 -1.537 - - 11.20 7.50
13 1.000 1.476 37.00 11.35 - -
14 0.977 -2.308 - - 6.20 1.60
15 0.980 -2.312 - - 8.20 2.50
16 0.977 -2.644 - - 3.50 1.80
17 0.977 -3.392 - - 9.00 5.80
18 0.968 -3.478 - - 3.20 0.90
19 0.965 -3.958 - - 9.50 3.40
20 0.969 -3.871 - - 2.20 0.70
21 0.993 -3.488 - - 17.50 11.20
22 1.000 -3.393 21.59 39.57 - -
23 1.000 -1.589 19.20 7.95 3.20 1.60
24 0.989 -2.631 - - 8.70 6.70
25 0.990 -1.690 - - - -
26 0.972 -2.139 - - 3.50 2.30
27 1.000 -0.828 26.91 10.54 - -
28 0.975 -2.266 - - - -
29 0.980 -2.128 - - 2.40 0.90
30 0.968 -3.042 - - 10.60 1.90
-------- -------- -------- --------
Total: 191.64 100.41 189.20 107.20
================================================================================
| Branch Data |
================================================================================
Brnch From To From Bus Injection To Bus Injection Loss (I^2 * Z)
# Bus Bus P (MW) Q (MVAr) P (MW) Q (MVAr) P (MW) Q (MVAr)
----- ----- ----- -------- -------- -------- -------- -------- --------
0 1 2 10.89 -5.09 -10.86 2.17 0.026 0.08
1 1 3 15.08 4.09 -14.96 -5.57 0.127 0.48
2 2 4 16.07 5.21 -15.89 -6.66 0.178 0.50
3 3 4 12.56 4.37 -12.54 -4.30 0.018 0.07
4 2 5 13.79 4.51 -13.68 -6.03 0.110 0.44
5 2 6 20.28 7.42 -19.99 -8.50 0.289 0.87
6 4 6 22.50 11.38 -22.43 -11.12 0.066 0.26
7 5 7 13.68 6.21 -13.56 -6.88 0.120 0.29
8 6 7 9.27 3.17 -9.24 -4.02 0.031 0.08
9 6 8 24.82 24.43 -24.69 -23.92 0.128 0.51
10 6 9 5.79 -3.36 -5.79 3.46 -0.000 0.10
11 6 10 3.31 -1.92 -3.31 2.00 -0.000 0.09
12 9 11 0.00 0.00 0.00 0.00 -0.000 0.00
13 9 10 5.79 -3.46 -5.79 3.51 -0.000 0.05
14 4 12 -1.67 -2.02 1.67 2.04 -0.000 0.02
15 12 13 -37.00 -9.26 37.00 11.35 -0.000 2.10
16 12 14 5.39 0.88 -5.35 -0.80 0.037 0.08
17 12 15 9.48 -1.06 -9.41 1.19 0.066 0.12
18 12 16 9.26 -0.10 -9.18 0.28 0.080 0.18
19 14 15 -0.85 -0.80 0.85 0.80 0.003 0.00
20 16 17 5.68 -2.08 -5.65 2.15 0.031 0.07
21 15 18 9.16 0.76 -9.07 -0.57 0.097 0.19
22 18 19 5.87 -0.33 -5.85 0.38 0.022 0.05
23 19 20 -3.65 -3.78 3.66 3.80 0.009 0.02
24 10 20 5.92 4.62 -5.86 -4.50 0.052 0.12
25 10 17 3.37 8.01 -3.35 -7.95 0.023 0.06
26 10 21 -2.23 -11.67 2.28 11.77 0.044 0.10
27 10 22 -3.75 -8.48 3.82 8.62 0.062 0.13
28 21 22 -19.78 -22.97 19.87 23.16 0.093 0.19
29 15 23 -8.81 -5.25 8.91 5.47 0.109 0.22
30 22 24 -2.10 7.80 2.18 -7.68 0.078 0.12
31 23 24 7.09 0.88 -7.02 -0.75 0.066 0.14
32 24 25 -3.86 1.77 3.89 -1.71 0.035 0.06
33 25 26 3.55 2.37 -3.50 -2.30 0.046 0.07
34 25 27 -7.44 -0.66 7.50 0.78 0.063 0.12
35 28 27 -6.11 -6.08 6.11 6.40 -0.000 0.31
36 27 29 6.17 1.68 -6.08 -1.51 0.090 0.17
37 27 30 7.12 1.67 -6.95 -1.35 0.171 0.32
38 29 30 3.68 0.61 -3.65 -0.55 0.035 0.07
39 8 28 -5.31 -6.08 5.34 4.33 0.036 0.12
40 6 28 -0.77 -2.70 0.77 1.75 0.001 0.00
-------- --------
Total: 2.444 8.99
Notice:
runpf means to use the cow-pull method to solve, and there are other solvers, such as opf, cplex, etc., which are not yet used;
3. How to modify existing model parameters
Here matpower is different from pypower
Let's look at pypower first:
Open the case30 model first, then assign values to the corresponding parts, and finally calculate;
For matpower, slightly more complicated:
define_constants;
mpc = loadcase('case30')
mpc.gen(1,9)=100;
runopf(mpc);
You need to use the function first: define_constants;
Then open the case30 file
Then modify the parameter value of the corresponding position;
Finally run the modified
The result is:
mpc =
包含以下字段的 struct:
version: '2'
baseMVA: 100
bus: [30×13 double]
gen: [6×21 double]
branch: [41×13 double]
gencost: [6×7 double]
MATPOWER Version 7.1, 08-Oct-2020 -- AC Optimal Power Flow
AC OPF formulation: polar voltages, power balance eqns
MATPOWER Interior Point Solver -- MIPS, Version 1.4, 08-Oct-2020
(using built-in linear solver)
Converged!
Converged in 0.25 seconds
Objective Function Value = 576.89 $/hr
================================================================================
| System Summary |
================================================================================
How many? How much? P (MW) Q (MVAr)
--------------------- ------------------- ------------- -----------------
Buses 30 Total Gen Capacity 355.0 -95.0 to 405.9
Generators 6 On-line Capacity 355.0 -95.0 to 405.9
Committed Gens 6 Generation (actual) 192.1 105.1
Loads 20 Load 189.2 107.2
Fixed 20 Fixed 189.2 107.2
Dispatchable 0 Dispatchable -0.0 of -0.0 -0.0
Shunts 2 Shunt (inj) -0.0 0.2
Branches 41 Losses (I^2 * Z) 2.86 13.33
Transformers 0 Branch Charging (inj) - 15.2
Inter-ties 7 Total Inter-tie Flow 51.0 58.1
Areas 3
Minimum Maximum
------------------------- --------------------------------
Voltage Magnitude 0.961 p.u. @ bus 8 1.069 p.u. @ bus 27
Voltage Angle -5.69 deg @ bus 19 0.00 deg @ bus 1
P Losses (I^2*R) - 0.30 MW @ line 2-6
Q Losses (I^2*X) - 2.39 MVAr @ line 28-27
Lambda P 3.66 $/MWh @ bus 1 5.38 $/MWh @ bus 8
Lambda Q -0.06 $/MWh @ bus 29 1.40 $/MWh @ bus 8
================================================================================
| Bus Data |
================================================================================
Bus Voltage Generation Load Lambda($/MVA-hr)
# Mag(pu) Ang(deg) P (MW) Q (MVAr) P (MW) Q (MVAr) P Q
----- ------- -------- -------- -------- -------- -------- ------- -------
1 0.982 0.000* 41.54 -5.44 - - 3.662 -
2 0.979 -0.763 55.40 1.67 21.70 12.70 3.689 -
3 0.977 -2.390 - - 2.40 1.20 3.754 -0.016
4 0.976 -2.839 - - 7.60 1.60 3.771 -0.021
5 0.971 -2.486 - - - - 3.744 -0.001
6 0.972 -3.229 - - - - 3.779 -0.020
7 0.962 -3.491 - - 22.80 10.90 3.801 0.003
8 0.961 -3.682 - - 30.00 30.00 5.383 1.405
9 0.990 -4.137 - - - - 3.823 0.020
10 1.000 -4.600 - - 5.80 2.00 3.846 0.039
11 0.990 -4.137 - - - - 3.823 0.020
12 1.017 -4.498 - - 11.20 7.50 3.810 -
13 1.064 -3.298 16.20 35.93 - - 3.810 -
14 1.007 -5.040 - - 6.20 1.60 3.868 0.018
15 1.009 -4.814 - - 8.20 2.50 3.856 0.018
16 1.003 -4.839 - - 3.50 1.80 3.849 0.031
17 0.995 -4.887 - - 9.00 5.80 3.862 0.047
18 0.993 -5.484 - - 3.20 0.90 3.911 0.047
19 0.987 -5.688 - - 9.50 3.40 3.926 0.058
20 0.990 -5.472 - - 2.20 0.70 3.910 0.055
21 1.009 -4.621 - - 17.50 11.20 3.854 0.017
22 1.016 -4.503 22.74 34.20 - - 3.843 -
23 1.026 -3.756 16.27 6.96 3.20 1.60 3.813 -
24 1.017 -3.885 - - 8.70 6.70 3.884 0.028
25 1.044 -2.072 - - - - 3.932 0.022
26 1.027 -2.476 - - 3.50 2.30 3.999 0.067
27 1.069 -0.715 39.91 31.75 - - 3.916 -
28 0.982 -3.215 - - - - 4.106 0.250
29 1.050 -1.849 - - 2.40 0.90 3.966 -0.059
30 1.039 -2.643 - - 10.60 1.90 4.051 -0.012
-------- -------- -------- --------
Total: 192.06 105.08 189.20 107.20
================================================================================
| Branch Data |
================================================================================
Brnch From To From Bus Injection To Bus Injection Loss (I^2 * Z)
# Bus Bus P (MW) Q (MVAr) P (MW) Q (MVAr) P (MW) Q (MVAr)
----- ----- ----- -------- -------- -------- -------- -------- --------
1 1 2 21.04 -2.34 -20.95 -0.27 0.092 0.28
2 1 3 20.50 -3.10 -20.28 2.02 0.220 0.84
3 2 4 18.63 -5.85 -18.40 4.60 0.232 0.66
4 3 4 17.88 -3.22 -17.84 3.36 0.035 0.14
5 2 5 14.36 -0.69 -14.25 -0.78 0.108 0.43
6 2 6 21.66 -4.21 -21.36 3.21 0.300 0.90
7 4 6 17.58 5.68 -17.54 -5.54 0.036 0.14
8 5 7 14.25 0.96 -14.15 -1.64 0.109 0.26
9 6 7 8.70 8.46 -8.65 -9.26 0.049 0.13
10 6 8 23.82 21.37 -23.71 -20.93 0.108 0.43
11 6 9 7.27 -8.27 -7.27 8.54 0.000 0.27
12 6 10 4.15 -4.73 -4.15 4.96 0.000 0.23
13 9 11 0.00 0.00 0.00 0.00 0.000 0.00
14 9 10 7.27 -8.54 -7.27 8.68 0.000 0.14
15 4 12 11.06 -15.24 -11.06 16.21 0.000 0.97
16 12 13 -16.20 -34.01 16.20 35.93 0.000 1.92
17 12 14 4.68 2.08 -4.65 -2.01 0.030 0.07
18 12 15 6.07 3.18 -6.04 -3.12 0.032 0.06
19 12 16 5.31 5.04 -5.26 -4.94 0.047 0.10
20 14 15 -1.55 0.41 1.55 -0.41 0.006 0.01
21 16 17 1.76 3.14 -1.75 -3.12 0.010 0.02
22 15 18 7.20 3.75 -7.13 -3.60 0.071 0.14
23 18 19 3.93 2.70 -3.92 -2.67 0.014 0.03
24 19 20 -5.58 -0.73 5.59 0.75 0.010 0.02
25 10 20 7.85 1.58 -7.79 -1.45 0.058 0.13
26 10 17 7.27 2.73 -7.25 -2.68 0.018 0.05
27 10 21 -4.43 -11.57 4.47 11.67 0.046 0.11
28 10 22 -5.06 -8.39 5.13 8.54 0.067 0.14
29 21 22 -21.97 -22.87 22.07 23.07 0.099 0.20
30 15 23 -10.92 -2.72 11.04 2.97 0.124 0.25
31 22 24 -4.46 2.59 4.49 -2.54 0.031 0.05
32 23 24 2.03 2.39 -2.01 -2.37 0.012 0.03
33 24 25 -11.18 -1.75 11.41 2.16 0.235 0.41
34 25 26 3.54 2.36 -3.50 -2.30 0.042 0.06
35 25 27 -14.96 -4.52 15.20 4.99 0.246 0.47
36 28 27 -11.45 -21.09 11.45 23.48 0.000 2.39
37 27 29 6.16 1.65 -6.08 -1.50 0.078 0.15
38 27 30 7.10 1.63 -6.95 -1.36 0.149 0.28
39 29 30 3.68 0.60 -3.65 -0.54 0.030 0.06
40 8 28 -6.29 -9.07 6.36 7.41 0.069 0.23
41 6 28 -5.05 -14.50 5.09 13.68 0.047 0.14
-------- --------
Total: 2.860 13.33
================================================================================
| Voltage Constraints |
================================================================================
Bus # Vmin mu Vmin |V| Vmax Vmax mu
----- -------- ----- ----- ----- --------
29 - 0.950 1.050 1.050 29.810
================================================================================
| Branch Flow Constraints (S in MVA) |
================================================================================
Brnch From "From" End Limit "To" End To
# Bus |Sf| mu |Sf| |Smax| |St| |St| mu Bus
----- ----- ------- -------- -------- -------- ------- -----
10 6 2.387 32.00 32.00 31.63 - 8
35 25 - 15.62 16.00 16.00 0.024 27
Let's take a look at the modified places:
Indeed changed from the default 80 to 100.
4. Complete code
To achieve the original function, the complete code is as follows:
from pypower.api import case30, runpf, loadcase
import numpy as np
data = case30()
result = runpf(data)
line_num = 41
linecapacity = 200 * np.ones((line_num)) #不知道线路载流量是多少,这里先给一个较大的值,不会对结果判断有影响
#Special_line = np.array([30]) #不知都重点线路有多少
#linecapacity[Special_line] = 10
def Gen_vector(genmaxP, genP):
gennum = len(genP)
#vector_11 = (1 - (-1)) * np.random.random(size=gennum) + (-1) #产生一个(-1, 1)的随机数
vector01 = np.random.random(size=gennum) #产生一个0-1的随机数
gen_vector = vector01 * (genmaxP - genP) + genP #保证加扰动后的发电机出力不会超过最大值
return gen_vector
def read_results():
BusV = result[0]['bus'][:,7]
# 读取交流线结果数据
AClineP = result[0]['branch'][:, 13]
AClineQ = result[0]['branch'][:, 14]
# 读取发电机结果数据
GenP = result[0]['gen'][:,1]
GenQ = result[0]['gen'][:,2]
return BusV, AClineP, AClineQ, GenP
# 进行潮流计算结果异常与否的判定
def normalcheck(line_cap):
Bus_nums = 30
ACline_nums = 41 # TODO:更灵活和自适应的设备定义形式
Balance_Gen_id = [0, 1] # 平衡机标号 TODO:后续应该按照名称进行记录以保证稳定性
Balance_Gen_limit = 80 # 平衡机出力上限
BusV, AClineP, AClineQ, GenP = read_results() # 当前仅考虑电压越限
ob_current = list(BusV) + list(AClineP) + list(AClineQ)
done = False
r = 0
if any(BusV > 1.15) or any(BusV < 0.9):
done = True
elif len(ob_current) != (Bus_nums + ACline_nums * 2):
done = True
else:
Linetranspower = np.array(ob_current[Bus_nums:(Bus_nums + ACline_nums)])
line_rho = abs(Linetranspower) / line_cap #abs返回数字的绝对值,也就是AClineP部分的绝对值
b_gen_rho = GenP[Balance_Gen_id] / Balance_Gen_limit
if any(line_rho >= 1) or any(b_gen_rho > 1):
done = True
else:
done = False
return done
GenScenarioNum = 100
AvaScene = [] # 可用于训练的非正常场景
NormalScene = [] # 正常场景
for i in range(GenScenarioNum):
print("current step:", i)
# 设定场景初始配置
genmaxP = result[0]['gen'][:, 8]
genP = result[0]['gen'][:, 1]
genP_modif = Gen_vector(genmaxP, genP)
mpc = case30() #打开case30
mpc['gen'][:, 1] = genP_modif #修改发电机出力
#运行潮流计算
runpf(mpc)
# 进行潮流结果的判定并差异化存储
done = normalcheck(linecapacity)
if done:
AvaScene.append(genP_modif)
else:
NormalScene.append(genP_modif)
print(len(AvaScene))
print(len(NormalScene))
#np.save("AvaS", AvaScene)
#np.save("NormalS", NormalScene)
5. Matters needing attention
When using pypower, the biggest problem is that it is impossible to know the meaning of each column in the array at a glance, and it needs to be compared with matpower. For example here:
Want to get the active and reactive power of the AC line