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

Материал из Wiki Power System
Перейти к: навигация, поиск

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

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

Подключение библиотек

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

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):
    path = "" #Здесь можно указать путь до папки, относительно каталога со скриптом
    # Получаем выборку уникальных меток интервалов
    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(path + singleNet +'.jpg', dpi=300)

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

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

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

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

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

Файлы для загрузки

Файл со скриптом для Jupiter NoteBook.