├── ieee39电流数据.csv ├── ieee39N-1电压数据.csv ├── ieee39N-1电压数据分析.csv ├── README.md ├── fault.py ├── short_data.csv ├── ieee39功率损耗及电流.csv ├── general_loss_current.csv ├── ieee39节点电压及功率.csv ├── Y_None_None.csv ├── my_flow_cal.py ├── my_flow_cal_PQ.py ├── 039ieee.DAT └── 039ieeeTest.DAT /ieee39电流数据.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whkwss/Power-flow-calculation/HEAD/ieee39电流数据.csv -------------------------------------------------------------------------------- /ieee39N-1电压数据.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whkwss/Power-flow-calculation/HEAD/ieee39N-1电压数据.csv -------------------------------------------------------------------------------- /ieee39N-1电压数据分析.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whkwss/Power-flow-calculation/HEAD/ieee39N-1电压数据分析.csv -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 电力系统潮流计算 2 | 3 | ## content 4 | 5 | 分别使用牛拉法和PQ分解法进行潮流计算以及N-1校核,数据计算结果使用powerworld核对过无误。 6 | 7 | ## other things 8 | 9 | 使用语言:python 10 | 11 | 使用数据:符合ieee标准的数据。 12 | 13 | 为《电力系统课程设计》代码部分。主要参考《电力系统分析》(上下两本),代码原创,各位同学可参考,切勿照搬! -------------------------------------------------------------------------------- /fault.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | data_U = pd.read_csv("ieee39节点电压及功率.csv", encoding='utf-8',index_col=0) 4 | 5 | U = np.array(data_U["V"]) 6 | S = np.array(data_U["S_node"]) 7 | # 8 | # 读取导纳矩阵 9 | Y = pd.read_csv("Y_None_None.csv",index_col=0).to_numpy() 10 | 11 | # 把读取的字符串转化成复数 12 | for i,line in enumerate(Y) : 13 | for j,row in enumerate(line): 14 | Y[i][j]=complex(Y[i][j]) 15 | 16 | for i,line in enumerate(U) : 17 | U[i]=complex(line) 18 | # 读取节点数据 19 | bus_data_list =pd.read_csv('bus_data.csv',index_col=0) 20 | bus_data_list.set_index(['Bus number'],inplace=True) 21 | node_list = bus_data_list.index.values 22 | # print(node_list) 23 | # 各节点自导纳 24 | 25 | gen_x_dict = {30:complex(0,0.031),31:complex(0,0.0697),32:complex(0,0.0531),33:complex(0,0.0436),34:complex(0,0.132),35:complex(0,0.05),36:complex(0,0.049),37:complex(0,0.057),38:complex(0,0.057),39:complex(0,0.006)} 26 | # gen_x_loc_list = list(gen_x_dict.keys()) 27 | gen_num = len(gen_x_dict) 28 | bus_num = len(node_list) 29 | for node_num in node_list: 30 | bus_data = bus_data_list.loc[node_num] 31 | # 数组的实际索引是节点数-1 32 | node_num = node_num-1 33 | # 修改节点导纳矩阵 34 | # 修改负荷影响的部分 35 | 36 | # 获取该母线数据 37 | loadP = float(bus_data['Load MW'])/100 38 | loadQ = float(bus_data['Load MVAR'])/100 39 | loadS = complex(loadP,loadQ) 40 | my_U = U[node_num] 41 | # 由于负荷接地,修改自导纳即可 42 | if loadP != 0 or loadQ != 0: 43 | Z_ld = loadS * (abs(my_U) ** 2) / (abs(loadS) ** 2) 44 | Y[node_num][node_num] += 1/Z_ld 45 | # Y[node] 46 | # 修改由电机影响的部分 47 | if node_num+1 in gen_x_dict: 48 | xt = gen_x_dict[node_num+1] 49 | Y[node_num][node_num] += 1 / xt 50 | # # 求节点阻抗矩阵 51 | Y = Y.astype(np.complex) 52 | Y = np.around(Y,decimals=2) 53 | pd.DataFrame(Y).to_csv('fault_y1.csv') 54 | # short_data = pd.DataFrame({'I':I,'S':S,'Sn':Sn}) 55 | I = np.zeros([len(node_list)],dtype=complex) 56 | S = np.zeros([len(node_list)],dtype=complex) 57 | Sn = np.zeros([len(node_list)],dtype=complex) 58 | Z = np.linalg.inv(Y) 59 | for node_num in node_list: 60 | # 数组的实际索引是节点数-1 61 | node_num = node_num - 1 62 | # 计算短路电流有名值 63 | I[node_num] = U[node_num] / Z[node_num][node_num] 64 | S[node_num] = abs(I[node_num]) 65 | Sn[node_num] = S[node_num] * 100 66 | short_data = pd.DataFrame({'I':abs(I),'S':S,'Sn':Sn}) 67 | short_data.to_csv('short_data.csv') 68 | # 69 | # print('计算结束') 70 | # print('abs( I)=') 71 | # print(abs( I)) 72 | # print('Sn=') 73 | # print( Sn) 74 | # 75 | # if __name__ == '__main__': 76 | # my_flaut = Flaut() 77 | -------------------------------------------------------------------------------- /short_data.csv: -------------------------------------------------------------------------------- 1 | ,I,S,Sn 2 | 0,51.079537378181655,(51.079537378181655+0j),(5107.953737818166+0j) 3 | 1,76.03816739444788,(76.03816739444788+0j),(7603.816739444788+0j) 4 | 2,67.49620649060364,(67.49620649060364+0j),(6749.620649060364+0j) 5 | 3,62.20260153925783,(62.20260153925783+0j),(6220.260153925783+0j) 6 | 4,61.12740493209407,(61.12740493209407+0j),(6112.740493209408+0j) 7 | 5,61.902957274483065,(61.902957274483065+0j),(6190.295727448306+0j) 8 | 6,51.74865223999944,(51.74865223999944+0j),(5174.865223999944+0j) 9 | 7,53.90967734305446,(53.90967734305446+0j),(5390.967734305446+0j) 10 | 8,49.21988518126128,(49.21988518126128+0j),(4921.988518126128+0j) 11 | 9,56.930366363571714,(56.930366363571714+0j),(5693.036636357171+0j) 12 | 10,56.24472682895749,(56.24472682895749+0j),(5624.472682895749+0j) 13 | 11,26.578040037181108,(26.578040037181108+0j),(2657.804003718111+0j) 14 | 12,55.016140118427664,(55.016140118427664+0j),(5501.614011842767+0j) 15 | 13,59.34984505926704,(59.34984505926704+0j),(5934.984505926704+0j) 16 | 14,58.50871478889408,(58.50871478889408+0j),(5850.8714788894085+0j) 17 | 15,76.94166796827176,(76.94166796827176+0j),(7694.166796827176+0j) 18 | 16,67.76594832756027,(67.76594832756027+0j),(6776.594832756026+0j) 19 | 17,59.65335160046676,(59.65335160046676+0j),(5965.335160046677+0j) 20 | 18,52.199582681524795,(52.199582681524795+0j),(5219.95826815248+0j) 21 | 19,37.186946921739136,(37.186946921739136+0j),(3718.6946921739136+0j) 22 | 20,54.03568844873427,(54.03568844873427+0j),(5403.568844873427+0j) 23 | 21,56.0251630901384,(56.0251630901384+0j),(5602.51630901384+0j) 24 | 22,53.05687117790738,(53.05687117790738+0j),(5305.687117790738+0j) 25 | 23,59.236320817882365,(59.236320817882365+0j),(5923.632081788237+0j) 26 | 24,61.846707276307185,(61.846707276307185+0j),(6184.670727630719+0j) 27 | 25,46.50838278717744,(46.50838278717744+0j),(4650.838278717744+0j) 28 | 26,46.80747807674713,(46.80747807674713+0j),(4680.747807674713+0j) 29 | 27,27.712212664106286,(27.712212664106286+0j),(2771.2212664106287+0j) 30 | 28,31.31663650741574,(31.31663650741574+0j),(3131.663650741574+0j) 31 | 29,63.09731298464579,(63.09731298464579+0j),(6309.731298464579+0j) 32 | 30,37.87676339682639,(37.87676339682639+0j),(3787.676339682639+0j) 33 | 31,43.36373054785601,(43.36373054785601+0j),(4336.373054785601+0j) 34 | 32,48.27234994439667,(48.27234994439667+0j),(4827.234994439667+0j) 35 | 33,28.1704337161652,(28.1704337161652+0j),(2817.04337161652+0j) 36 | 34,48.06340568576384,(48.06340568576384+0j),(4806.340568576384+0j) 37 | 35,41.57839771571443,(41.57839771571443+0j),(4157.839771571443+0j) 38 | 36,41.893464446531894,(41.893464446531894+0j),(4189.34644465319+0j) 39 | 37,32.255791039844794,(32.255791039844794+0j),(3225.5791039844794+0j) 40 | 38,195.34831336147664,(195.34831336147664+0j),(19534.831336147665+0j) 41 | -------------------------------------------------------------------------------- /ieee39功率损耗及电流.csv: -------------------------------------------------------------------------------- 1 | ,branch,loss,current 2 | 0,"(2, 1)",(0.4514461059700231-71.47377496954519j),2.4033201540233446 3 | 1,"(39, 1)",(0.17327780589205533-76.6022955725448j),3.1946055155650166 4 | 2,"(3, 2)",(1.704503791725916-8.005818953627072j),1.3417306649713674 5 | 3,"(25, 2)",(3.9849218711457266-11.30042622298362j),1.8978912252928128 6 | 4,"(4, 3)",(0.2592546931879417-18.66044651030851j),1.7073708221598023 7 | 5,"(18, 3)",(0.012229142428505204-22.57199571233852j),2.374424715392527 8 | 6,"(5, 4)",(0.21091151412584797-10.164142686488194j),1.6255233599818835 9 | 7,"(14, 4)",(0.5591482862501672-5.019536500926853j),1.1412966160563136 10 | 8,"(6, 5)",(0.46304135681845027+1.6256179379545888j),1.4699117510460031 11 | 9,"(8, 5)",(0.834253492749157-3.091771204639035j),0.9750166588451828 12 | 10,"(7, 6)",(1.1283515165061653+5.955116867124075j),1.4803328051635343 13 | 11,"(11, 6)",(0.8206572534745875-4.55439558799967j),1.3690795410967962 14 | 12,"(8, 7)",(0.14699810061676435-6.050538327923842j),2.090276063518605 15 | 13,"(9, 8)",(0.1838104204004318-36.06039332647646j),1.8178962912388454 16 | 14,"(39, 9)",(0.002469614565424094-127.01067453938819j),4.113541666117709 17 | 15,"(11, 10)",(0.48869260114601026-2.253633751596272j),1.3341366864082558 18 | 16,"(13, 10)",(0.36103423976994575-3.6382412272048006j),1.6798841325783067 19 | 17,"(14, 13)",(0.7672301758321646-9.069557669865425j),1.7297654877100392 20 | 18,"(15, 14)",(0.026803439254058675-37.291042494502314j),2.389281564195382 21 | 19,"(16, 15)",(0.9093271715656638-8.435074196713614j),1.7305479937341723 22 | 20,"(17, 16)",(0.28707191502026286-10.673319874720887j),1.9966551807740232 23 | 21,"(19, 16)",(3.080883832606776+4.593656744828809j),0.9707355684269497 24 | 22,"(21, 16)",(0.8213716758070376-13.285431705795842j),1.811314781621394 25 | 23,"(24, 16)",(0.02996680074921394-6.695053412699152j),1.9436238255209304 26 | 24,"(18, 17)",(0.24461339219649642-11.199235606097115j),2.1300513802438994 27 | 25,"(27, 17)",(0.009754364924977468-34.3842732571004j),2.5703063945891844 28 | 26,"(22, 21)",(2.784704602872344+20.931878470300724j),2.2404245123103443 29 | 27,"(23, 22)",(0.02472858624922923-19.858877688248363j),2.6233605626998804 30 | 28,"(24, 23)",(2.5300833854762206+1.1027311106615896j),0.5121863775468398 31 | 29,"(26, 25)",(0.1712803907924005-55.352118971070105j),2.3842171688810407 32 | 30,"(27, 26)",(0.9937147044845367-15.734715667292761j),1.8865224607998987 33 | 31,"(28, 26)",(0.7883769274468291-77.51673498293368j),2.3300717999055336 34 | 32,"(29, 26)",(1.9137596607691063-92.69301690799377j),2.2190639820939055 35 | 33,"(29, 28)",(1.5563534488787087-10.66938228453089j),1.5394913235898617 36 | 34,"(12, 11)",(0.028884616227991298+0.7853005036985133j),0.24530854817620032 37 | 35,"(12, 13)",(0.034644810067352996+0.9419057737061596j),0.26865719353912476 38 | 36,"(6, 31)",92.98348545414471j,3.5210507040587515 39 | 37,"(10, 32)",96.18874759386568j,4.003930310621171 40 | 38,"(19, 33)",(2.8952268863273805+58.73174540835539j),3.7130573247388785 41 | 39,"(20, 34)",(2.511375454613013+50.22750909226033j),3.049818121239495 42 | 40,"(22, 35)",60.662030681215306j,3.760363478724468 43 | 41,"(23, 36)",(1.4309392049945608+77.84309275170412j),3.0886234312333607 44 | 42,"(25, 37)",(1.6562357986659226+64.04111754841567j),3.0333661158172878 45 | 43,"(2, 30)",13.77416680109068j,1.5926955041354611 46 | 44,"(29, 38)",(5.234218097843758+102.06725290795329j),4.670036624519019 47 | 45,"(19, 20)",(0.218437385110568+4.306337020751197j),1.0198911825954953 48 | -------------------------------------------------------------------------------- /general_loss_current.csv: -------------------------------------------------------------------------------- 1 | ,branch,loss,current 2 | 0,"(2, 1)",(0.44993265474414096-71.58423400546155j),196381.40472286684 3 | 1,"(39, 1)",(0.174979012061785-76.58743791533968j),229115.04450501487 4 | 2,"(3, 2)",(1.6838818837642706-8.321210736143083j),623368.3718496826 5 | 3,"(25, 2)",(3.9818118898607846-11.331141009720817j),413096.93897925905 6 | 4,"(4, 3)",(0.2621554052746722-18.69547777321766j),245962.19469103785 7 | 5,"(18, 3)",(0.013546784700566483-22.66347580235708j),60783.0374825826 8 | 6,"(5, 4)",(0.20992291502085228-10.219513457259904j),280572.79471256596 9 | 7,"(14, 4)",(0.55967799018334-5.0640934056816524j),458125.7974822557 10 | 8,"(6, 5)",(0.4610520562596216+1.5895914472667232j),831611.7389680309 11 | 9,"(8, 5)",(0.8337680875473994-3.132358260284472j),559162.7963574425 12 | 10,"(7, 6)",(1.1262016455770982+5.896953682463322j),750400.4416233703 13 | 11,"(11, 6)",(0.8192173793253595-4.60386491241601j),592531.1490276364 14 | 12,"(8, 7)",(0.14668186147627232-6.07115602315877j),331679.65886862035 15 | 13,"(9, 8)",(0.1767370632140184-36.23055300759786j),151831.02587817685 16 | 14,"(39, 9)",(0.0022325076731062924-127.07172714414115j),25879.57306316873 17 | 15,"(11, 10)",(0.48790854001045725-2.279982981484675j),604922.6438213758 18 | 16,"(13, 10)",(0.3584674686190341-3.6857774922117454j),518508.0534227752 19 | 17,"(14, 13)",(0.7651158008332094-9.155274805873871j),505013.4654419983 20 | 18,"(15, 14)",(0.03449594208152771-37.42241944709199j),75824.29478903594 21 | 19,"(16, 15)",(0.9255492619081903-8.417107011939773j),555442.5448559583 22 | 20,"(17, 16)",(0.279714089643291-10.881009176899562j),346233.2551763071 23 | 21,"(19, 16)",(3.039923955863288+3.8923919879332884j),754974.0006943061 24 | 22,"(21, 16)",(0.8113134325064386-13.79576281894942j),551581.8499460568 25 | 23,"(24, 16)",(0.03474751920798816-6.670634259850738j),186406.86470188852 26 | 24,"(18, 17)",(0.24559289566183753-11.276107820217476j),324428.8799425654 27 | 25,"(27, 17)",(0.006588314396133464-34.630302661951475j),38992.05361688004 28 | 26,"(22, 21)",(2.7808075764553157+20.330072433835056j),1021177.184023783 29 | 27,"(23, 22)",(0.053982602457164006-19.77476759972494j),164290.29560075066 30 | 28,"(24, 23)",(2.490825014897448-0.02434918198669922j),582801.8158661865 31 | 29,"(26, 25)",(0.17015951760370038-55.50092984243541j),126303.02757791204 32 | 30,"(27, 26)",(0.9796873237420668-15.989102758560511j),458184.4584277478 33 | 31,"(28, 26)",(0.7888229279155541-77.72426591388984j),234593.6012800653 34 | 32,"(29, 26)",(1.9141679319309237-92.93875997585046j),317404.60082982935 35 | 33,"(29, 28)",(1.555679551213458-10.715571188904525j),577373.279457454 36 | 34,"(12, 11)",(0.028381079749095435+0.7716106056785319j),49188.11225328574 37 | 35,"(12, 13)",(0.03501302257269155+0.9519165511950515j),57425.209178652534 38 | 36,"(6, 31)",(5.551115123125783e-15+92.50016365111861j),1068313.9838279476 39 | 37,"(10, 32)",(2.7755575615628914e-15+95.71279484247658j),1244734.1133207115 40 | 38,"(19, 33)",(2.8788116535766224+58.39875068684004j),1314947.6989364673 41 | 39,"(20, 34)",(2.496271123662144+49.925422473242804j),893471.2522067059 42 | 40,"(22, 35)",62.54022200639877j,1088053.1394862733 43 | 41,"(23, 36)",(1.407056469136974+76.54387192105136j),918822.0075086274 44 | 42,"(25, 37)",(1.6562845749867297+64.04300356615354j),948454.9331913856 45 | 43,"(2, 30)",(1.3877787807814457e-15+13.531962419630291j),423932.94912795513 46 | 44,"(29, 38)",(5.232993553153899+102.04337428650108j),1443052.519095009 47 | 45,"(19, 20)",(0.21719468161693622+4.281838009019597j),813120.712747714 48 | -------------------------------------------------------------------------------- /ieee39节点电压及功率.csv: -------------------------------------------------------------------------------- 1 | ,V,V_amp,V_angle,S_node 2 | 1,(1.032962510636377-0.17416908683773488j),1.0475430393020124,-9.570692352242872,(-2.911940554227284e-09-5.438866078470892e-10j) 3 | 2,(1.041112002167025-0.12803659078588384j),1.0489554659928626,-7.011065783551636,(-6.567627115972934e-09-1.1943226762485078e-09j) 4 | 3,(1.0152067134244032-0.176416784041645j),1.0304210560123346,-9.858087878628252,(-322.00000000599505-2.399999999891489j) 5 | 4,(0.9865019028544977-0.1855919187934889j),1.003807932154849,-10.654595530278948,(-500.0000000086468-183.99999999556132j) 6 | 5,(0.9913264457623066-0.1653346272970066j),1.0050192341697581,-9.46870774278531,(6.834468939427495e-11+1.6669870215146082e-10j) 7 | 6,(0.9955957119548814-0.15353600756861419j),1.0073649424528615,-8.766817890565003,(5.256403256973369e-10+1.5933747612808819e-09j) 8 | 7,(0.978484014741763-0.18967030983396344j),0.9966974433285511,-10.970221303502456,(-233.80000000324307-83.99999999696726j) 9 | 8,(0.9758187506006233-0.19811106540954374j),0.9957259805094301,-11.476232888134767,(-522.000000008138-175.99999999223672j) 10 | 9,(1.008163437886979-0.20144494093300855j),1.0280922048724987,-11.299672504222213,(-2.300611255117331e-09+1.878811373672772e-09j) 11 | 10,(1.0107223610383391-0.11304185794133334j),1.0170241652732461,-6.3815908356818545,(-4.611146309994162e-10+1.0419434305180353e-09j) 12 | 11,(1.0045565624351291-0.12681995116459835j),1.0125300919700484,-7.195224967466966,(-2.9798819798921242e-12-2.8630061844605016e-11j) 13 | 12,(0.9920926198218027-0.1255175017019651j),1.0000012047684697,-7.210633091177804,(-8.500000000444492-88.0000000001802j) 14 | 13,(1.0064244773489035-0.1252836065943984j),1.014192393329941,-7.095896981787884,(-7.978523667032211e-13-1.297208360263295e-11j) 15 | 14,(0.9999165508769773-0.15416551693678388j),1.01173124659175,-8.764756537938588,(-1.5185157030874087e-11+3.8566643815429167e-10j) 16 | 15,(1.0027727770531718-0.16206765083248384j),1.0157849998130952,-9.180729254392087,(-320.0000000055314-153.00000000082088j) 17 | 16,(1.022760544532054-0.1396750112934094j),1.0322539611119532,-7.776586835234628,(-329.0000000047276-32.30000000094453j) 18 | 17,(1.0218526222579796-0.15773124449780715j),1.0339545092054758,-8.774815039886514,(-3.5404159441008934e-10+4.0626301915452775e-10j) 19 | 18,(1.0168061933614414-0.1722644645376831j),1.0312952441472032,-9.615588482096898,(-158.0000000030024-30.000000000443933j) 20 | 19,(1.0484198802496136-0.057743298170316336j),1.0500088255753854,-3.1524660240223494,(-4.61351154578527e-09-7.388335775941861e-09j) 21 | 20,(0.9878149861732729-0.07885133583583255j),0.9909571030431129,-4.563900750965407,(-680.000000004379-103.00000000415928j) 22 | 21,(1.0275669403784595-0.09660928383732176j),1.0320984307140035,-5.371018251386142,(-274.00000000193313-115.00000000154809j) 23 | 22,(1.0498394019504043-0.016930294326996862j),1.0499759067490935,-0.9239035334703163,(1.0373256914625258e-10-4.70092402732979e-09j) 24 | 23,(1.044775562728945-0.020464274000894612j),1.0449759628747293,-1.1221229306073552,(-247.5000000007083-84.6000000014641j) 25 | 24,(1.0284957106669832-0.13827171246219766j),1.0377487621421726,-7.656975082321223,(-308.60000000456097+92.20000000018868j) 26 | 25,(1.0523836257396606-0.10410062428291587j),1.0575198512089723,-5.6492570775554025,(-224.00000000373282-47.200000003372175j) 27 | 26,(1.0445222720295932-0.12650826442960922j),1.0521554627215768,-6.905794321717323,(-139.000000003585-17.000000000786166j) 28 | 27,(1.0254025423369406-0.1608906231141812j),1.0379480557509277,-8.917280950785093,(-281.0000000049277-75.50000000197932j) 29 | 28,(1.0483214805425753-0.062175115876068554j),1.0501636403919057,-3.3941912016636664,(-206.00000000092-27.600000001144746j) 30 | 29,(1.04990632570376-0.011637791631453745j),1.0499708238550378,-0.6350747868014125,(-283.4999999992682-26.900000004048824j) 31 | 30,(1.0441378832219035-0.08385899374309073j),1.0475000000051176,-4.591802937366654,(250.00000001369406+144.91930713269693j) 32 | 31,(0.982+0j),0.982,0.0,(563.6349885322584+202.4362275151645j) 33 | 32,(0.98270924416076+0.027715545144137124j),0.9831000000008386,1.615496074404325,(650.0000000074889+205.7308969455587j) 34 | 33,(0.9965526258291835+0.03592636863735415j),0.9972000000052685,2.064655886877321,(632.0000000105582+108.93531126297896j) 35 | 34,(1.0122395254883982+0.011064946932641938j),1.0123000000057294,0.6262840902558446,(508.000000008578+166.9861061218756j) 36 | 35,(1.0466964887138421+0.07387117518370248j),1.0493000000042445,4.036987127347595,(650.0000000081275+211.11169887322686j) 37 | 36,(1.0561728714455054+0.12462389670405262j),1.0635000000033599,6.729541081448644,(560.0000000053291+100.43743188532059j) 38 | 37,(1.0275981732045678+0.020367484813918042j),1.0278000000053562,1.135480940153862,(540.0000000102091+0.647340517028079j) 39 | 38,(1.0200463598610274+0.11492464376424945j),1.0265000000049063,6.428184364922959,(830.0000000051556+22.658846707583336j) 40 | 39,(1.0107028895765318-0.19844311277403898j),1.030000000002816,-11.108247416549025,(-103.99999998557531-162.1173940931984j) 41 | -------------------------------------------------------------------------------- /Y_None_None.csv: -------------------------------------------------------------------------------- 1 | ,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38 2 | 0,(3.65450097001827-63.367477319585596j),(-2.0570568805614005+24.155725083163873j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-1.597444089456869+39.936102236421725j) 3 | 1,(-2.0570568805614005+24.155725083163873j),(64.64569545159222-211.87056920901318j),(-5.659555942533739+65.73791902481497j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-56.92908262849707+69.94144437215355j),0j,0j,0j,0j,53.90109149710281j,0j,0j,0j,0j,0j,0j,0j,0j,0j 4 | 2,0j,(-5.659555942533739+65.73791902481497j),(14.69062005200674-186.84298940536655j),(-2.8547586630945587+46.77412271070315j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-6.17630544637844+74.67714766984841j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 5 | 3,0j,0j,(-2.8547586630945587+46.77412271070315j),(12.507557226398959-201.57062289029008j),(-4.863813229571984+77.82101167315174j),0j,0j,0j,0j,0j,0j,0j,0j,(-4.788985333732415+77.2223885064352j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 6 | 4,0j,0j,0j,(-4.863813229571984+77.82101167315174j),(40.62075560042896-548.8438401592671j),(-29.411764705882355+382.3529411764706j),0j,(-6.345177664974621+88.83248730964468j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 7 | 5,0j,0j,0j,0j,(-29.411764705882355+382.3529411764706j),(46.80574252438314-646.4470846686605j),(-7.0588235294117645+108.23529411764706j),0j,0j,0j,(-10.335154289089028+121.06895024361434j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,37.38317757009346j,0j,0j,0j,0j,0j,0j,0j,0j 8 | 6,0j,0j,0j,0j,0j,(-7.0588235294117645+108.23529411764706j),(25.820549608211014-323.8996440238384j),(-18.76172607879925+215.75984990619136j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 9 | 7,0j,0j,0j,0j,(-6.345177664974621+88.83248730964468j),0j,(-18.76172607879925+215.75984990619136j),(26.845403191989263-331.7273937246268j),(-1.7384994482153926+27.438056508790762j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 10 | 8,0j,0j,0j,0j,0j,0j,0j,(-1.7384994482153926+27.438056508790762j),(3.3359435376722617-66.58395874521248j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-1.597444089456869+39.936102236421725j) 11 | 9,0j,0j,0j,0j,0j,0j,0j,0j,0j,(42.89544235924933-504.7250417755909j),(-21.447721179624665+230.56300268096516j),0j,(-21.447721179624665+230.56300268096516j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,46.72897196261682j,0j,0j,0j,0j,0j,0j,0j 12 | 10,0j,0j,0j,0j,0j,(-10.335154289089028+121.06895024361434j),0j,0j,0j,(-21.447721179624665+230.56300268096516j),(32.62728730947873-374.48349984537896j),(-0.8393755872415878+22.820523778130664j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 13 | 11,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-0.8393755872415878+22.820523778130664j),(1.6687387420309896-45.36883454896753j),(-0.8393755872415878+22.820523778130664j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 14 | 12,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-21.447721179624665+230.56300268096516j),0j,(-0.8393755872415878+22.820523778130664j),(31.04529388403491-351.62776596044966j),(-8.753160863645206+98.22991635868509j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 15 | 13,0j,0j,0j,(-4.788985333732415+77.2223885064352j),0j,0j,0j,0j,0j,0j,0j,0j,(-8.753160863645206+98.22991635868509j),(17.338573337613422-220.8820931668519j),(-3.7964271402358003+45.76803830173159j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 16 | 14,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-3.7964271402358003+45.76803830173159j),(13.88950777273552-150.9161582411731j),(-10.093080632499719+105.4166199394415j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 17 | 15,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-10.093080632499719+105.4166199394415j),(36.02583832184625-510.4277886079549j),(-8.782936010037641+111.66875784190715j),0j,(-4.179619132206578+50.939108173767664j),0j,(-4.3742140084203625+73.8148613920936j),0j,0j,(-8.595988538681949+169.054441260745j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 18 | 16,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-8.782936010037641+111.66875784190715j),(23.437314167822265-289.9227603381629j),(-10.335154289089028+121.06895024361434j),0j,0j,0j,0j,0j,0j,0j,0j,(-4.3192238686955955+57.478902252641376j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 19 | 17,0j,0j,(-6.17630544637844+74.67714766984841j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-10.335154289089028+121.06895024361434j),(16.51145973546747-195.57324791346275j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 20 | 18,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-4.179619132206578+50.939108173767664j),0j,0j,(10.467403243273552-176.47474990802667j),(-3.4587406823996547+68.18660202445032j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-3.2365586873627636+65.65590480078748j),0j,0j,0j,0j,0j,0j 21 | 19,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-3.4587406823996547+68.18660202445032j),(6.387905789606833-126.71061147118132j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-2.746135432259568+54.92270864519135j),0j,0j,0j,0j,0j 22 | 20,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-4.3742140084203625+73.8148613920936j),0j,0j,0j,0j,(8.442562259030614-144.75530577777303j),(-4.068348250610252+71.19609438567942j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 23 | 21,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-4.068348250610252+71.19609438567942j),(10.553432556706232-241.2973405694209j),(-6.48508430609598+103.76134889753568j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,68.22445846836092j,0j,0j,0j,0j 24 | 22,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-6.48508430609598+103.76134889753568j),(8.9495283971831-168.6998223163971j),(-1.788850582189553+28.458986534833794j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-0.6755935088975666+36.75228688402762j),0j,0j,0j 25 | 23,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-8.595988538681949+169.054441260745j),0j,0j,0j,0j,0j,0j,(-1.788850582189553+28.458986534833794j),(10.384839120871503-197.2989277955788j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 26 | 24,0j,(-56.92908262849707+69.94144437215355j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(61.02681073161219-141.26983757028577j),(-3.037407572636754+30.65883268630224j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-1.0868285437403205+42.02403702462573j),0j,0j 27 | 25,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-3.037407572636754+30.65883268630224j),(12.803361851853236-133.586524462461j),(-6.420545746388444+67.41573033707866j),(-1.8982452267961594+20.92484273259022j),(-1.4471633060318785+15.868018706489893j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 28 | 26,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-4.3192238686955955+57.478902252641376j),0j,0j,0j,0j,0j,0j,0j,0j,(-6.420545746388444+67.41573033707866j),(10.73976961508404-124.61403258972004j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 29 | 27,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-1.8982452267961594+20.92484273259022j),0j,(7.985995802958268-86.07098108976724j),(-6.087750576162108+65.66073835717702j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j 30 | 28,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-1.4471633060318785+15.868018706489893j),0j,(-6.087750576162108+65.66073835717702j),(10.655616820530847-141.7434643612357j),0j,0j,0j,0j,0j,0j,0j,0j,(-3.1987205117952824+62.375049980008j),0j 31 | 29,0j,53.90109149710281j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,-55.24861878453038j,0j,0j,0j,0j,0j,0j,0j,0j,0j 32 | 30,0j,0j,0j,0j,0j,37.38317757009346j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,-40j,0j,0j,0j,0j,0j,0j,0j,0j 33 | 31,0j,0j,0j,0j,0j,0j,0j,0j,0j,46.72897196261682j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,-50j,0j,0j,0j,0j,0j,0j,0j 34 | 32,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-3.2365586873627636+65.65590480078748j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(3.463117795478157-70.25181813684262j),0j,0j,0j,0j,0j,0j 35 | 33,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-2.746135432259568+54.92270864519135j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(2.7708506511499036-55.41701302299806j),0j,0j,0j,0j,0j 36 | 34,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,68.22445846836092j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,-69.93006993006993j,0j,0j,0j,0j 37 | 35,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-0.6755935088975666+36.75228688402762j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(0.6755935088975666-36.75228688402762j),0j,0j,0j 38 | 36,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-1.0868285437403205+42.02403702462573j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(1.1139992573338284-43.07463795024137j),0j,0j 39 | 37,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(-3.1987205117952824+62.375049980008j),0j,0j,0j,0j,0j,0j,0j,0j,(3.278688524590164-63.9344262295082j),0j 40 | 38,(-1.597444089456869+39.936102236421725j),0j,0j,0j,0j,0j,0j,0j,(-1.597444089456869+39.936102236421725j),0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,0j,(3.194888178913738-78.89720447284344j) 41 | -------------------------------------------------------------------------------- /my_flow_cal.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 牛拉法进行潮流计算 3 | ''' 4 | import math 5 | import numpy as np 6 | import pandas as pd 7 | class PowerFlow: 8 | def __init__(self): 9 | self.data_block_list = ['BUS DATA FOLLOWS','BRANCH DATA FOLLOWS','LOSS ZONES FOLLOWS'] 10 | 11 | self.base_kv=100.00 12 | 13 | self.bus_data_name_list=['Bus number','name','Load flow area number', 14 | 'Loss zone number','Type','Final voltage','Final angle', 15 | 'Load MW','Load MVAR','Generation MW','Generation MVAR', 16 | 'Base KV','Desired volts','Maximum MVAR',' Minimum MVAR', 17 | 'Shunt conductance G','Shunt susceptance B','Remote controlled bus number'] 18 | self.branch_data_name_list=['Tap bus number','Z bus number','Load flow area', 19 | 'Loss zone','Circuit','Type','Branch resistance R','Branch reactance X', 20 | 'Line charging B','Line MVA rating No 1','Line MVA rating No 2', 21 | 'Line MVA rating No 3','Control bus number','Side', 22 | 'Transformer final turns ratio','Transformer (phase shifter) final angle', 23 | 'Minimum tap or phase shift','Maximum tap or phase shift', 24 | 'Step size','Minimum voltage','Maximum voltage'] 25 | 26 | 27 | 28 | # self.general_cal() 29 | self.n_1_check() 30 | 31 | # 状态初始化 32 | def status_init(self): 33 | # 误差精度 34 | self.error_tol =0.00001 35 | # 默认循环状态开启 36 | self.circle_status=True 37 | # 记录循环次数 38 | self.circle_count=0 39 | # 默认收敛情况 40 | self.coverge_status = False 41 | 42 | # 初始化母线和支路数据 43 | self.bus_data_dict_list=[] 44 | self.branch_data_dict_list = [] 45 | 46 | # n-1切除情况 47 | self.cut_node_1 =None 48 | self.cut_node_2 =None 49 | 50 | # 读取数据 51 | self.read_data() 52 | # 雅可比矩阵计算部分 53 | # 生成nxn大小的矩阵,n为节点数 54 | self.Y=np.zeros([len(self.bus_data_dict_list), len(self.bus_data_dict_list)],dtype=complex) 55 | # 生成雅可比矩阵,默认只有1个平衡节点,其余全是PQ+PV 56 | self.Jacobbi=np.zeros([(len(self.bus_data_dict_list)-1)*2, (len(self.bus_data_dict_list)-1)*2]) 57 | # 电压修正量 58 | self.e=np.zeros([len(self.bus_data_dict_list)]) 59 | self.f = np.zeros([len(self.bus_data_dict_list)] ) 60 | # 功率修正量 61 | self.PQUs = np.zeros([(len(self.bus_data_dict_list)-1)*2]) 62 | self.PQU = np.zeros([(len(self.bus_data_dict_list)-1) * 2]) 63 | self.dPQU= np.zeros([(len(self.bus_data_dict_list)-1) * 2]) 64 | 65 | # 节点功率 66 | self.S_node = np.zeros([len(self.bus_data_dict_list)], dtype=complex) 67 | # 节点电流 68 | self.I = np.zeros([len(self.bus_data_dict_list), len(self.bus_data_dict_list)], dtype=complex) 69 | # 电压最终值直角坐标表达 70 | self.u=[] 71 | # 电压最终值极坐标表达 72 | self.u_amp = [] 73 | self.u_angle = [] 74 | # 节点功率最终值 75 | self.S =[] 76 | 77 | 78 | # 正常的潮流计算 79 | def general_cal(self): 80 | self.status_init() 81 | self.generate_node_admat() 82 | self.resort_my_admat() 83 | self.cal_power_flow() 84 | self.output_result('general') 85 | 86 | # n-1校验,通过删除单一支路的数据进行校验 87 | def n_1_check(self): 88 | # 获取最开始的支路数目 89 | self.status_init() 90 | branch_num =len(self.branch_data_dict_list) 91 | 92 | for i in range(branch_num): 93 | # 重新加载数据 94 | self.status_init() 95 | # 删除第i条支路 96 | self.cut_node_1 = self.branch_data_dict_list[i]['Tap bus number'] 97 | self.cut_node_2 = self.branch_data_dict_list[i]['Z bus number'] 98 | self.branch_data_dict_list.pop(i) 99 | 100 | 101 | # 生成节点导纳矩阵,已验证 102 | self.generate_node_admat() 103 | # 对节点导纳矩阵进行重排 104 | self.resort_my_admat() 105 | # 开始进行潮流计算 106 | self.cal_power_flow() 107 | # 输出结果 108 | self.output_result('n_1_{}_{}'.format(self.cut_node_1,self.cut_node_2)) 109 | 110 | def read_data(self): 111 | with open('039ieee.DAT','r') as f: 112 | data =f.read() 113 | data_block=data.split('-999\n') 114 | data_block_dict = dict(zip(self.data_block_list,data_block)) 115 | 116 | bus_data_follows = data_block_dict['BUS DATA FOLLOWS'].split('\n')[2:-1] 117 | 118 | branch_data_follows = data_block_dict['BRANCH DATA FOLLOWS'].split('\n')[1:-1] 119 | 120 | # 读取总线数据 121 | for data_line in bus_data_follows: 122 | data_list=[] 123 | # 数据列表 124 | data_list.append(int(data_line[0:4])) 125 | data_list.append(data_line[5:17]) 126 | data_list.append(data_line[18:20]) 127 | data_list.append(data_line[20:23]) 128 | 129 | node_type= data_line[24:26] 130 | if node_type.isspace()==True: 131 | data_list.append(0) 132 | else : 133 | data_list.append(int(node_type)) 134 | 135 | data_list.append(float(data_line[27:33])) 136 | data_list.append(float(data_line[33:40])) 137 | data_list.append(float(data_line[40:49])) 138 | data_list.append(float(data_line[49:59])) 139 | data_list.append(float(data_line[59:67])) 140 | data_list.append(float(data_line[67:75])) 141 | data_list.append(float(data_line[76:83])) 142 | data_list.append(float(data_line[84:90])) 143 | data_list.append(float(data_line[90:98])) 144 | data_list.append(float(data_line[98:106])) 145 | data_list.append(float(data_line[106:114])) 146 | data_list.append(float(data_line[114:122])) 147 | data_list.append(int(data_line[123:127])) 148 | # 149 | 150 | data_dict = dict(zip(self.bus_data_name_list,data_list)) 151 | self.bus_data_dict_list.append(data_dict) 152 | 153 | for data_line in branch_data_follows: 154 | data_list=[] 155 | data_list.append(int(data_line[0:4])) 156 | data_list.append(int(data_line[5:9])) 157 | data_list.append(int(data_line[10:12])) 158 | data_list.append(int(data_line[13:15])) 159 | data_list.append((data_line[16:18])) 160 | data_list.append((data_line[18])) 161 | data_list.append(float(data_line[19:29])) 162 | data_list.append(float(data_line[29:40])) 163 | data_list.append(float(data_line[40:50])) 164 | data_list.append(int(data_line[50:55])) 165 | data_list.append(int(data_line[56:62])) 166 | data_list.append(int(data_line[62:69])) 167 | data_list.append(int(data_line[68:72])) 168 | data_list.append(int(data_line[73])) 169 | data_list.append(float(data_line[76:82])) 170 | data_list.append(float(data_line[83:90])) 171 | data_list.append(float(data_line[90:97])) 172 | data_list.append(float(data_line[97:104])) 173 | data_list.append(float(data_line[105:111])) 174 | data_list.append(float(data_line[112:118])) 175 | data_list.append(float(data_line[118:126])) 176 | 177 | data_dict = dict(zip(self.branch_data_name_list,data_list)) 178 | self.branch_data_dict_list.append(data_dict) 179 | 180 | 181 | 182 | 183 | # 生成节点导纳矩阵 184 | def generate_node_admat(self): 185 | 186 | for bus_data_dict in self.bus_data_dict_list: 187 | # 获取当前节点 188 | node_num =bus_data_dict['Bus number'] 189 | # 母线并联导纳对该节点的自导纳的影响 190 | self.Y[node_num-1, node_num-1] +=complex(bus_data_dict['Shunt conductance G'],bus_data_dict['Shunt susceptance B']) 191 | 192 | # 遍历该节点连接的母线 193 | for branch_data_dict in self.branch_data_dict_list: 194 | if branch_data_dict['Tap bus number']==(node_num): 195 | to_node_num = branch_data_dict['Z bus number'] 196 | 197 | # 考虑线路的导纳对矩阵的影响 198 | # 修改节点自导纳 199 | self.Y[node_num-1, node_num-1] += complex(0,branch_data_dict['Line charging B']/2) 200 | # 修改连接节点自导纳 201 | self.Y[to_node_num-1, to_node_num-1] += complex(0,branch_data_dict['Line charging B']/2) 202 | 203 | # 考虑线路的阻抗对矩阵的影响 204 | 205 | node_data_z = complex(branch_data_dict['Branch resistance R'], 206 | branch_data_dict['Branch reactance X']) 207 | node_data_y = 1 / node_data_z 208 | 209 | k =branch_data_dict['Transformer final turns ratio'] 210 | 211 | # 如果没有变压器 212 | if k==0: 213 | # 修改节点自导纳 214 | self.Y[node_num-1, node_num-1] +=node_data_y 215 | # 修改连接节点自导纳 216 | self.Y[to_node_num-1, to_node_num-1] += node_data_y 217 | # 修改互导纳 218 | self.Y[node_num-1, to_node_num-1] -= node_data_y 219 | self.Y[to_node_num-1, node_num-1] -= node_data_y 220 | # 有变压器的情况,其中二端为标准变比侧,从一端看过去的变比为k 221 | else: 222 | self.Y[node_num-1, node_num-1] += node_data_y/(k*k) 223 | self.Y[to_node_num-1, to_node_num-1] += node_data_y 224 | self.Y[node_num-1,to_node_num-1] -=node_data_y/k 225 | self.Y[to_node_num-1, node_num-1] -= node_data_y/k 226 | # 节点导纳矩阵核对无误 227 | def resort_my_admat(self): 228 | # 按节点类型重排 229 | self.bus_data_dict_list = sorted(self.bus_data_dict_list, key=lambda x: x["Type"]) 230 | self.my_sort_list = [data_dict['Bus number'] for data_dict in self.bus_data_dict_list] 231 | my_sort_list= [i-1 for i in self.my_sort_list] 232 | 233 | # 重排Y 234 | mat = pd.DataFrame(self.Y) 235 | mat.to_csv('Y_{}_{}.csv'.format(self.cut_node_1,self.cut_node_2),encoding='utf-8') 236 | mat=mat.reindex(index=my_sort_list,columns=my_sort_list) 237 | self.Y=mat.to_numpy() 238 | 239 | 240 | 241 | # 根据节点类型生成对应的雅可比矩阵 242 | def cal_power_flow(self): 243 | 244 | # 矩阵 245 | self.G = self.Y.real 246 | self.B = self.Y.imag 247 | 248 | # 生成雅可比矩阵,默认只有1个平衡节点,其余全是PQ+PV 249 | self.Jacobbi=np.zeros([(len(self.bus_data_dict_list)-1)*2, (len(self.bus_data_dict_list)-1)*2]) 250 | # 电压修正量 251 | self.e=np.zeros([len(self.bus_data_dict_list)]) 252 | self.f = np.zeros([len(self.bus_data_dict_list)] ) 253 | # 功率修正量 254 | self.PQUs = np.zeros([(len(self.bus_data_dict_list)-1)*2]) 255 | self.PQU = np.zeros([(len(self.bus_data_dict_list)-1) * 2]) 256 | self.dPQU= np.zeros([(len(self.bus_data_dict_list)-1) * 2]) 257 | 258 | 259 | # 先读取数据形成节点电压以及电压初始状态 260 | for node_num,bus_data_dict in enumerate(self.bus_data_dict_list): 261 | node_type = (bus_data_dict['Type']) 262 | 263 | 264 | # 如果是平衡节点 265 | if node_type==3: 266 | voltage = bus_data_dict['Final voltage'] 267 | angle = bus_data_dict['Final angle'] 268 | voltage_comp = voltage * complex(math.cos(angle/180*3.14), math.sin(angle/180*3.14)) 269 | self.e[node_num] = voltage_comp.real 270 | self.f[node_num] = voltage_comp.imag 271 | 272 | # 如果是PV节点 273 | elif node_type ==2: 274 | voltage = bus_data_dict['Desired volts'] 275 | self.PQUs[2*node_num] = (bus_data_dict['Generation MW']-bus_data_dict['Load MW'])/self.base_kv 276 | self.PQUs[2*node_num+1] = voltage*voltage 277 | self.e[node_num] = voltage 278 | self.f[node_num] = 0 279 | 280 | 281 | else: 282 | #PQ节点设置初始电压为1即可 283 | self.PQUs[2*node_num] = (bus_data_dict['Generation MW']-bus_data_dict['Load MW'])/self.base_kv 284 | self.PQUs[2*node_num+1] = (bus_data_dict['Generation MVAR']-bus_data_dict['Load MVAR'])/self.base_kv 285 | self.e[node_num] = 1 286 | self.f[node_num] = 0 287 | # voltage = bus_data_dict['Final voltage'] 288 | # angle = bus_data_dict['Final angle'] 289 | # voltage_comp = voltage * complex(math.cos(angle), math.sin(angle)) 290 | # self.e[node_num] = voltage_comp.real 291 | # self.f[node_num] = voltage_comp.imag 292 | 293 | 294 | while self.circle_status==True: 295 | # 根据当前节点电压计算先计算PQU,再得出dPQU 296 | for node_num,bus_data_dict in enumerate(self.bus_data_dict_list): 297 | node_type = bus_data_dict['Type'] 298 | 299 | # 如果是PQ节点 300 | sum1 = 0 301 | sum2 = 0 302 | for j in range(len(self.bus_data_dict_list)): 303 | sum1 += self.G[node_num][j] * self.e[j] - self.B[node_num][j] * self.f[j] 304 | sum2 += self.G[node_num][j] * self.f[j] + self.B[node_num][j] * self.e[j] 305 | 306 | 307 | if node_type==3: 308 | pass 309 | elif node_type==2: 310 | self.PQU[2 * node_num] = self.e[node_num] * sum1 + self.f[node_num] * sum2 311 | self.PQU[2*node_num+1] = self.e[node_num]**2+self.f[node_num]**2 312 | else: 313 | self.PQU[2 * node_num] = self.e[node_num] * sum1 + self.f[node_num] * sum2 314 | self.PQU[2*node_num+1] = self.f[node_num] * sum1 - self.e[node_num] * sum2 315 | 316 | # 计算偏差量 317 | self.dPQU =self.PQUs-self.PQU 318 | # 如果不满足精度要求 319 | if max(abs(self.dPQU)) > self.error_tol: 320 | if self.circle_count>100: 321 | print("潮流不收敛!") 322 | # 停止迭代 323 | self.circle_status=False 324 | self.coverge_status=False 325 | else: 326 | self.circle_count += 1 327 | # 开始遍历所有节点,生成雅可比矩阵 328 | for i in range(len(self.bus_data_dict_list)-1): 329 | node_type = self.bus_data_dict_list[i]['Type'] 330 | for j in range(len(self.bus_data_dict_list)-1): 331 | if i!=j: 332 | # Pidej 333 | self.Jacobbi[2*i][2*j] = -(self.G[i][j] * self.e[i] + self.B[i][j] * self.f[i]) 334 | # Pidfj 335 | self.Jacobbi[2*i][2*j+1] = self.B[i][j] * self.e[i] - self.G[i][j] * self.f[i] 336 | 337 | if node_type ==3: 338 | pass 339 | elif node_type == 2: 340 | # U2dej 341 | self.Jacobbi[2*i+1][2*j]=0 342 | # U2dfj 343 | self.Jacobbi[2*i+1][2*j+1]=0 344 | else : 345 | # Qidej=Pidfj 346 | self.Jacobbi[2 * i + 1][2 * j] = self.Jacobbi[2 * i][2 * j + 1] 347 | # Qidfj=-Pidej 348 | self.Jacobbi[2 * i + 1][2 * j + 1] = -self.Jacobbi[2 * i][2 * j] 349 | else: 350 | sum1 = 0 351 | for k in range(len(self.bus_data_dict_list)): 352 | sum1 += (self.G[i][k] * self.e[k] - self.B[i][k] * self.f[k]) 353 | sum2 = 0 354 | for k in range(len(self.bus_data_dict_list) ): 355 | sum2 += (self.G[i][k] * self.f[k] + self.B[i][k] * self.e[k]) 356 | # Pidej 357 | self.Jacobbi[2*i][2*j] = -sum1-(self.G[i][j] * self.e[i] + self.B[i][j] * self.f[i]) 358 | # Pidfj 359 | self.Jacobbi[2*i][2*j+1] =-sum2+ self.B[i][j] * self.e[i] - self.G[i][j] * self.f[i] 360 | 361 | if node_type ==3: 362 | pass 363 | elif node_type == 2: 364 | # U2dej 365 | self.Jacobbi[2*i+1][2 *j] = -2*self.e[i] 366 | # U2dfj 367 | self.Jacobbi[2*i+1][2*j + 1] = -2*self.f[i] 368 | else: 369 | # Qidej 370 | self.Jacobbi[2 * i + 1][2 * j] = sum2 + self.B[i][j] * self.e[i] - self.G[i][j] * \ 371 | self.f[i] 372 | # Qidfj 373 | self.Jacobbi[2 * i + 1][2 * j + 1] = -sum1 + ( 374 | self.G[i][j] * self.e[i] + self.B[i][j] * self.f[i]) 375 | 376 | 377 | try: 378 | self.dU=np.linalg.solve(self.Jacobbi, -self.dPQU) 379 | # 叠加修正量 380 | for i in range(len(self.bus_data_dict_list) - 1): 381 | self.e[i] += self.dU[2 * i] 382 | self.f[i] += self.dU[2 * i + 1] 383 | except: 384 | print('该方程无解!') 385 | self.circle_status = False 386 | self.coverge_status = False 387 | 388 | 389 | else: 390 | # 满足条件则终止当前循环 391 | self.circle_status = False 392 | self.coverge_status = True 393 | print('循环结束!循环次数:',self.circle_count) 394 | 395 | # 计算最终各节点电压 396 | for i in range(len(self.bus_data_dict_list)): 397 | temp_amplitude = math.sqrt(self.e[i] ** 2 + self.f[i] ** 2) 398 | temp_phase_angle = math.atan(self.f[i] / self.e[i]) * 180 / math.pi 399 | 400 | self.u.append(complex(self.e[i], self.f[i])) 401 | self.u_amp.append(temp_amplitude) 402 | self.u_angle.append(temp_phase_angle) 403 | 404 | # 计算最终各节点功率 405 | for i in range(len(self.bus_data_dict_list)): 406 | I=0 407 | Ui = complex(self.e[i], self.f[i]) 408 | # 计算支路的首端功率 409 | for j in range(len(self.bus_data_dict_list)): 410 | # 计算节点注入的共轭值 411 | Uj = complex(self.e[j], self.f[j]) 412 | I+=(self.Y[i][j])*(Uj) 413 | # 计算各节点的功率 S = 电压 X 注入电流的共轭值 414 | self.S_node[i]=Ui*I.conjugate()*100 415 | 416 | # 遍历被连接的节点,先计算线路之间的功率,再计算线损从而得到线路电流 417 | for branch_data in self.branch_data_dict_list: 418 | 419 | node_num = branch_data['Tap bus number'] 420 | to_node_num = branch_data['Z bus number'] 421 | 422 | k=branch_data['Transformer final turns ratio'] 423 | r=branch_data['Branch resistance R'] 424 | x = branch_data['Branch reactance X'] 425 | b = complex(0,branch_data['Line charging B']) 426 | z=complex(r,x) 427 | y=1/z 428 | # 找到支路在节点导纳矩阵中对应的位置 429 | i = self.my_sort_list.index(node_num) 430 | j = self.my_sort_list.index(to_node_num) 431 | Ui = complex(self.e[i], self.f[i]) 432 | Uj = complex(self.e[j], self.f[j]) 433 | 434 | # 计算首端功率,这里不能直接用节点导纳矩阵的互导纳算,因为实际流过电线的充电功率被算在自导纳里了 435 | # 换算到基准变比侧 436 | # 充电电流 437 | I_ij_charge = Ui * b / 2 438 | Sij = Ui * ((I_ij_charge).conjugate()) 439 | 440 | I_ji_charge = Uj * b / 2 441 | Sji=Uj*((I_ji_charge).conjugate()) 442 | 443 | if k!=0: 444 | S_loss = (Ui/k-Uj)*(((Ui/k-Uj)*y).conjugate())+Sij+Sji 445 | else : 446 | S_loss = (Ui-Uj)*(((Ui-Uj)*y).conjugate())+Sij+Sji 447 | i = math.sqrt(abs(S_loss*y)/3) 448 | self.S.append({'branch':(node_num,to_node_num),'loss':S_loss*100,'current':i}) 449 | 450 | 451 | 452 | def output_result(self,number): 453 | if self.coverge_status==True: 454 | # 保存读取的参数 455 | # 保存格式化后的母线数据 456 | df_bus = pd.DataFrame(self.bus_data_dict_list) 457 | df_bus.to_csv('bus_data' + '.csv', encoding='utf-8') 458 | 459 | # 保存格式化后的支路数据 460 | df_branch = pd.DataFrame(self.branch_data_dict_list) 461 | df_branch=df_branch.set_index(["Tap bus number"]) 462 | df_branch.to_csv('branch_data' + '.csv', encoding='utf-8') 463 | 464 | # 保存潮流计算的解,包括电压以及节点功率 465 | solution_dict = {'V': self.u, 'V_amp': self.u_amp, 'V_angle': self.u_angle, 'S_node': self.S_node} 466 | solution_df = pd.DataFrame(solution_dict, index=self.my_sort_list) 467 | # 按实际节点顺序重排 468 | solution_df = solution_df.reindex(range(1, len(self.bus_data_dict_list) + 1)) 469 | solution_df.to_csv('{}_solution.csv'.format(number)) 470 | print('切去{}_{}支路,成功'.format(self.cut_node_1,self.cut_node_2)) 471 | 472 | # 保存功率损耗以及电流计算 473 | my_S = pd.DataFrame(self.S) 474 | my_S.to_csv('{}_loss_current.csv'.format(number), encoding='utf-8') 475 | else: 476 | if self.cut_node_1!=None: 477 | print('切去{}_{}支路后方程无解'.format(self.cut_node_1,self.cut_node_2)) 478 | 479 | 480 | 481 | 482 | if __name__ == '__main__': 483 | my_pf = PowerFlow() -------------------------------------------------------------------------------- /my_flow_cal_PQ.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PQ分解法进行潮流计算, 仅供参考。 3 | author: ShanShu Wu 4 | contact:1162041294(QQ) 5 | ''' 6 | import math 7 | import numpy as np 8 | import pandas as pd 9 | class PowerFlow: 10 | def __init__(self): 11 | self.data_block_list = ['BUS DATA FOLLOWS','BRANCH DATA FOLLOWS','LOSS ZONES FOLLOWS'] 12 | 13 | self.base_kv=100.00 14 | 15 | self.bus_data_name_list=['Bus number','name','Load flow area number', 16 | 'Loss zone number','Type','Final voltage','Final angle', 17 | 'Load MW','Load MVAR','Generation MW','Generation MVAR', 18 | 'Base KV','Desired volts','Maximum MVAR',' Minimum MVAR', 19 | 'Shunt conductance G','Shunt susceptance B','Remote controlled bus number'] 20 | self.branch_data_name_list=['Tap bus number','Z bus number','Load flow area', 21 | 'Loss zone','Circuit','Type','Branch resistance R','Branch reactance X', 22 | 'Line charging B','Line MVA rating No 1','Line MVA rating No 2', 23 | 'Line MVA rating No 3','Control bus number','Side', 24 | 'Transformer final turns ratio','Transformer (phase shifter) final angle', 25 | 'Minimum tap or phase shift','Maximum tap or phase shift', 26 | 'Step size','Minimum voltage','Maximum voltage'] 27 | 28 | 29 | 30 | self.general_cal() 31 | # self.n_1_check() 32 | 33 | # 状态初始化 34 | def status_init(self): 35 | # 误差精度 36 | self.error_tol =0.00001 37 | # 默认循环状态开启 38 | self.circle_status=True 39 | # 记录循环次数 40 | self.circle_count=0 41 | # 默认收敛情况 42 | self.coverge_status = False 43 | 44 | # 初始化母线和支路数据 45 | self.bus_data_dict_list=[] 46 | self.branch_data_dict_list = [] 47 | 48 | # n-1切除情况 49 | self.cut_node_1 =None 50 | self.cut_node_2 =None 51 | 52 | # 读取数据 53 | self.read_data() 54 | # 雅可比矩阵计算部分 55 | # 生成nxn大小的矩阵,n为节点数 56 | self.Y=np.zeros([len(self.bus_data_dict_list), len(self.bus_data_dict_list)],dtype=complex) 57 | # 生成雅可比矩阵,默认只有1个平衡节点,其余全是PQ+PV 58 | # self.Jacobbi=np.zeros([(len(self.bus_data_dict_list)-1)*2, (len(self.bus_data_dict_list)-1)*2]) 59 | # 电压修正量 60 | # self.e=np.zeros([len(self.bus_data_dict_list)]) 61 | # self.f = np.zeros([len(self.bus_data_dict_list)] ) 62 | # 功率修正量 63 | # self.PQUs = np.zeros([(len(self.bus_data_dict_list)-1)*2]) 64 | # self.PQU = np.zeros([(len(self.bus_data_dict_list)-1) * 2]) 65 | # self.dPQU= np.zeros([(len(self.bus_data_dict_list)-1) * 2]) 66 | 67 | # 节点功率 68 | self.S_node = np.zeros([len(self.bus_data_dict_list)], dtype=complex) 69 | # 节点电流 70 | self.I = np.zeros([len(self.bus_data_dict_list), len(self.bus_data_dict_list)], dtype=complex) 71 | # 电压最终值直角坐标表达 72 | self.u=[] 73 | # 电压最终值极坐标表达 74 | self.u_amp = [] 75 | self.u_angle = [] 76 | # 节点功率最终值 77 | self.S =[] 78 | 79 | 80 | # 正常的潮流计算 81 | def general_cal(self): 82 | self.status_init() 83 | self.generate_node_admat() 84 | self.resort_my_admat() 85 | self.cal_power_flow() 86 | self.output_result('general') 87 | 88 | # n-1校验,通过删除单一支路的数据进行校验 89 | def n_1_check(self): 90 | # 获取最开始的支路数目 91 | self.status_init() 92 | branch_num =len(self.branch_data_dict_list) 93 | 94 | for i in range(branch_num): 95 | # 重新加载数据 96 | self.status_init() 97 | # 删除第i条支路 98 | self.cut_node_1 = self.branch_data_dict_list[i]['Tap bus number'] 99 | self.cut_node_2 = self.branch_data_dict_list[i]['Z bus number'] 100 | self.branch_data_dict_list.pop(i) 101 | 102 | 103 | # 生成节点导纳矩阵,已验证 104 | self.generate_node_admat() 105 | # 对节点导纳矩阵进行重排 106 | self.resort_my_admat() 107 | # 开始进行潮流计算 108 | self.cal_power_flow() 109 | # 输出结果 110 | self.output_result('n_1_{}_{}'.format(self.cut_node_1,self.cut_node_2)) 111 | 112 | def read_data(self): 113 | with open('039ieee.DAT','r') as f: 114 | data =f.read() 115 | data_block=data.split('-999\n') 116 | data_block_dict = dict(zip(self.data_block_list,data_block)) 117 | 118 | bus_data_follows = data_block_dict['BUS DATA FOLLOWS'].split('\n')[2:-1] 119 | 120 | branch_data_follows = data_block_dict['BRANCH DATA FOLLOWS'].split('\n')[1:-1] 121 | 122 | # 读取总线数据 123 | for data_line in bus_data_follows: 124 | data_list=[] 125 | # 数据列表 126 | data_list.append(int(data_line[0:4])) 127 | data_list.append(data_line[5:17]) 128 | data_list.append(data_line[18:20]) 129 | data_list.append(data_line[20:23]) 130 | 131 | node_type= data_line[24:26] 132 | if node_type.isspace()==True: 133 | data_list.append(0) 134 | else : 135 | data_list.append(int(node_type)) 136 | 137 | data_list.append(float(data_line[27:33])) 138 | data_list.append(float(data_line[33:40])) 139 | data_list.append(float(data_line[40:49])) 140 | data_list.append(float(data_line[49:59])) 141 | data_list.append(float(data_line[59:67])) 142 | data_list.append(float(data_line[67:75])) 143 | data_list.append(float(data_line[76:83])) 144 | data_list.append(float(data_line[84:90])) 145 | data_list.append(float(data_line[90:98])) 146 | data_list.append(float(data_line[98:106])) 147 | data_list.append(float(data_line[106:114])) 148 | data_list.append(float(data_line[114:122])) 149 | data_list.append(int(data_line[123:127])) 150 | # 151 | 152 | data_dict = dict(zip(self.bus_data_name_list,data_list)) 153 | self.bus_data_dict_list.append(data_dict) 154 | 155 | # 156 | for data_line in branch_data_follows: 157 | data_list=[] 158 | data_list.append(int(data_line[0:4])) 159 | data_list.append(int(data_line[5:9])) 160 | data_list.append(int(data_line[10:12])) 161 | data_list.append(int(data_line[13:15])) 162 | data_list.append((data_line[16:18])) 163 | data_list.append((data_line[18])) 164 | data_list.append(float(data_line[19:29])) 165 | data_list.append(float(data_line[29:40])) 166 | data_list.append(float(data_line[40:50])) 167 | data_list.append(int(data_line[50:55])) 168 | data_list.append(int(data_line[56:62])) 169 | data_list.append(int(data_line[62:69])) 170 | data_list.append(int(data_line[68:72])) 171 | data_list.append(int(data_line[73])) 172 | data_list.append(float(data_line[76:82])) 173 | data_list.append(float(data_line[83:90])) 174 | data_list.append(float(data_line[90:97])) 175 | data_list.append(float(data_line[97:104])) 176 | data_list.append(float(data_line[105:111])) 177 | data_list.append(float(data_line[112:118])) 178 | data_list.append(float(data_line[118:126])) 179 | 180 | data_dict = dict(zip(self.branch_data_name_list,data_list)) 181 | self.branch_data_dict_list.append(data_dict) 182 | 183 | 184 | 185 | 186 | # 生成节点导纳矩阵 187 | def generate_node_admat(self): 188 | 189 | for bus_data_dict in self.bus_data_dict_list: 190 | # 获取当前节点 191 | node_num =bus_data_dict['Bus number'] 192 | # 母线并联导纳对该节点的自导纳的影响 193 | self.Y[node_num-1, node_num-1] +=complex(bus_data_dict['Shunt conductance G'],bus_data_dict['Shunt susceptance B']) 194 | 195 | # 遍历该节点连接的母线 196 | for branch_data_dict in self.branch_data_dict_list: 197 | if branch_data_dict['Tap bus number']==(node_num): 198 | to_node_num = branch_data_dict['Z bus number'] 199 | 200 | # 考虑线路的导纳对矩阵的影响 201 | # 修改节点自导纳 202 | self.Y[node_num-1, node_num-1] += complex(0,branch_data_dict['Line charging B']/2) 203 | # 修改连接节点自导纳 204 | self.Y[to_node_num-1, to_node_num-1] += complex(0,branch_data_dict['Line charging B']/2) 205 | 206 | # 考虑线路的阻抗对矩阵的影响 207 | 208 | node_data_z = complex(branch_data_dict['Branch resistance R'], 209 | branch_data_dict['Branch reactance X']) 210 | node_data_y = 1 / node_data_z 211 | 212 | k =branch_data_dict['Transformer final turns ratio'] 213 | 214 | # 如果没有变压器 215 | if k==0: 216 | # 修改节点自导纳 217 | self.Y[node_num-1, node_num-1] +=node_data_y 218 | # 修改连接节点自导纳 219 | self.Y[to_node_num-1, to_node_num-1] += node_data_y 220 | # 修改互导纳 221 | self.Y[node_num-1, to_node_num-1] -= node_data_y 222 | self.Y[to_node_num-1, node_num-1] -= node_data_y 223 | # 有变压器的情况,其中二端为标准变比侧,从一端看过去的变比为k 224 | else: 225 | self.Y[node_num-1, node_num-1] += node_data_y/(k*k) 226 | self.Y[to_node_num-1, to_node_num-1] += node_data_y 227 | self.Y[node_num-1,to_node_num-1] -=node_data_y/k 228 | self.Y[to_node_num-1, node_num-1] -= node_data_y/k 229 | 230 | # 节点导纳矩阵核对无误 231 | def resort_my_admat(self): 232 | # 获取PQ,PV节点数量 233 | # 先读取数据形成节点电压以及电压初始状态 234 | self.PV_list=[] 235 | self.PQ_list=[] 236 | for bus_data_dict in self.bus_data_dict_list: 237 | node_type = (bus_data_dict['Type']) 238 | if node_type ==3: 239 | pass 240 | elif node_type==2: 241 | self.PV_list.append(bus_data_dict) 242 | else : 243 | self.PQ_list.append(bus_data_dict) 244 | # 按节点类型重排 245 | self.bus_data_dict_list = sorted(self.bus_data_dict_list, key=lambda x: x["Type"]) 246 | self.my_sort_list = [data_dict['Bus number'] for data_dict in self.bus_data_dict_list] 247 | my_sort_list= [i-1 for i in self.my_sort_list] 248 | self.Y_former = self.Y 249 | # 重排Y 250 | mat = pd.DataFrame(self.Y) 251 | mat.to_csv('Y_{}_{}.csv'.format(self.cut_node_1,self.cut_node_2),encoding='utf-8') 252 | mat=mat.reindex(index=my_sort_list,columns=my_sort_list) 253 | self.Y=mat.to_numpy() 254 | 255 | 256 | 257 | # 根据节点类型生成对应的雅可比矩阵 258 | def cal_power_flow(self): 259 | # 生成B‘ 和 B’‘ 矩阵 260 | PQ_num = len(self.PQ_list) 261 | PV_num = len(self.PV_list) 262 | bus_num = len(self.bus_data_dict_list) 263 | # 矩阵 264 | B = self.Y.imag 265 | 266 | self.B1 = B[0:-1,0:-1] 267 | self.B2 = B[0:PQ_num,0:PQ_num] 268 | 269 | 270 | self.dP = np.zeros([PQ_num+PV_num]) 271 | self.P = np.zeros([PQ_num+PV_num]) 272 | self.Ps = np.zeros([PQ_num+PV_num]) 273 | # 角度和P有关 274 | self.dtheta = np.zeros([PQ_num+PV_num]) 275 | 276 | 277 | 278 | self.dQ = np.zeros([PQ_num]) 279 | self.Q = np.zeros([PQ_num]) 280 | self.Qs = np.zeros([PQ_num]) 281 | # 电压变化量和Q有关 282 | self.dU = np.zeros([PQ_num]) 283 | 284 | # 电压和角度是节点的基本特征,也是潮流计算需要求解的东西 285 | self.theta = np.zeros([bus_num]) 286 | self.U = np.zeros([bus_num]) 287 | 288 | 289 | 290 | 291 | # 先读取数据形成节点电压以及电压初始状态 292 | for node_num,bus_data_dict in enumerate(self.bus_data_dict_list): 293 | node_type = (bus_data_dict['Type']) 294 | # 如果是平衡节点 295 | if node_type==3: 296 | voltage = bus_data_dict['Final voltage'] 297 | angle = bus_data_dict['Final angle'] 298 | 299 | self.U[node_num] = voltage 300 | self.theta[node_num] = angle*3.14/180 301 | 302 | # 如果是PV节点 303 | elif node_type ==2: 304 | voltage = bus_data_dict['Desired volts'] 305 | self.Ps[node_num] = (bus_data_dict['Generation MW']-bus_data_dict['Load MW'])/self.base_kv 306 | self.U[node_num] = voltage 307 | 308 | self.theta[node_num] = 0 309 | 310 | 311 | else: 312 | #PQ节点设置初始电压为1即可 313 | self.Ps[node_num] = (bus_data_dict['Generation MW']-bus_data_dict['Load MW'])/self.base_kv 314 | self.Qs[node_num] = (bus_data_dict['Generation MVAR']-bus_data_dict['Load MVAR'])/self.base_kv 315 | 316 | self.U[node_num] = 1 317 | self.theta[node_num] = 0 318 | 319 | while self.circle_status==True: 320 | 321 | self.circle_count += 1 322 | # 根据当前节点电压计算先计算P 323 | for node_num_i,bus_data_dict in enumerate(self.bus_data_dict_list): 324 | node_type = bus_data_dict['Type'] 325 | if node_type==3: 326 | pass 327 | else: 328 | # 计算功率的不平衡量 329 | sum = 0 330 | for node_num_j, bus_data_dict in enumerate(self.bus_data_dict_list): 331 | theta_i_j = self.theta[node_num_i] - self.theta[node_num_j] 332 | G_i_j = self.Y[node_num_i][node_num_j].real 333 | B_i_j = self.Y[node_num_i][node_num_j].imag 334 | sum += self.U[node_num_j] * (G_i_j * math.cos(theta_i_j) + B_i_j * math.sin(theta_i_j)) 335 | self.P[node_num_i] =self.U[node_num_i] * sum 336 | # 计算偏差量 337 | self.dP =self.Ps-self.P 338 | # 如果不满足精度要求 339 | if max(abs(self.dP)) > self.error_tol: 340 | # P的误差不满足 341 | self.dP_flag = False 342 | # P不满足条件Q也要重新计算 343 | self.dQ_flag = False 344 | # 不包括平衡节点的电压 345 | self.dPU = np.true_divide(self.dP, self.U[:-1]) 346 | 347 | 348 | try: 349 | self.dUtheta = np.linalg.solve(self.B1, -self.dPU) 350 | 351 | self.dtheta =np.true_divide(self.dUtheta, self.U[:-1]) 352 | 353 | # 叠加修正量 354 | for i in range(PQ_num+PV_num): 355 | self.theta[i] += self.dtheta[i] 356 | except: 357 | print('该方程无解!') 358 | self.circle_status = False 359 | self.coverge_status = False 360 | 361 | else: 362 | self.dP_flag = True 363 | if self.dQ_flag ==True: 364 | # 满足条件则终止循环 365 | self.circle_status = False 366 | self.coverge_status = True 367 | 368 | if self.circle_status == True: 369 | # 开始计算dQ 370 | for node_num_i, bus_data_dict in enumerate(self.bus_data_dict_list): 371 | node_type = bus_data_dict['Type'] 372 | 373 | if node_type == 3: 374 | pass 375 | elif node_type == 2: 376 | pass 377 | else: 378 | # 计算功率的不平衡量 379 | sum = 0 380 | for node_num_j, bus_data_dict in enumerate(self.bus_data_dict_list): 381 | theta_i_j = self.theta[node_num_i] - self.theta[node_num_j] 382 | G_i_j = self.Y[node_num_i][node_num_j].real 383 | B_i_j = self.Y[node_num_i][node_num_j].imag 384 | sum += self.U[node_num_j] * (G_i_j * math.sin(theta_i_j) - B_i_j * math.cos(theta_i_j)) 385 | self.Q[node_num_i] = self.U[node_num_i] * sum 386 | 387 | # 计算偏差量 388 | self.dQ = self.Qs - self.Q 389 | # 判断dQ是否已经收敛 390 | if max(abs(self.dQ)) > self.error_tol: 391 | # Q的误差不满足 392 | self.dQ_flag = False 393 | # Q不满足P也要重新计算 394 | self.dP_flag = False 395 | self.dQU = np.true_divide(self.dQ, self.U[:-(PV_num+1)]) 396 | self.dU = np.linalg.solve(self.B2, -self.dQU) 397 | try: 398 | # 叠加修正量 399 | for i in range(PQ_num): 400 | self.U[i] += self.dU[i] 401 | except: 402 | print('该方程无解!') 403 | self.circle_status = False 404 | self.coverge_status = False 405 | else: 406 | self.dQ_flag = True 407 | if self.dP_flag == True: 408 | # 满足该条件则停止循环 409 | self.circle_status = False 410 | self.coverge_status = True 411 | 412 | 413 | else: 414 | # 不满足则继续循环 415 | self.circle_status = True 416 | if self.circle_count > 100: 417 | print("潮流不收敛!") 418 | # 停止迭代 419 | self.circle_status = False 420 | self.coverge_status = False 421 | 422 | # 开始遍历所有节点,生成雅可比矩阵 423 | 424 | 425 | 426 | if self.coverge_status ==True: 427 | print('循环结束!循环次数:', self.circle_count) 428 | # 计算最终各节点电压 429 | for i in range(len(self.bus_data_dict_list)): 430 | temp_amplitude = self.U[i] 431 | temp_phase_angle = self.theta[i]*180/3.14 432 | u = self.U[i]*complex(math.cos(self.theta[i]),math.sin(self.theta[i])) 433 | self.u.append(u) 434 | self.u_amp.append(temp_amplitude) 435 | self.u_angle.append(temp_phase_angle) 436 | 437 | # 计算最终各节点功率 438 | for i in range(len(self.bus_data_dict_list)): 439 | I = 0 440 | Ui = self.U[i] * complex(math.cos(self.theta[i]), math.sin(self.theta[i])) 441 | # 计算支路的首端功率 442 | for j in range(len(self.bus_data_dict_list)): 443 | # 计算节点注入的共轭值 444 | Uj = self.U[j] * complex(math.cos(self.theta[j]), math.sin(self.theta[j])) 445 | I += (self.Y[i][j]) * (Uj) 446 | # 计算各节点的功率 S = 电压 X 注入电流的共轭值 447 | self.S_node[i] = Ui * I.conjugate() * 100 448 | Y = self.Y_former.astype(np.complex) 449 | my_Z = np.linalg.inv(Y) 450 | # 遍历被连接的节点,先计算线路之间的功率,再计算线损从而得到线路电流 451 | for branch_data in self.branch_data_dict_list: 452 | 453 | node_num = branch_data['Tap bus number'] 454 | to_node_num = branch_data['Z bus number'] 455 | 456 | k = branch_data['Transformer final turns ratio'] 457 | r = branch_data['Branch resistance R'] 458 | x = branch_data['Branch reactance X'] 459 | b = complex(0, branch_data['Line charging B']) 460 | z = complex(r, x) 461 | y=1/z 462 | # print(z) 463 | # print(my_Z[node_num-1][to_node_num-1]) 464 | # y = 1 / my_Z[node_num-1][to_node_num-1] 465 | # 找到支路在节点导纳矩阵中对应的位置 466 | i = self.my_sort_list.index(node_num) 467 | 468 | print(self.my_sort_list,node_num,i) 469 | j = self.my_sort_list.index(to_node_num) 470 | Ui = self.u[i] 471 | Uj = self.u[j] 472 | 473 | # 计算首端功率,这里不能直接用节点导纳矩阵的互导纳算,因为实际流过电线的充电功率被算在自导纳里了 474 | # 换算到基准变比侧 475 | # 充电电流 476 | I_ij_charge = Ui * b / 2 477 | Sij = Ui * ((I_ij_charge).conjugate()) 478 | 479 | I_ji_charge = Uj * b / 2 480 | Sji = Uj * ((I_ji_charge).conjugate()) 481 | 482 | if k != 0: 483 | S_loss = (Ui / k - Uj) * (((Ui / k - Uj) * y).conjugate()) + Sij + Sji 484 | else: 485 | S_loss = (Ui - Uj) * (((Ui - Uj) * y).conjugate()) + Sij + Sji 486 | # i = math.sqrt(abs(S_loss * y) )*100000 487 | i = abs((Ui-Uj)*y)*100000*math.sqrt(3) 488 | self.S.append({'branch': (node_num, to_node_num), 'loss': S_loss * 100, 'current': i}) 489 | 490 | 491 | 492 | 493 | def output_result(self,number): 494 | if self.coverge_status==True: 495 | # 保存读取的参数 496 | # 保存格式化后的母线数据 497 | df_bus = pd.DataFrame(self.bus_data_dict_list) 498 | df_bus.to_csv('bus_data' + '.csv', encoding='utf-8') 499 | 500 | # 保存格式化后的支路数据 501 | df_branch = pd.DataFrame(self.branch_data_dict_list) 502 | df_branch=df_branch.set_index(["Tap bus number"]) 503 | df_branch.to_csv('branch_data' + '.csv', encoding='utf-8') 504 | 505 | # 保存潮流计算的解,包括电压以及节点功率 506 | solution_dict = {'V': self.u, 'V_amp': self.u_amp, 'V_angle': self.u_angle, 'S_node': self.S_node} 507 | solution_df = pd.DataFrame(solution_dict, index=self.my_sort_list) 508 | # 按实际节点顺序重排 509 | solution_df = solution_df.reindex(range(1, len(self.bus_data_dict_list) + 1)) 510 | solution_df.to_csv('{}_solution.csv'.format(number)) 511 | print('切去{}_{}支路,成功'.format(self.cut_node_1,self.cut_node_2)) 512 | 513 | # 保存功率损耗以及电流计算 514 | my_S = pd.DataFrame(self.S) 515 | my_S.to_csv('{}_loss_current.csv'.format(number), encoding='utf-8') 516 | else: 517 | if self.cut_node_1!=None: 518 | print('切去{}_{}支路后方程无解'.format(self.cut_node_1,self.cut_node_2)) 519 | 520 | ''' 521 | PQ分解法进行潮流计算, 仅供参考。 522 | author: ShanShu Wu 523 | contact:1162041294(QQ) 524 | ''' 525 | 526 | 527 | if __name__ == '__main__': 528 | my_pf = PowerFlow() -------------------------------------------------------------------------------- /039ieee.DAT: -------------------------------------------------------------------------------- 1 | 00/00/01 100.0 0 0 0 2 | BUS DATA FOLLOWS 39 ITEMS 3 | 1 BUS-1 100 1 1 1.047 -9.57 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 4 | 2 BUS-2 100 1 1 1.049 -7.011 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 5 | 3 BUS-3 100 1 1 1.03 -9.858 322. 2.4 0. 0. 100. 1. 0. 0. 0. 0. 0 6 | 4 BUS-4 100 1 1 1.003 -10.65 500. 184. 0. 0. 100. 1. 0. 0. 0. 0. 0 7 | 5 BUS-5 100 1 1 1.005 -9.468 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 8 | 6 BUS-6 100 1 1 1.007 -8.766 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 9 | 7 BUS-7 100 1 1 0.996 -10.97 233.8 84. 0. 0. 100. 1. 0. 0. 0. 0. 0 10 | 8 BUS-8 100 1 1 0.995 -11.47 522. 176. 0. 0. 100. 1. 0. 0. 0. 0. 0 11 | 9 BUS-9 100 1 1 1.028 -11.29 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 12 | 10 BUS-10 100 1 1 1.017 -6.381 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 13 | 11 BUS-11 100 1 1 1.012 -7.195 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 14 | 12 BUS-12 100 1 1 1. -7.21 8.5 88. 0. 0. 100. 1. 0. 0. 0. 0. 0 15 | 13 BUS-13 100 1 1 1.014 -7.095 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 16 | 14 BUS-14 100 1 1 1.011 -8.764 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 17 | 15 BUS-15 100 1 1 1.015 -9.18 320. 153. 0. 0. 100. 1. 0. 0. 0. 0. 0 18 | 16 BUS-16 100 1 1 1.032 -7.776 329. 32.3 0. 0. 100. 1. 0. 0. 0. 0. 0 19 | 17 BUS-17 100 1 1 1.034 -8.774 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 20 | 18 BUS-18 100 1 1 1.031 -9.615 158. 30. 0. 0. 100. 1. 0. 0. 0. 0. 0 21 | 19 BUS-19 100 1 1 1.05 -3.152 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 22 | 20 BUS-20 100 1 1 0.991 -4.563 680. 103. 0. 0. 100. 1. 0. 0. 0. 0. 0 23 | 21 BUS-21 100 1 1 1.032 -5.371 274. 115. 0. 0. 100. 1. 0. 0. 0. 0. 0 24 | 22 BUS-22 100 1 1 1.05 -0.923 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 25 | 23 BUS-23 100 1 1 1.045 -1.122 247.5 84.6 0. 0. 100. 1. 0. 0. 0. 0. 0 26 | 24 BUS-24 100 1 1 1.037 -7.656 308.6 -92.2 0. 0. 100. 1. 0. 0. 0. 0. 0 27 | 25 BUS-25 100 1 1 1.057 -5.649 224. 47.2 0. 0. 100. 1. 0. 0. 0. 0. 0 28 | 26 BUS-26 100 1 1 1.052 -6.905 139. 17. 0. 0. 100. 1. 0. 0. 0. 0. 0 29 | 27 BUS-27 100 1 1 1.037 -8.917 281. 75.5 0. 0. 100. 1. 0. 0. 0. 0. 0 30 | 28 BUS-28 100 1 1 1.05 -3.394 206. 27.6 0. 0. 100. 1. 0. 0. 0. 0. 0 31 | 29 BUS-29 100 1 1 1.05 -0.635 283.5 26.9 0. 0. 100. 1. 0. 0. 0. 0. 0 32 | 30 BUS-30 100 1 1 2 1.047 -4.591 0. 0. 250. 144.9193 100. 1.0475 999900 -99990 0. 0. 0 33 | 31 BUS-31 100 1 1 3 0.982 0. 9.2 4.6 572.8349207.0362 100. .98200 999900 -99990 0. 0. 0 34 | 32 BUS-32 100 1 1 2 0.983 1.6155 0. 0. 650. 205.7308 100. .98310 999900 -99990 0. 0. 0 35 | 33 BUS-33 100 1 1 2 0.997 2.0646 0. 0. 632. 108.9353 100. .99720 999900 -99990 0. 0. 0 36 | 34 BUS-34 100 1 1 2 1.012 0.6262 0. 0. 508. 166.9861 100. 1.0123 999900 -99990 0. 0. 0 37 | 35 BUS-35 100 1 1 2 1.049 4.0369 0. 0. 650. 211.1116 100. 1.0693 999900 -99990 0. 0. 0 38 | 36 BUS-36 100 1 1 2 1.063 6.7295 0. 0. 560. 100.4374 100. 1.0635 999900 -99990 0. 0. 0 39 | 37 BUS-37 100 1 1 2 1.027 1.1354 0. 0. 540. 0.64734 100. 1.0278 999900 -99990 0. 0. 0 40 | 38 BUS-38 100 1 1 2 1.026 6.4281 0. 0. 830. 22.65884 100. 1.0265 999900 -99990 0. 0. 0 41 | 39 BUS-39 100 1 1 2 1.03 -11.1 1104. 250. 1000. 87.8826 100. 1.03 999900 -99990 0. 0. 0 42 | -999 43 | BRANCH DATA FOLLOWS 46 ITEMS 44 | 2 1 1 1 0.0035 0.0411 0.6987 0 0 0 0 0 0 0 0 0 0 0 0 45 | 39 1 1 1 0.001 0.025 0.75 0 0 0 0 0 0 0 0 0 0 0 0 46 | 3 2 1 1 0.0013 0.0151 0.2572 0 0 0 0 0 0 0 0 0 0 0 0 47 | 25 2 1 1 0.007 0.0086 0.146 0 0 0 0 0 0 0 0 0 0 0 0 48 | 4 3 1 1 0.0013 0.0213 0.2214 0 0 0 0 0 0 0 0 0 0 0 0 49 | 18 3 1 1 0.0011 0.0133 0.2138 0 0 0 0 0 0 0 0 0 0 0 0 50 | 5 4 1 1 0.0008 0.0128 0.1342 0 0 0 0 0 0 0 0 0 0 0 0 51 | 14 4 1 1 0.0008 0.0129 0.1382 0 0 0 0 0 0 0 0 0 0 0 0 52 | 6 5 1 1 0.0002 0.0026 0.0434 0 0 0 0 0 0 0 0 0 0 0 0 53 | 8 5 1 1 0.0008 0.0112 0.1476 0 0 0 0 0 0 0 0 0 0 0 0 54 | 7 6 1 1 0.0006 0.0092 0.113 0 0 0 0 0 0 0 0 0 0 0 0 55 | 11 6 1 1 0.0007 0.0082 0.1389 0 0 0 0 0 0 0 0 0 0 0 0 56 | 8 7 1 1 0.0004 0.0046 0.078 0 0 0 0 0 0 0 0 0 0 0 0 57 | 9 8 1 1 0.0023 0.0363 0.3804 0 0 0 0 0 0 0 0 0 0 0 0 58 | 39 9 1 1 0.001 0.025 1.2 0 0 0 0 0 0 0 0 0 0 0 0 59 | 11 10 1 1 0.0004 0.0043 0.0729 0 0 0 0 0 0 0 0 0 0 0 0 60 | 13 10 1 1 0.0004 0.0043 0.0729 0 0 0 0 0 0 0 0 0 0 0 0 61 | 14 13 1 1 0.0009 0.0101 0.1723 0 0 0 0 0 0 0 0 0 0 0 0 62 | 15 14 1 1 0.0018 0.0217 0.366 0 0 0 0 0 0 0 0 0 0 0 0 63 | 16 15 1 1 0.0009 0.0094 0.171 0 0 0 0 0 0 0 0 0 0 0 0 64 | 17 16 1 1 0.0007 0.0089 0.1342 0 0 0 0 0 0 0 0 0 0 0 0 65 | 19 16 1 1 0.0016 0.0195 0.304 0 0 0 0 0 0 0 0 0 0 0 0 66 | 21 16 1 1 0.0008 0.0135 0.2548 0 0 0 0 0 0 0 0 0 0 0 0 67 | 24 16 1 1 0.0003 0.0059 0.068 0 0 0 0 0 0 0 0 0 0 0 0 68 | 18 17 1 1 0.0007 0.0082 0.1319 0 0 0 0 0 0 0 0 0 0 0 0 69 | 27 17 1 1 0.0013 0.0173 0.3216 0 0 0 0 0 0 0 0 0 0 0 0 70 | 22 21 1 1 0.0008 0.014 0.2565 0 0 0 0 0 0 0 0 0 0 0 0 71 | 23 22 1 1 0.0006 0.0096 0.1846 0 0 0 0 0 0 0 0 0 0 0 0 72 | 24 23 1 1 0.0022 0.035 0.361 0 0 0 0 0 0 0 0 0 0 0 0 73 | 26 25 1 1 0.0032 0.0323 0.513 0 0 0 0 0 0 0 0 0 0 0 0 74 | 27 26 1 1 0.0014 0.0147 0.2396 0 0 0 0 0 0 0 0 0 0 0 0 75 | 28 26 1 1 0.0043 0.0474 0.7802 0 0 0 0 0 0 0 0 0 0 0 0 76 | 29 26 1 1 0.0057 0.0625 1.029 0 0 0 0 0 0 0 0 0 0 0 0 77 | 29 28 1 1 0.0014 0.0151 0.249 0 0 0 0 0 0 0 0 0 0 0 0 78 | 12 11 1 1 2 0.0016 0.0435 0. 0 0 0 0 0 1.006 0 0 0 0 0 0 79 | 12 13 1 1 2 0.0016 0.0435 0. 0 0 0 0 0 1.006 0 0 0 0 0 0 80 | 6 31 1 1 2 0. 0.025 0. 0 0 0 0 0 1.07 0 0 0 0 0 0 81 | 10 32 1 1 2 0. 0.02 0. 0 0 0 0 0 1.07 0 0 0 0 0 0 82 | 19 33 1 1 2 0.0007 0.0142 0. 0 0 0 0 0 1.07 0 0 0 0 0 0 83 | 20 34 1 1 2 0.0009 0.018 0. 0 0 0 0 0 1.009 0 0 0 0 0 0 84 | 22 35 1 1 2 0. 0.0143 0. 0 0 0 0 0 1.025 0 0 0 0 0 0 85 | 23 36 1 1 2 0.0005 0.0272 0. 0 0 0 0 0 1. 0 0 0 0 0 0 86 | 25 37 1 1 2 0.0006 0.0232 0. 0 0 0 0 0 1.025 0 0 0 0 0 0 87 | 2 30 1 1 2 0. 0.0181 0. 0 0 0 0 0 1.025 0 0 0 0 0 0 88 | 29 38 1 1 2 0.0008 0.0156 0. 0 0 0 0 0 1.025 0 0 0 0 0 0 89 | 19 20 1 1 2 0.0007 0.0138 0. 0 0 0 0 0 1.06 0 0 0 0 0 0 90 | -999 91 | LOSS ZONES FOLLOWS 0 ITEMS 92 | -99 93 | INTERCHANGE DATA FOLLOWS 0 ITEMS 94 | -9 95 | TIE LINES FOLLOWS 0 ITEMS 96 | -999 97 | END OF DATA -------------------------------------------------------------------------------- /039ieeeTest.DAT: -------------------------------------------------------------------------------- 1 | 00/00/01 100.0 0 0 0 2 | BUS DATA FOLLOWS 39 ITEMS 3 | 1 BUS-1 100 1 1 1.047 -9.57 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 4 | 2 BUS-2 100 1 1 1.049 -7.011 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 5 | 3 BUS-3 100 1 1 1.03 -9.858 322. 2.4 0. 0. 100. 1. 0. 0. 0. 0. 0 6 | 4 BUS-4 100 1 1 1.003 -10.65 500. 184. 0. 0. 100. 1. 0. 0. 0. 0. 0 7 | 5 BUS-5 100 1 1 1.005 -9.468 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 8 | 6 BUS-6 100 1 1 1.007 -8.766 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 9 | 7 BUS-7 100 1 1 0.996 -10.97 233.8 84. 0. 0. 100. 1. 0. 0. 0. 0. 0 10 | 8 BUS-8 100 1 1 0.995 -11.47 522. 176. 0. 0. 100. 1. 0. 0. 0. 0. 0 11 | 9 BUS-9 100 1 1 1.028 -11.29 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 12 | 10 BUS-10 100 1 1 1.017 -6.381 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 13 | 11 BUS-11 100 1 1 1.012 -7.195 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 14 | 12 BUS-12 100 1 1 1. -7.21 8.5 88. 0. 0. 100. 1. 0. 0. 0. 0. 0 15 | 13 BUS-13 100 1 1 1.014 -7.095 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 16 | 14 BUS-14 100 1 1 1.011 -8.764 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 17 | 15 BUS-15 100 1 1 1.015 -9.18 320. 153. 0. 0. 100. 1. 0. 0. 0. 0. 0 18 | 16 BUS-16 100 1 1 1.032 -7.776 329. 32.3 0. 0. 100. 1. 0. 0. 0. 0. 0 19 | 17 BUS-17 100 1 1 1.034 -8.774 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 20 | 18 BUS-18 100 1 1 1.031 -9.615 158. 30. 0. 0. 100. 1. 0. 0. 0. 0. 0 21 | 19 BUS-19 100 1 1 1.05 -3.152 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 22 | 20 BUS-20 100 1 1 0.991 -4.563 680. 103. 0. 0. 100. 1. 0. 0. 0. 0. 0 23 | 21 BUS-21 100 1 1 1.032 -5.371 274. 115. 0. 0. 100. 1. 0. 0. 0. 0. 0 24 | 22 BUS-22 100 1 1 1.05 -0.923 0. 0. 0. 0. 100. 1. 0. 0. 0. 0. 0 25 | 23 BUS-23 100 1 1 1.045 -1.122 247.5 84.6 0. 0. 100. 1. 0. 0. 0. 0. 0 26 | 24 BUS-24 100 1 1 1.037 -7.656 308.6 -92.2 0. 0. 100. 1. 0. 0. 0. 0. 0 27 | 25 BUS-25 100 1 1 1.057 -5.649 224. 47.2 0. 0. 100. 1. 0. 0. 0. 0. 0 28 | 26 BUS-26 100 1 1 1.052 -6.905 139. 17. 0. 0. 100. 1. 0. 0. 0. 0. 0 29 | 27 BUS-27 100 1 1 1.037 -8.917 281. 75.5 0. 0. 100. 1. 0. 0. 0. 0. 0 30 | 28 BUS-28 100 1 1 1.05 -3.394 206. 27.6 0. 0. 100. 1. 0. 0. 0. 0. 0 31 | 29 BUS-29 100 1 1 1.05 -0.635 283.5 26.9 0. 0. 100. 1. 0. 0. 0. 0. 0 32 | 30 BUS-30 100 1 1 2 1.047 -4.591 0. 0. 250. 144.9193 100. 1.0475 999900 -99990 0. 0. 0 33 | 31 BUS-31 100 1 1 3 0.982 0. 9.2 4.6 572.8349207.0362 100. .98200 999900 -99990 0. 0. 0 34 | 32 BUS-32 100 1 1 2 0.983 1.6155 0. 0. 650. 205.7308 100. .98310 999900 -99990 0. 0. 0 35 | 33 BUS-33 100 1 1 2 0.997 2.0646 0. 0. 632. 108.9353 100. .99720 999900 -99990 0. 0. 0 36 | 34 BUS-34 100 1 1 2 1.012 0.6262 0. 0. 508. 166.9861 100. 1.0123 999900 -99990 0. 0. 0 37 | 35 BUS-35 100 1 1 2 1.049 4.0369 0. 0. 650. 211.1116 100. 1.0693 999900 -99990 0. 0. 0 38 | 36 BUS-36 100 1 1 2 1.063 6.7295 0. 0. 560. 100.4374 100. 1.0635 999900 -99990 0. 0. 0 39 | 37 BUS-37 100 1 1 2 1.027 1.1354 0. 0. 540. 0.64734 100. 1.0278 999900 -99990 0. 0. 0 40 | 38 BUS-38 100 1 1 2 1.026 6.4281 0. 0. 830. 22.65884 100. 1.0265 999900 -99990 0. 0. 0 41 | 39 BUS-39 100 1 1 2 1.03 -11.1 1104. 250. 1000. 87.8826 100. 1.03 999900 -99990 0. 0. 0 42 | -999 43 | BRANCH DATA FOLLOWS 46 ITEMS 44 | 2 1 1 1 0.0035 0.0411 0.6987 0 0 0 0 0 0 0 0 0 0 0 0 45 | 39 1 1 1 0.001 0.025 0.75 0 0 0 0 0 0 0 0 0 0 0 0 46 | 3 2 1 1 0.0013 0.0151 0.2572 0 0 0 0 0 0 0 0 0 0 0 0 47 | 25 2 1 1 0.007 0.0086 0.146 0 0 0 0 0 0 0 0 0 0 0 0 48 | 4 3 1 1 0.0013 0.0213 0.2214 0 0 0 0 0 0 0 0 0 0 0 0 49 | 18 3 1 1 0.0011 0.0133 0.2138 0 0 0 0 0 0 0 0 0 0 0 0 50 | 5 4 1 1 0.0008 0.0128 0.1342 0 0 0 0 0 0 0 0 0 0 0 0 51 | 14 4 1 1 0.0008 0.0129 0.1382 0 0 0 0 0 0 0 0 0 0 0 0 52 | 6 5 1 1 0.0002 0.0026 0.0434 0 0 0 0 0 0 0 0 0 0 0 0 53 | 8 5 1 1 0.0008 0.0112 0.1476 0 0 0 0 0 0 0 0 0 0 0 0 54 | 7 6 1 1 0.0006 0.0092 0.113 0 0 0 0 0 0 0 0 0 0 0 0 55 | 11 6 1 1 0.0007 0.0082 0.1389 0 0 0 0 0 0 0 0 0 0 0 0 56 | 8 7 1 1 0.0004 0.0046 0.078 0 0 0 0 0 0 0 0 0 0 0 0 57 | 9 8 1 1 0.0023 0.0363 0.3804 0 0 0 0 0 0 0 0 0 0 0 0 58 | 39 9 1 1 0.001 0.025 1.2 0 0 0 0 0 0 0 0 0 0 0 0 59 | 11 10 1 1 0.0004 0.0043 0.0729 0 0 0 0 0 0 0 0 0 0 0 0 60 | 13 10 1 1 0.0004 0.0043 0.0729 0 0 0 0 0 0 0 0 0 0 0 0 61 | 14 13 1 1 0.0009 0.0101 0.1723 0 0 0 0 0 0 0 0 0 0 0 0 62 | 15 14 1 1 0.0018 0.0217 0.366 0 0 0 0 0 0 0 0 0 0 0 0 63 | 16 15 1 1 0.0009 0.0094 0.171 0 0 0 0 0 0 0 0 0 0 0 0 64 | 17 16 1 1 0.0007 0.0089 0.1342 0 0 0 0 0 0 0 0 0 0 0 0 65 | 19 16 1 1 0.0016 0.0195 0.304 0 0 0 0 0 0 0 0 0 0 0 0 66 | 21 16 1 1 0.0008 0.0135 0.2548 0 0 0 0 0 0 0 0 0 0 0 0 67 | 24 16 1 1 0.0003 0.0059 0.068 0 0 0 0 0 0 0 0 0 0 0 0 68 | 18 17 1 1 0.0007 0.0082 0.1319 0 0 0 0 0 0 0 0 0 0 0 0 69 | 27 17 1 1 0.0013 0.0173 0.3216 0 0 0 0 0 0 0 0 0 0 0 0 70 | 22 21 1 1 0.0008 0.014 0.2565 0 0 0 0 0 0 0 0 0 0 0 0 71 | 23 22 1 1 0.0006 0.0096 0.1846 0 0 0 0 0 0 0 0 0 0 0 0 72 | 24 23 1 1 0.0022 0.035 0.361 0 0 0 0 0 0 0 0 0 0 0 0 73 | 26 25 1 1 0.0032 0.0323 0.513 0 0 0 0 0 0 0 0 0 0 0 0 74 | 27 26 1 1 0.0014 0.0147 0.2396 0 0 0 0 0 0 0 0 0 0 0 0 75 | 28 26 1 1 0.0043 0.0474 0.7802 0 0 0 0 0 0 0 0 0 0 0 0 76 | 29 26 1 1 0.0057 0.0625 1.029 0 0 0 0 0 0 0 0 0 0 0 0 77 | 29 28 1 1 0.0014 0.0151 0.249 0 0 0 0 0 0 0 0 0 0 0 0 78 | 12 11 1 1 2 0.0016 0.0435 0. 0 0 0 0 0 1.006 0 0 0 0 0 0 79 | 12 13 1 1 2 0.0016 0.0435 0. 0 0 0 0 0 1.006 0 0 0 0 0 0 80 | 6 31 1 1 2 0. 0.025 0. 0 0 0 0 0 1.07 0 0 0 0 0 0 81 | 10 32 1 1 2 0. 0.02 0. 0 0 0 0 0 1.07 0 0 0 0 0 0 82 | 19 33 1 1 2 0.0007 0.0142 0. 0 0 0 0 0 1.07 0 0 0 0 0 0 83 | 20 34 1 1 2 0.0009 0.018 0. 0 0 0 0 0 1.009 0 0 0 0 0 0 84 | 22 35 1 1 2 0. 0.0143 0. 0 0 0 0 0 1.025 0 0 0 0 0 0 85 | 23 36 1 1 2 0.0005 0.0272 0. 0 0 0 0 0 1. 0 0 0 0 0 0 86 | 25 37 1 1 2 0.0006 0.0232 0. 0 0 0 0 0 1.025 0 0 0 0 0 0 87 | 2 30 1 1 2 0. 0.0181 0. 0 0 0 0 0 1.025 0 0 0 0 0 0 88 | 29 38 1 1 2 0.0008 0.0156 0. 0 0 0 0 0 1.025 0 0 0 0 0 0 89 | 19 20 1 1 2 0.0007 0.0138 0. 0 0 0 0 0 1.06 0 0 0 0 0 0 90 | -999 91 | LOSS ZONES FOLLOWS 0 ITEMS 92 | -99 93 | INTERCHANGE DATA FOLLOWS 0 ITEMS 94 | -9 95 | TIE LINES FOLLOWS 0 ITEMS 96 | -999 97 | END OF DATA --------------------------------------------------------------------------------