停止中の制御可能な発電機と稼働中の制御不能な発電機を組み合わせようとしたときに pandapower の OPF AC で生成されるエラーを解決する方法を知っている人はいますか?
最小限の例:
import pandapower as pp
net = pp.create_empty_network()
bus = pp.create_bus(net, vn_kv=110., name="Bus 2")
pp.create_ext_grid(net, bus=bus, vm_pu=1.00, name="Grid Connection")
pp.create_gen(net, bus=bus, p_mw=5, min_p_mw = 5, max_p_mw = 20, name='gen 1')
pp.create_gen(net, bus=bus, p_mw=5, min_p_mw = 5, max_p_mw = 20, name='gen 3')
net.gen[['in_service', 'controllable']] = [[False, True],
[True, False]]
pp.runopp(net,verbose = True)
出力:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-37-47fe18b0aa9e> in <module>
9 [True, False]]
10
---> 11 pp.runopp(net,verbose = True)
C:\Users\Daniel Rueda\.conda\envs\Tesis\lib\site-packages\pandapower\run.py in runopp(net, verbose, calculate_voltage_angles, check_connectivity, suppress_warnings, switch_rx_ratio, delta, init, numba, trafo3w_losses, consider_line_temperature, **kwargs)
355 _check_bus_index_and_print_warning_if_high(net)
356 _check_gen_index_and_print_warning_if_high(net)
--> 357 _optimal_powerflow(net, verbose, suppress_warnings, **kwargs)
358
359
C:\Users\Daniel Rueda\.conda\envs\Tesis\lib\site-packages\pandapower\optimal_powerflow.py in _optimal_powerflow(net, verbose, suppress_warnings, **kwargs)
39 init_results(net, "opf")
40
---> 41 ppc, ppci = _pd2ppc(net)
42
43 if not ac:
C:\Users\Daniel Rueda\.conda\envs\Tesis\lib\site-packages\pandapower\pd2ppc.py in _pd2ppc(net, sequence)
113 aux._set_isolated_buses_out_of_service(net, ppc)
114
--> 115 _build_gen_ppc(net, ppc)
116
117 if "pf" in mode:
C:\Users\Daniel Rueda\.conda\envs\Tesis\lib\site-packages\pandapower\build_gen.py in _build_gen_ppc(net, ppc)
51 _init_ppc_gen(net, ppc, f)
52 for element, (f, t) in gen_order.items():
---> 53 add_element_to_gen(net, ppc, element, f, t)
54 net._gen_order = gen_order
55
C:\Users\Daniel Rueda\.conda\envs\Tesis\lib\site-packages\pandapower\build_gen.py in add_element_to_gen(net, ppc, element, f, t)
80 _build_pp_ext_grid(net, ppc, f, t)
81 elif element == "gen":
---> 82 _build_pp_gen(net, ppc, f, t)
83 elif element == "sgen_controllable":
84 _build_pp_pq_element(net, ppc, "sgen", f, t)
C:\Users\Daniel Rueda\.conda\envs\Tesis\lib\site-packages\pandapower\build_gen.py in _build_pp_gen(net, ppc, f, t)
220 ppc = _check_gen_vm_limits(net, ppc, gen_buses, gen_is)
221 if "controllable" in net.gen.columns:
--> 222 ppc = _enforce_controllable_vm_pu_p_mw(net, ppc, gen_is, f, t)
223
224
C:\Users\Daniel Rueda\.conda\envs\Tesis\lib\site-packages\pandapower\build_gen.py in _enforce_controllable_vm_pu_p_mw(net, ppc, gen_is, f, t)
184 # if there are some non controllable gens -> set vm_pu and p_mw fixed
185 if np.any(not_controllable):
--> 186 bus = net["gen"]["bus"].values[not_controllable]
187 vm_pu = net["gen"]["vm_pu"].values[not_controllable]
188 p_mw = net["gen"]["p_mw"].values[not_controllable]
IndexError: boolean index did not match indexed array along dimension 0; dimension is 2 but corresponding boolean dimension is 1
エラーを分析していたところ、次のことがわかりました。
- 最初に、ブール値の <class 'numpy.ndarray'> が、ジェネレーターのオンまたはオフの状態で作成されます。
[False, True]
- 次に、以前に作成された配列 (サービス中のジェネレーターのみ) に応じて、ジェネレーターが制御可能である場合は、ジェネレーターの特性を使用して Boolean <class 'numpy.ndarray'> が作成されます。
[False]
- この配列に対して、各要素のブール論理が反転され、以前に作成された配列に基づいて、制御可能でない場合に発電機の特性を持つ配列が取得されます (使用中の発電機のみ)。
[True]
- 最後に、制御可能なジェネレーターが接続されているバスのインデックスを使用して <class 'numpy.ndarray'> が作成されますが、ここでエラーが生成されます。これは、配列に含まれるジェネレーターが使用されていない pandas シリーズのディメンションが使用されていないためです。 while 配列は、すでに稼働中の発電機のみと見なされている制御可能な特性をフィルタリングします