Villamos hálózatok számítása gráfelmélet alkalmazásával

Tibenszky  Zoltán

II. éves villamosnérnök hallgató

Bevezető, elméleti összefoglaló

Bevezető

Villamos hálózatokban fellépő áramok, feszültségek és ezek kapcsolata a hálózatot alkotó elemek jellemzőitől és a hálózati elemek egymással való összekapcsolásának módjától függ. Egy elem árama és feszültsége közötti kapcsolat az elem jellemzőivel felírható. (Ilyen jellemző lehet a lineáris kétpólus R ellenállása, L induktivitása, C kapacitása, Ug forrásfeszültsége, Ig forrásárama) A hálózat komponensei közötti összekötetéseket egy gráf segítségével modellezhetjük. A hálózat gráfja a hálózat ágainak és csomópontjainak egymáshoz illeszkedését jellemzi függetlenül attól, hogy az ágakat milyen hálózati elemek alkotják. A hálózat ágainak a gráf élei, a hálózat csomópontjainak a gráf csúcsai felelnek meg. 
	Bizonyára sokmindenki előtt ismert, hogy egy villamos hálózat analíziséhez elégséges a Kirchoff törvények és a hálózatot felépítő elemek karakterisztikáinak (pl. U=I*R Ohm-törvény) ismerete. A programban alkalmazott számítási eljárás alapjai is ezek. A Kirchhoff-egyenletek felírásához a hálózat ágáramainak és ágfeszültségeinek vonatkozási irányát is figyelembe kell vennünk. Emiatt a hálózatot irányított gráffal jellemezhetjük. 
	Mivel villamos hálózatok esetében a hurokél két végpontja azonos potenciálú, ezért nem folyik rajta áram, és így nem tartalmaz ismeretlen mennyiséget, ugyanakkor nem is befolyásolja a többi ág jellemzőit. Emiatt a hurokélt elhagyhatjuk, és elégséges csak hurokélmentes gráfokat vizsgálnunk.

Gráfok és mátrixok kapcsolata

A gráfot izomorfia erejéig egyértelműen meghatároz egy mátrix. Több gráfot jellemző mátrix fordul elő az irodalomban, a leggyakoribbak: adjacencia- (csúcs-), incidencia- (illeszkedési-), kör- (hurok-) és vágatmátrix. Mivel a felhasznált források közül [1] és [2] másként értelmezi a csúcsmátrixot, ezért a dolgozatomban az adjacencia és incidencia elnevezéseket fogom használni. ([1] az incidenciamátrixot nevezi csúcsmátrix, míg az adjacenciamátrixot nem tárgyalja; [2] a felsorolásban használt terminológiát használja) Ezekhez mindig valamilyen szemléletes kép alapján juthatunk el. 
	Adjacencia mátrix: egy n×n-es kvadratikus mátrix, ahol n a gráf csúcsainak a száma. Megmondja, hogy mely csúcsok vannak összkötve. iAj megmutatja, hogy hány i kezdőpontú, j végpontú él van.
	Incidencia mátrix: egy nxb-s mátrix, ahol b a gráf éleinek száma. Megmutatja, hogy mely élek, mely pontokhoz illeszkednek. iBj=1, ha a j él kezdőpontja i, -1, ha cégpontja i és 0, ha nem illeszkedik az i ponthoz. Az incidencia mátrix egy speciális vágat mátrix.
	Hurok mátrix: egy mxb-s mátrix, ahol m a hálózat nullításainak(kötőágainak) száma. m=b-(n-c), ahol c a gráf komponenseinek száma. A körhöz irányítást is rendelhetünk. iHj=+-1, ha az i-edik kör tartalmazza a j-edik él. +1, ha a kör és az él irányítása megegyezik, -1, ha ellentétes, 0, ha nem tartalmazza. (A program bemeneti adatként a NEM redukált hurokmátrix kéri, azaz olyan hurokmátrixot, amelyet nem redukáltunk linárisan függetlenné)
	Vágatmátrix: rxm-es mátrix, ahol r a gráf rangja (a faágak száma), m pedig a kötőélek száma. iVj=1, ha az i-edik vágat tartalmazza a j-edik élt és irányításuk megegyezik, -1, ha ellentétes, és 0, ha nem tartalmazza.
	A gráfok éleit tetszlőges vonatkoztatási irányokkal elláthatjuk. Ezek alapján állapítjuk meg, hogy a gráf egy élet milyen előjellel kell figyelembe venni a mátrix felírásánál. Ekkor az élhez eredményként kapott áram, illetve feszültség "iránya" a vonatkoztatási iránnyal fog megegyezni. Tehát, ha pozitív értékeket kaptunk, akkor ezen mennyiségek irányának megfelelően vettük fel a vonatkoztatási irányt, ha negatívat, akkor azzal ellentétesen.

Élek számozása

A számításhoz a hálózat gráfjának olyan fáját választjuk, amelyben valamennyi áramforrásnak kötőél, valamennyi feszültségforrásnak faél felel meg, az impedanciáknak pedig kötőélek és faélek egyaránt megfelelhetnek. Az éleket négy csoportba  soroljuk az alábbiak szerint
  
  1. áramforrásnak megfelelő kötőélek (számuk:b1)
  2. impedanciának megfelelő kötőélek (számuk:b2)
  3. impedanciáknak megfelelő faélek (számuk:b3)
  4. feszültségforrásnak megfelelő faélek (számuk:b4)
  
 	Az impedanciákat lehetőleg úgy csoportosítjuk, hogy 2. és 3. csoportba tartozó ágak között ne legyen kölcsönös impedancia. 
A program b1 meghatározását a felhasználóra bízza, akárcsak a hurok mátrix előállítását.

A számítás elméleti összefoglalása

Az ágak sorszámozását a csoportosítás sorrendjének megfelelően végezzük. A számításokhoz a felvett fa által generált hurokrendszerben a hurkokat a megfelelő kötőélek, a vágatrendszer vágatait a megfelelő faélek sorszámának sorrendjében számozzuk. Az élek négy csoportjának megfelelően particionált mátrixokkal a hálózat hurokegyenletei: 
   (({{1, 0, F11, F12}, {0, 1, F21, F22}})) (({{U1}, {U2}, {U3}, {0}})) = - (({{1, 0, F11, F12}, {0, 1, F21, F22}})) (({{0}, {0}, {0}, {Ug}}))
,  ahol F11 sorainak száma b1, oszlopainak száma b3, F12 oszlopainak száma b3, F21 sorainak száma b2. 
Ebből:
   	U1 + F11 U3 = -F12 Ug
   	U2 + F12 U3 = -F22 Ug
   	
A vágategyenleteket is írjuk fel a particionált mátrixokkal, és vegyük figyelembe a hurokmátrix és a vágat mátrix közötti Q (B^T) = 0 kapcsolatból adódó összefüggést: (Az összefüggés bizonyítása megtalálható [2]-ben)
  		(({{-(F11^T), -(F21^T), 1, 0}, {-(F12^T), -(F22^T), 0, 1}})) (({{0}, {I2}, {I3}, {I4}}))= -(({{-(F11^T), -(F21^T), 1, 0}, {-(F12^T), -(F22^T), 0, 1}}))(({{Ig}, {0}, {0}, {0}}))
 	Korlátozzuk számítasainkat arra az esetre, amelynél a faéleknek és a kötőéleknek megfelelő ágak között nincs kölcsönös impedancia. Ekkor írható, hogy:
  	U2=Z2 I2;	I2=Y2 U2;	Y2=Z2^-1;
  	U3=Z3 I3;	I3=Y3 U3;	Y3=Z3^-1;
  Ezekből:  
 	U3=Z3 I3 = Z3 (F11^T) Ig + Z3 (F21^T) Y2 U2
 	U2=-(([1 + F21 Z3 (F21^T) Y2])^(-1)) [F22 Ug + F21 Z3 (F11^T) Ig]
 U2 ismeretében U3 és ezzel U1 meghatározható.
 Hasonlóképpen:
 	I2=-Y2 F21 U3-Y2 F22 Ug
 Ezt visszahelyettesítve kapjuk:
	 I3=[1 + (F21^T)Y2 F21 Z3]^-1 [(F11^T) Ig -(F21^T) Y2 F22 Ug]
I3 ismeretében I2 és ezzel I4 meghatározható. Ezzel a keresett mennyiségeket kiszámítottuk.

	Ha a kötőéleknek és faéleknek megfelelő ágakban van közös impedancia, akkor:
	(({{U2}, {U3}}))=(({{Z22, Z23}, {Z32, Z33}})) (({{I2}, {I3}}))
Ennek és a korábbiak felhasználásával:
	I2=-(([(Z22^T)F21 (Z32^T)((Z23^T)F21 Z33)(F21^T)])^(-1)) [F22 Ug + ((Z23^T)F21 Z33)(F11^T) Ig]

A bemeneti file alakja

A bemeneti fileban a következőképpen helyezkedjenek el az adatok:
   Először a b2+b3 as kvadratikus impedancia mátrix kerüljön a fileba, az egyes oszlopokat szóközzel vagy tabulátorral, a sorokat enterrel elválasztva.
   Ezután következik egy,a gráf éleire vonatkozó adat: b1 a hálózatban lévő áramforrások száma. Ebből a gráf többi paramétere kiszámítható.
   A fent leírt módon következzen az mxb-s (nem redukált) hurokmátrix, 
   majd az áramforrás(ok) árama(i) és a feszültségforrás(ok) feszültsége(i) egymástól enterrel elválasztva.

Egy Példa

1	0	0	0
0	2	0	0
0	0	3	0
0	0	0	4
1
1	0	0	1	-1	1
0	1	0	-1	1	-1
0	0	1	0	1	-1
1
1

A kimeneti file alakja

A kimeneti a következő vektorokat tartalmazza a következő sorrendben, egymástól új sor jellel elválasztva: a hálózat egyes ágainak áramát, feszültségét, látszólagos-, hazsnos- és meddő teljesítményét a bemeneti filenál részletezett módon, egy mátrixba rendezve.

Adatok beolvasása, szeparalasa

top = 
        OpenRead[
          InputString["Az adatokat tartalmazó \
állomány elérési útvonala:"]];
data = 
        ReadList[top, Number, 
          RecordLists -> True];
Close[top];

data // MatrixForm

Az adatokat az alapján választom szét, hogy mekkora a sorhosszuságuk (oszlopok száma). Problémaként felmerülhet, hogy két azonos oszlopszaámu mátrix kerül egymás alá, és a program egyként olvassa be. Emiatt volt szükseges az élszamok mátrixok közé helyezése. Ha az impedancia mátrix egy oszlopvektor, akkor csak egyetlen ellenállast tartalmaz (ezt az esetet elhanyagoljuk, hisz ehhez nem kell feltétlenül számítógép), ha a hurokmátrix oszlopvektor, akkor a hálozat egyetlen ágból áll. Ekkor  a hálozat ismeretlenei (az ág arama és feszültsége) zérusok.

valt = 
      Table[Dimensions[data[[k]]][[1]], {k, 
          Length[data]}]

If[
      valt[[1]] == 
        1, " Hiba!!!! \n Rossz adat. A program csak 1-nél t\
öbb impedanciájú hálózat eset\
én ad helyes eredmenyt"]

Az adatok szeparálásához felvettem a következő segédváltozókat, amiket a műveletek után megsemmisítettem: i, l

ClearAll[k];
val[k_Integer?Positive] := valt[[k]]

Table[val[i], {i, Length[data]}]

ClearAll[i];
i = NestWhile[#1 + 1 &, 1, val[#1] == val[#1 + 1] &]

Az elso (impedancia) matrix i sorbol all

Z = Table[data[[k]], {k, 1, i}]

Az élekre vonatkozó adatok számát előre tudjuk, összesen 1 van.

Az áramforrások száma:

b1 = data[[i + 1]][[1]]

ClearAll[l]
l = NestWhile[#1 + 1 &, i + 2, val[#1] == val[#1 + 1] &]

A hurokmátrix kifejezése:

B = Table[data[[h]], {h, i + 2, l}]

A forrásmennyiségek meghatározása:

A gráf egyes jellemzői

\(\(\(b = \(Dimensions[B]\)[\([2]\)];  (*\ 
      az\ élek\ száma . \ Ennyi\ oszlopa\ van\ B - 
        nek\ *) 
n = 
      b - MatrixRank[B] + 1;

    \(r = n - 1;\)

    \(\(m = \(Dimensions[B]\)[\([1]\)]\) \); \ \  (*\ 
      A\ kötőélek\ száma . \ 
            Ennyi\ hurok\ van\ a\ gráfban ==  > 
        B\ sorainak\ száma\ *) 
\(\(dz = \(Dimensions[Z]\)[\([1]\)]\) \); \)\(\ \)\( (*\ 
      Az\ ellenállások\ száma\ megegyezik\ a\ az\ impedanciamátrix\ számával\ *) \)\(\ \ \)\( (*\ \(! \(! \ A\ generátorokat\ két\ ágra\)\), \ 
      egy\ impedainciára\ \((konduktanciára)\) és\ egy\ ideális\ forrásra\ \(bontjuk\ !!\)\ *) \)\(
\)\)\)

B // MatrixForm

\(Ezekből\ meghatározhatjuk\ a\ négy\ ágosztályba\ tartozó\ ágak\ \(\(számát\)\(.\)\)\)

él = {b1, b2, b3, b4} = {b1, m - b1, dz - m + b1, 
          r - dz + m - b1}

TableForm[{{"A csúcsok száma: ", 
          n}, {"Az élek száma: ", 
          b}, {"A gráf rangja: ", 
          r}, {"A kötőágak száma: \
", m}}]

A hálózat forrásainak árama illetve feszültsége:

Ig = 
      Table[data[[p]][[1]], {p, l + 1, 
          l + b1}]
Ug = 
      Table[data[[q]][[1]], {q, l + b1 + 1, 
          l + b1 + b4}]

Remove[i, l]    (* 
      Segédváltozók felszabadítása *)

A mátrixok partícionálása:

Hurokmátrix

rrb = RowReduce[B];

% // MatrixForm

<< LinearAlgebra`MatrixManipulation`

MatrixForm[
      F11 = SubMatrix[
          rrb, {1, 1 + b1 + b2}, {b1, b3}]]
MatrixForm[
      F12 = SubMatrix[
          rrb, {1, 1 + b1 + b2 + b3}, {b1, b4}]]
MatrixForm[
      F21 = SubMatrix[
          rrb, {1 + b1, 1 + b1 + b2}, {b2, b3}]]
MatrixForm[
      F22 = SubMatrix[rrb, {1 + b1, 1 + b1 + b2 + b3}, {b2, b4}]]

Vágatmátrix

MatrixForm[-Transpose[F11]]
MatrixForm[-Transpose[F21]]
MatrixForm[-Transpose[F12]]
MatrixForm[-Transpose[F22]]

Egyes itt most még nem tárgyalt algoritmusok esetén szükség lehet a vágatmátrixra. A hurok és a vágatmátrix közti összefüggés értelmében: B Q=0. Ebből következik a következő művelet.

Q = 
      BlockMatrix[{{-Transpose[F11], -Transpose[F21], 
              IdentityMatrix[b3], 
              ZeroMatrix[b3, b4]}, {-Transpose[F12], -Transpose[F22], 
              ZeroMatrix[b4, b3], IdentityMatrix[b4]}}] // 
        MatrixForm

Impedancimátrix

Z // MatrixForm

MatrixForm[
      Z22 = SubMatrix[Z, {1, 1}, {b2, b2}]]
MatrixForm[
      Z23 = SubMatrix[Z, {1, b2 + 1}, {b2, b3}]]
MatrixForm[
      Z32 = SubMatrix[Z, {b2 + 1, 1}, {b3, b2}]]
MatrixForm[Z33 = SubMatrix[Z, {b2 + 1, b2 + 1}, {b3, b3}]]

A számolás

A keresett ismeretlenek :  i = (({{Ig}, {I2}, {I3}, {I4}})), illetve u = (({{U1}, {U2}, {U3}, {Ug}})). A korábban elmondottak alapján

I2 = -Inverse[
            Z22 + F21 . Z32 + (Z23 + F21 . Z33) . 
                Transpose[F21]] . (F22 . Ug + (Z23 + F21 . Z33) . 
                Transpose[F11] . Ig)

I3 = 
      Transpose[F11] . Ig + Transpose[F21] . I2
I4 = 
      Transpose[F12] . Ig + Transpose[F22] . I2
U2 = Z22 . I2 + Z23 . I3
U3 = Z32 . I2 + Z33 . I3
U1 = -F12 . Ug - F11 . U3

Az eredmények kifejezése az ágak sorszámozásának megfelelő sorrendben:

i=Join[Ig, I2, I3, 
        I4]

u=Join[U1, U2, U3, 
        Ug]    (* ágfeszültségek *)

S = u*i

P=Re[
        S]

Q=Im[
        S]

Értékek fileba mentése

writeMatrix[allomanynev_String, matrix_List, 
        elvalaszto_String: "\t"] := 
      With[{belsonev = OpenWrite[allomanynev]},  
        Scan[(WriteString[belsonev, First[#]]; 
              Scan[WriteString[belsonev, elvalaszto, #] &, Rest[#]]; 
              WriteString[belsonev, "\n"]) &, matrix]; 
        Close[belsonev]]

writeMatrix[
        InputString["Az eredmény file neve és elér\
ési útvonala: "], {N[i], N[u], N[S], N[P], 
          N[Q]}];

Továbbfejlesztési lehetőségek

*A hálózat gráfjának kirajzolása nem készült el.
    Sajnos a Mathematica nem tudja ábrázolni a körmátrix segítségével a gráfot, csupán az adjacencia mátrix segítségével. Algoritmus előállítása az adjacenciamátrix egy megadására a körmátrix segítségével, bár az adjacenciamátrix előállítása körmátrixból még az izomorfia erejéig sem egyértelmű. 
*A gráfot reprezentáló mátrix megválasztásának lehetővé tétele. Tehát ne legyen csak a hurokmátrix legyen bemenő adat. (A program a hurokmátrixból előállítja a vágatmátrixot)
*Más számítási algoritmusok megvalósítása és összehasonlítása:     csomóponti potenciálok -, hurokáramok-, vágatfeszültségek módszer ; én egy kétfajta forrásra készült algoritmust alkalmaztam, emiatt feladat lehet még
*Egyfajta forrást tartalmazó hálózatok esetének figyelembevétele, és esetleg
*forrás nélküli hálózat esetén eredő imitancia számítása

Felhasznált irodalom

[1]  Dr. Vágó István: A gráfelmélet alkalmazása villamos hálózatok számításában,  1976, Műszaki Könyvkiadó, Budapest.
[2]  Andrásfai Béla: Gráfelmélet: Folyamok, mátrixok, 1983, Akadémiai Kiadó, Budapest.
[3]  Szili László - Tóth János: Matematika és Mathematica, 1996, ELTE Eötvös Kiadó, Budapest.