|
|
软件程序
| 软件/程序名称: |
牛顿拉夫讯 |
| 软件/程序大小: |
1k |
| 软件/程序语言: |
简体中文 |
| 运行平台: |
Windows XP/2003/Vista |
| 功能简介: |
牛顿拉夫讯 |
| 授权方式: |
免费版 |
| 研究/处理: |
汉化 |
马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!
您需要 登录 才可以下载或查看,没有账号?立即加入
×
谁能帮忙看看这个牛顿拉夫讯怎么改进的,能用于配电网潮流计算?- _) U0 ?3 j; N, v
牛顿拉夫讯
2 J1 d6 R# l3 W) n8 O4 zdouble PowerFlow(int iNode, int iBalc, ROAD *pRoad, NodePQ *pNodePQ, bool vOutputVoltage = false)
$ c. c( u! P1 T1 u+ r. _; D6 w4 r{
: g; l4 C6 [6 F% U& m$ J int M=2*(iNode-1);
: q$ Y7 V2 x. k int flag1[N]; // PV节点标志* i- t) m7 n" ?
( y8 M/ U/ N( \% [' \" b double g[N][N]; // 电导
6 L2 F$ x5 o- `' I double b[N][N]; // 电纳9 \6 ~3 m' A- a4 }
double dvv[N]; // 电压微分. G0 S$ ? Y8 P1 I5 S. u& p
double angle[N]; // 相角 Q# [+ j- X& `4 W% H" z
double p[N],dp[N]; // 有功及其微分8 u8 L3 y3 X7 U. t
double q[N],dq[N]; // 无功及其微分
& l: P. _4 o3 L) \- \ Y double e[N]; // 节点电压实部. z' H1 i& c0 N
double f[N]; // 节点电压虚部
) d. \; l L, Z7 R/ a& n, D6 ? double *jcbb = new double[M];
/ x& l' p+ g+ ?, ^9 w( \6 h double *jcb = new double [M][M];
: y9 O% |- A0 F# P# t
1 K, U$ H& R# S/ v) |! w. j# m8 A/ E int i,j,i1,j1,n,m,t,k1,balc,node/*,flag,npv*/;* d% ~/ X4 P4 O! V
double rr,xx,bb,k,com1,com2,sump=0.0,sumq=0.0;/ m. `$ U, ] a, l' b' v
double lossp=0.0, lossq=0.0;
) M/ p4 ^+ O# W6 [' l3 q0 } node = iNode; // 节点数3 Y& A- W/ A3 J( t; o9 \
balc = iBalc - 1; // 平衡节点
' u" Y& U2 W* s& Q( F, i for(i=0;i<node;i++){# M7 I8 l3 b Q3 j' ]+ b
flag1[i]=0;% Y9 @) d2 l2 I1 Q# z1 {; A
dp[i]=0.0;
4 T' b4 k p8 \% w" L6 E1 {9 o dq[i]=0.0;
, v+ g( F) B# S dvv[i]=0.0;3 P* e: C0 V! e7 c% ]# N
}# Y: l: A' S. ?5 a
8 w! }* | O2 i7 k for(i=0;i<node;i++) {
* q* V+ U @+ f3 P" B& n for(j=0;j<node;j++){
& ~% J. Y; O6 z* o, ?" _" } g[i][j]=0.0;& G, Y/ y+ e) T- P3 c9 |7 ?
b[i][j]=0.0;
$ j; b7 I+ W8 N4 M) u }8 O, a: P0 n7 {2 X2 |* Y
}- G% {2 s t. j4 b6 q
for(n = 0; n < node-1; n++){
% i( j; x" P/ E q. Y5 } r& w) [ i = pRoad[n].head;$ ^7 d5 v% E5 _% w' z
j = pRoad[n].tail;. ?& [$ d3 J2 s
rr = pRoad[n].r;5 @$ ?7 ^# a' G) q1 q
xx = pRoad[n].x;1 n' A$ |* n+ r4 E% O Y* U
// printf("%d\t%d\t%.3f\t%.3f\n", pRoad[n].head, pRoad[n].tail, pRoad[n].r, pRoad[n].x);* e, H! ]1 G) k- ]/ l/ @
bb = 0;' r: B, g7 N' C
k = 1;
0 v" L% v/ \6 `" k( B. ^ ! x& T" ]7 @+ D
g[i-1][j-1]+=-(rr/(rr*rr+xx*xx)/k);
0 Z0 ]( o2 t+ O' [0 r2 `) g6 G% Q3 m b[i-1][j-1]+=-(-xx/(rr*rr+xx*xx)/k);
( X( X$ ~; _3 ~& ~0 G! o8 ` g[j-1][i-1]+=-(rr/(rr*rr+xx*xx)/k);
$ M5 B- A& h* Z b[j-1][i-1]+=-(-xx/(rr*rr+xx*xx)/k);
( N: r- T2 L0 L) E% T g[i-1][i-1]+=rr/((rr*rr+xx*xx)*k*k);' O$ t; m! P0 m" Q8 \
g[j-1][j-1]+=rr/(rr*rr+xx*xx);- e- T! W" s& B3 E
b[i-1][i-1]+=bb+(-xx/((rr*rr+xx*xx)*k*k));( U7 k1 a: Y, f& P! U
b[j-1][j-1]+=bb+(-xx/(rr*rr+xx*xx));- W! x {$ c, L1 x. E) I3 m
}
; C* X- |+ W ^) r6 H, R% F2 O/ N( N/ n for(i=0;i<node;i++){
- J" N( a1 l/ c c7 V/ `: P angle[i] = 0;
" R! E* L' z! B6 O- k7 _ v[i] = 1;% T) q! V7 Z4 C- {/ e! W. ^- {
p[i] = pNodePQ[i].p;
3 M- C5 w; t& @) p* b7 U q[i] = pNodePQ[i].q;& y$ i1 B% j2 r. s4 W0 Z4 ~7 ]
// printf("P:%.3f\t Q:%.3f\n", pNodePQ[i].p, pNodePQ[i].q);
* T" \) ?# ^# C# J% e4 {+ b e[i]=v[i]*cos(angle[i]*PI/180);$ A2 d: h* w! [9 V- E
f[i]=v[i]*sin(angle[i]*PI/180);; s4 U; a) \% J* ^1 ~
}
. ?- ~$ p, Z( E6 L) v4 B// flag1[1]=1;2 b8 t) u$ ?& `4 a7 y7 }9 c
+ U9 U4 ]! V: e9 e# ?* w
// printf("共有n=%d条支路\n",n);
5 O3 K+ X9 Q+ D// printf("节点导纳矩阵如下:\n");
' G6 o) e( ]% ?. t$ h# t4 }! m: P 3 l; G4 g, u; G3 P! K4 M
// for(i=0;i<node;i++){( d _3 @8 t; h+ P5 r
// for(j=0;j<node;j++)
1 r0 z Y, g& H, h// printf("%lf+j%lf ", g[i][j],b[i][j]);
5 N% E M0 Z& s n1 s d; ]// printf("\n\n");}# g6 Y) [8 I! C$ B' {6 ]6 N
//
$ C) c# t& x; J1 X0 f4 J6 z7 t// printf("初始值如下:\n");+ T8 j2 q T0 b6 \7 f# S a
// printf("节点号 电压 相角 有功 无功 e f\n");
9 c& _& v3 I* m+ S' e) ]9 A// for(i=0;i<node;i++)# g* o/ H1 W U2 C" G& V9 V& W
// printf("%d %lf %lf %lf %lf %lf %lf\n", (i+1), v[i], angle[i], p[i], q[i], e[i], f[i]);
! s5 V, F! J8 f0 {- j
( b$ b3 s0 K# n/ T0 b; r6 H for(t=0;t<50;t++){
/ j+ q5 U9 l1 N: Q& C// printf("\n第%d次迭代开始:\n", t);6 Q1 y/ y' I( e9 I: I$ l/ F
for(i=0;i<node;i++){: u; c) v- l6 f( T3 S
if(i==balc) /*如果是平衡节点*/& R* i5 C" K, S! h% C
continue;# a) x$ A5 ^/ @% X4 a5 p9 a# }
else{ 3 R. y0 U& F3 c8 y
com1=0.0, com2=0.0;
) X3 ~ v0 J- C4 t+ t for(j=0;j<node;j++){( R" A* H5 l8 x( t7 z
com1+=g[i][j]*e[j]-b[i][j]*f[j];
4 I+ I8 e4 J5 a, A: r com2+=g[i][j]*f[j]+b[i][j]*e[j];
3 a9 Q# q3 G+ q* Y' a( e* U }4 R' O2 N: B2 D. f0 A/ a: g/ R/ Y
if(flag1[i]!=1){ /*如果是PQ节点*/
5 T+ d N% b' Z) k6 C dp[i]=p[i]-e[i]*com1-f[i]*com2;5 ? z5 \0 E) ~5 h
dq[i]=q[i]-f[i]*com1+e[i]*com2;
/ ?& ]+ ^5 `2 R, h' B3 T }; \! u' w, }6 ]% N7 z7 Q
else{
" ]2 m: T: f- y+ F/ s/ T0 c dp[i]=p[i]-e[i]*com1-f[i]*com2;7 A1 k% M! I. i% ^' Q
dvv[i]=v[i]*v[i]-(e[i]*e[i]+f[i]*f[i]);
9 K* d/ v% _0 D4 O }. z! q" d$ V% `# l( i4 P" u
}
& U. M2 `5 G6 }( K/ g& V/ j }' B3 }! M& i* ^- A% z
$ {6 |$ Z2 x- X$ e9 \) [, O
for(i=0,j=0;i<node;i++){
( T9 ?7 ]% I/ k2 @ k5 b if(i==balc) continue;
/ {, k* p: d6 K2 s else if(flag1[i]!=1){
, u0 [6 j, q& [- N) a7 y( S: Z: j O jcbb[j++]=dp[i];* j7 g2 z, S9 ]8 Y
jcbb[j++]=dq[i];
# Z0 O" _" J" w// printf("\ndp[%d]=%lf\ndq[%d]=%lf",(i+1),dp[i],(i+1),dq[i]);
& R5 g* S2 ]! u- W1 _' `" V4 I0 G+ x }/ W' U+ d& o( p* F
else{0 k9 z( C5 u! o4 f" P
jcbb[j++]=dp[i];
3 L/ H2 V' p) [# a; ? jcbb[j++]=dvv[i];, C4 B( b5 v: B* k
// printf("\ndp[%d]=%lf\ndvv[%d]=%lf",(i+1),dp[i],(i+1),dvv[i]);8 P7 z" I2 L2 z! q) N
}, j2 t; R4 R1 Z: u$ H# }) o
}
2 `- Z$ Z0 K3 w8 [1 a& e2 d// printf("\n");5 n8 v; \9 a5 l0 l) h7 W
9 j) C, l" i6 K3 l
for(i=0;i<node;i++) {
. O' x# i" \& G% A) o# t if(fabs(dp[i])>=E||fabs(dq[i])>=E||fabs(dvv[i])>=E)
2 A' e* K* p* Z/ l break;
% d/ K, D% x' O: G- @1 m }
. Y: \1 F* G/ P( o! P if(i>=node)
2 {: i; a U- _: P& k7 ?. C. P break; 7 ?; z/ |2 K; Y% F# W+ S7 N
, n: @) x; W8 S; G
* b% g2 |# J1 W$ l& ^
for(i=0,i1=0;i<node;i++){# u5 L$ }, n0 X/ I( h; s& F x" M
if(i==balc)
# q, H# ~% y z% I% `. F continue;
: \. |2 l# m5 L9 L3 _ i1++;
! Q1 f* E( [8 O# R# ] n=2*i1;
( F. o0 P, p4 S3 q- p for(j=0,j1=0;j<node;j++){; r) K3 @$ \$ }7 h
if(j==balc) continue;, a! O* o$ n3 H5 Q( M+ r
j1++;
# v+ T( o$ u" o7 l$ {/ w z4 T m=j1*2;
, I6 J- Z: {6 ^1 O: W if(i!=j){
* D" g! h; q! D) c jcb[n-2][m-2]=-(g[i][j]*e[i]+b[i][j]*f[i]);5 d) c4 D$ D- Z/ B' k5 f7 a" h' R0 N
jcb[n-2][m-1]=b[i][j]*e[i]-g[i][j]*f[i];
8 D3 o4 F: {* `5 P if(flag1[i]!=1)
v( S1 J1 G+ u0 z% l$ v {, I8 i7 V! r! N2 v' [0 ~
jcb[n-1][m-2]=jcb[n-2][m-1];
8 p" _6 R! m+ K! p7 V U jcb[n-1][m-1]=-jcb[n-2][m-2];/ `: B& D+ B% f
}! q. e6 j$ ?! E/ G: b% _4 R
else
" g4 e8 X" C! _/ P jcb[n-1][m-2]=jcb[n-1][m-1]=0.0;
|2 S1 y+ v8 P- D* W }9 ?. M+ \! l0 A5 p" B
else{
# @. S" N, X5 _; T7 s/ ?6 k. R4 b com1=0.0, com2=0.0;
/ n. `5 d5 G$ {# u/ V for(k1=0;k1<node;k1++)
9 e4 E* N; ] J3 Z7 l4 N: {+ I {3 t2 D/ L: J5 R2 }
com1+=g[i][k1]*e[k1]-b[i][k1]*f[k1];* P) ?% ^, [9 B& [: d' u
com2+=g[i][k1]*f[k1]+b[i][k1]*e[k1];8 | p- U6 j8 S! d
}8 y. c" X3 n: z
jcb[n-2][m-2]=-com1-g[i][i]*e[i]-b[i][i]*f[i];' v& l: G/ j, \* r, Y; L4 H8 j! H! L
jcb[n-2][m-1]=-com2+b[i][i]*e[i]-g[i][i]*f[i];: p* D3 H- d. I8 ^0 a
if(flag1[i]!=1)) T1 ?( @. R1 F( Y) [ j7 v" m
{3 C2 y' N% C7 k# T) U/ i" V
jcb[n-1][m-2]=com2+b[i][i]*e[i]-g[i][i]*f[i];
# E; B5 B$ \% g0 G jcb[n-1][m-1]=-com1+g[i][i]*e[i]+b[i][i]*f[i];
4 E# r) E. }3 U2 d! u/ n }
+ \7 {1 H" i+ I else6 U+ {0 C6 M% A' S
{
' G# b- U, N. @ jcb[n-1][m-2]=-2*e[i];( b' _) ]1 V6 K" K6 d$ G
jcb[n-1][m-1]=-2*f[i];
, F4 @8 l7 w) J/ H0 U- B }
' }! Z* g2 E$ v6 ]2 p* ` }2 a3 c! f# O' p. b1 Q
}
. U; m/ |" z0 z: j }
A+ p( L2 S+ @: R* |
2 \1 w, ?" v$ N# A- E" T// printf("\n第%d次输出-J矩阵如下:\n", t);
/ o( v/ a7 n. N [, l0 B for(i=0;i<2*(node-1);i++){+ U/ X' W+ h: G: w5 Z$ s4 z3 E. j
for(j=0;j<2*(node-1);j++){
& m, ?- s" ]& c' b5 v# [4 ]+ z) W6 G jcb[i][j]*=-1.0;
1 y5 T4 ~9 d; _& s2 ], j: j$ O// printf("%lf ", jcb[i*M+j]);$ ^& |# x* i; i7 M5 ?$ X) u$ A3 ]0 k7 {
}- [5 t {& T$ y% W
// printf("\n\n");
4 ]- K# {7 T3 ^8 M }
- t) @+ `5 Y' T" l' b
: A4 t- u. R7 X6 i /*算线形方程组*/
! j5 H) R; S# F' Y6 k if (agaus(&jcb[0],&jcbb[0],2*(node-1))!=0) {# d: A; K; }# Y2 r3 q
for (i=0,j=0;i<2*(node-1);i++) {! x5 K6 ?6 e2 T- m% Z$ V; g. q
if(j==balc) ) z/ r! z( T' K4 ?8 K* l
j++;
I8 F# p+ ~! Z% k1 r , b; N7 @* V0 y2 Z( z" ^6 B# p
if(i%2==0){
K; u# l0 u/ S e[j]+=jcbb[i];3 L3 x; ^% I) j! S) y
// printf("de[%d]=%lf e[%d]=%lf\n", (j+1),jcbb[i],(j+1),e[j]);
* c$ B4 ^, p) ^# U- {' ~( I; }+ {0 | }( \; q# ?, u L
else{+ H1 g3 J0 y3 X( F5 m
f[j]+=jcbb[i];
6 C; U/ _8 Y) e6 x# t6 X: n+ ]/ ]// printf("df[%d]=%lf f[%d]=%lf\n",(j+1),jcbb[i],(j+1),f[j]);+ _# g; v5 y% _1 Z- p+ q! k! t$ `
j++;" D4 H5 i: z1 [+ F0 e
}# B7 Z/ ~, z6 |5 \* W: h
}/ K& T; B) X0 M3 y# i4 A, H5 p
}
! t) K, y; z+ z o6 z" n8 c }
; _2 q t9 `5 l! p& P! F
# G0 Z6 D8 B9 s$ ?" S7 r// printf("共经过了%d次迭代\n", t);
; i) @/ s; S' J: O $ {5 c1 F1 i& M
/*求平衡节点P,Q*/% m. t% ~/ ]! Z# x" H; D1 t+ h( Q
i=balc;4 e+ ]; C9 F6 [7 x
com1=0.0, com2=0.0;* j5 T q7 x0 A3 E
for(j=0;j<node;j++){
( B1 ^) v# O; p( t com1+=g[i][j]*e[j]-b[i][j]*f[j];; c a! W' G+ p( e. D
com2+=g[i][j]*f[j]+b[i][j]*e[j];
. J+ g+ s" Q0 k. R+ \" d9 Y }/ S. X: a0 b9 p) J7 {5 x
p[i]=e[i]*com1+f[i]*com2;' |& h& E t7 [% R
q[i]=f[i]*com1-e[i]*com2;3 ~7 ^# ~0 D2 N( G1 A
7 D2 j5 U, I& p
/*求其他各节点P,Q*/2 N7 Q8 s0 Q7 @/ X' E
for(i=0;i<node;i++){
- _5 m8 E) ?2 S9 v* m, V) q- G if(i==balc) continue;
+ s* ~) F) Q- D" t else
) C) G) R: y- z+ _" z {3 ?& Q" ]) U$ l+ D L
com1=0.0, com2=0.0;- t% D$ F4 ~0 D( ?* |6 z3 x
for(j=0;j<node;j++)
& f9 {% K8 N: c( ]0 A2 { {5 u1 v! o. F" M- f Y! m, j
com1+=g[i][j]*e[j]-b[i][j]*f[j];
+ P' U$ b$ S! {( N9 A com2+=g[i][j]*f[j]+b[i][j]*e[j];
- X. Q& ~! v) C% s6 r2 x' I }
9 {* Y7 M* _! R' V p[i]=e[i]*com1+f[i]*com2;6 Z2 X% V! P, r6 @+ G2 g/ }
q[i]=f[i]*com1-e[i]*com2;
9 g f& u6 _/ B0 c* V }4 b3 s" v7 B; J+ R! ` y
}2 a0 c0 N7 J- O, P
+ S+ ^( R2 Q. L1 j# {+ o- y2 P
// printf("最终结果为:\n");5 e$ a7 X5 L0 _6 T* p. t' i& u
// printf("节点号 电压 相角 有功 无功 e f\n");3 s) v4 f) y G
for(i=0;i<node;i++)$ O( K1 _1 t3 C9 U& G
{
4 P! Z8 Z1 \' B& ~. U v[i]=sqrt(e[i]*e[i]+f[i]*f[i]);
6 G, h) W& N! ` angle[i]=atan(f[i]/e[i])*180/PI;% T) f( F: J0 K$ k( b! N) @9 N
sump+=p[i];
/ Y& K4 v) i: v sumq+=q[i];/ M1 Z; E5 }2 N' |: _6 x( c" f
// printf("%d %lf %lf %lf %lf %lf %lf\n", (i+1), v[i], angle[i], p[i], q[i], e[i], f[i]);4 ]* g; l* i, U' @
} |
|