Влияние напряжения базисного узла на потери в сети — различия между версиями

Материал из Wiki Power System
Перейти к: навигация, поиск
(Новая страница: «В статье представлены результаты расчётов Установившийся режим|установившихся режимо…»)
 
(Описание расчётов)
Строка 8: Строка 8:
 
import numpy as np
 
import numpy as np
 
import seaborn as sns
 
import seaborn as sns
 +
import matplotlib.pyplot as plt
 
import copy
 
import copy
import matplotlib.pyplot as plt
 
  
 
import pandas as pd
 
import pandas as pd
import pandapower as pp #импорт библиотеки pandapower
+
import pandapower as pp
 
import pandapower.networks as pn
 
import pandapower.networks as pn
net = pp.create_empty_network()#создание объекта "pandapowerNet" с именем net
 
  
 
#Настройки отрисовки графиков
 
#Настройки отрисовки графиков

Версия 20:11, 12 декабря 2018

В статье представлены результаты расчётов установившихся режимов с целью оценки влияния напряжения базисного узла на потери мощности в электрической сети. Расчёты выполнены с использованием библиотеки pandapower.

Описание расчётов

На первом этапе расчётов необходимо подключить все необходимые библиотеки:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import copy

import pandas as pd
import pandapower as pp
import pandapower.networks as pn

#Настройки отрисовки графиков
sns.set(style="whitegrid")
plt.rcParams['figure.figsize'] = (14, 6)

Далее выполним расчёт установившихся режимов для различных тестовых схем IEEE, которые есть в комплексте поставки библиотеки pandapower.

#Набор напряжений базисного узла для оценки
voltage = np.array([0.95, 0.975, 1.0,1.025,1.05,1.075,1.1,1.125,1.15,1.175])
#Тестовые схемы
NetCases = [
    (pn.case14(),'14 IEEE'),
    (pn.case30(),'30 IEEE'),
    (pn.case33bw(),'33bw IEEE'),
    (pn.case57(),'57 IEEE'),
    (pn.case118(),'118 IEEE'),
    (pn.case300(),'300 IEEE'),
    (pn.case1354pegase(),'1354pegase IEEE'),
    (pn.case9241pegase(),'9241pegase IEEE')
]
#Создание шаблона таблицы для хранения результатов
tbl=pd.DataFrame(columns=['Сеть','Режим','Сумм. потери','Напряжение','Уровень нагрузки'])
#Расчёты режимов
for net, nameNet in NetCases:
    tmp = calcDifferentSHN(net,nameNet) 
    tbl = pd.merge(tbl, tmp,  how = 'outer')
#Отрисовка результатов
plotProfi(tbl)

Функция для расчёта установившихся режимов с различными СХН в узлах и для различных значений напряжения базисного узла выглядит следующим образом:

def calcDifferentSHN(inNet,NetName):
    #Виды СХН рассматриваемых в расчётах
    cases = [
        (0,0,'I:0 %; Z:0 %'),
        (0,50,'I:0 %; Z:50 %'),
        (50,0,'I:50 %; Z:0 %'),
        (25,25,'I:25 %; Z:25 %'),
        (0,100,'I:0 %; Z:100 %'),
        (100,0,'I:100 %; Z:0 %'),
    ]
    #Уровни нагрузки, принятые в расчётах
    LoadCases =[
        (0.25,'S: 25 %'),
        (0.50,'S: 50 %'),
        (0.75,'S: 75 %'),
        (1.00,'S: 100 %')
    ]
    
    prof=pd.DataFrame(columns=['Режим','Сумм. потери','Напряжение','Уровень нагрузки'])
    for I, Z, nameGrid in cases:
        inNet.load['const_i_percent']=I
        inNet.load['const_z_percent']=Z
        tmpNet = copy.deepcopy(inNet)
        for s, nameS in LoadCases:
            tmpNet.load['p_kw']   = s * inNet.load['p_kw'] 
            tmpNet.load['q_kvar'] = s * inNet.load['q_kvar']  
            tmpNet.gen['p_kw']    = s * inNet.gen['p_kw']  
            tmp = calcDifferentVoltageBase(tmpNet,voltage,nameGrid)
            tmp['Уровень нагрузки'] = nameS
            #print(prof[prof['Уровень нагрузки']==nameS].head(10))
            prof = pd.merge(prof, tmp,  how = 'outer')
            
    outTable = prof
    outTable['Сеть'] = NetName
    return outTable

Расчёт суммарных продольных потерь мощности в сети выполнен следующим образом:

def calcDifferentVoltageBase(inNet,voltage,rgmName):    
    prof = np.empty(len(voltage))
    for i, v in enumerate(voltage):
        inNet.ext_grid[['vm_pu']]= v
        pp.runpp(net=inNet, max_iteration=1000)                
        prof[i] = calcSumLosses(inNet)
    dtAnanlise=pd.DataFrame(columns=['Режим','Сумм. потери','Напряжение'])
    dtAnanlise['Напряжение'] = voltage
    dtAnanlise['Сумм. потери'] = prof
    dtAnanlise['Режим'] = rgmName
    return dtAnanlise

Суммарные продольные потери мощности по группам сетевых элементов определены в следующих функциях:

def calcSumLosses(inNet):
    #Расчёт суммарных продольных потерь мощности
    dP1 = calcLossesTrafo(inNet)
    dP2 = calcLossesLine(inNet)     
    dP = dP1 + dP2
    return dP

def calcLossesTrafo (inNet):
    #Расчёт суммарных продольных потерь мощности в трансформаторах
    sum2W = inNet.res_trafo['pl_kw'].sum()
    sum3W = inNet.res_trafo3w['pl_kw'].sum()
    sum = sum2W + sum3W
    return sum

def calcLossesLine(inNet):
    #Расчёт суммарных продольных потерь в линиях электропередачи
    return inNet.res_line['pl_kw'].sum()

def calcTransportPower(inNet):
    #Расчёт суммарной нагрузки в сети
    dP = inNet.res_load['p_kw'].sum()
    return dP

Функция для визуализации полученных результатов расчётов.

def plotProfi(inTbl):
    # Получаем выборку уникальных меток интервалов
    netSeries = pd.unique(inTbl[['Сеть']].values.ravel('K'))     
    for singleNet in netSeries:        
        g = sns.lmplot(x="Напряжение", y="Сумм. потери",col="Уровень нагрузки", hue="Режим",col_wrap=2,
                       data=inTbl[inTbl['Сеть']==singleNet],fit_reg=False)            
        g.savefig(singleNet +'.jpg', dpi=300)

Результаты расчётов

Результаты расчёта продольных потерь мощности для 14 IEEE тестовой схемы.
Результаты расчёта продольных потерь мощности для 33bw IEEE тестовой схемы.


Результаты расчёта продольных потерь мощности для 118 IEEE тестовой схемы.
Результаты расчёта продольных потерь мощности для 9241pegase IEEE тестовой схемы.