|
软件程序
软件/程序名称: |
牛顿拉夫讯 |
软件/程序大小: |
1k |
软件/程序语言: |
简体中文 |
运行平台: |
Windows XP/2003/Vista |
功能简介: |
牛顿拉夫讯 |
授权方式: |
免费版 |
研究/处理: |
汉化 |
马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!
您需要 登录 才可以下载或查看,没有账号?立即加入
×
谁能帮忙看看这个牛顿拉夫讯怎么改进的,能用于配电网潮流计算?6 |/ x& X0 {0 {0 m- d I1 ]5 k7 A8 _
牛顿拉夫讯
& q5 v" O' A; ^" Z! wdouble PowerFlow(int iNode, int iBalc, ROAD *pRoad, NodePQ *pNodePQ, bool vOutputVoltage = false). E8 k! @, b& {4 p0 T; @ y
{
+ Y* l9 f: U) ^# x6 \ int M=2*(iNode-1);
7 z# a9 u5 r7 N1 T& u int flag1[N]; // PV节点标志
) Z1 `& p" k! Q ; s* f* o( ?5 u# G
double g[N][N]; // 电导. T" l6 U8 E, L0 `3 B, ?
double b[N][N]; // 电纳
+ k9 g. }- B) P* ^ double dvv[N]; // 电压微分
( F! l3 Y7 Q; O$ M- } double angle[N]; // 相角
% N6 M0 W# {* m- H# d) n3 Y double p[N],dp[N]; // 有功及其微分
5 y$ f8 r) f' Q% G5 ^+ L+ g" B double q[N],dq[N]; // 无功及其微分: f) ~9 B/ K0 `5 c, s9 X$ ^
double e[N]; // 节点电压实部2 K# U: Q. D. P! w
double f[N]; // 节点电压虚部
* Y4 k2 q* }& M1 v" l2 x4 h double *jcbb = new double[M];
4 X8 a9 Q/ w$ l( l, J6 G8 o$ H( x double *jcb = new double [M][M];: F% P( B& O0 \5 [
0 a. c+ h* j& \ t" u8 q. {8 K5 m
int i,j,i1,j1,n,m,t,k1,balc,node/*,flag,npv*/;
# q& A* L! a* i% v double rr,xx,bb,k,com1,com2,sump=0.0,sumq=0.0;+ x8 [% w& o8 E f$ N. G, E l _
double lossp=0.0, lossq=0.0;+ N, t, f& z) f/ Q5 D9 R% f& R& u
node = iNode; // 节点数 E$ _1 _# R8 S
balc = iBalc - 1; // 平衡节点* g6 G2 Q4 j* a6 a
for(i=0;i<node;i++){) H3 N& ~ f2 t; R, ?
flag1[i]=0;0 F! I( g% l r t
dp[i]=0.0;
% C! M( A% y( @ dq[i]=0.0;8 z8 H% W4 w$ Y/ x3 H
dvv[i]=0.0;* I$ z9 L' _) v0 ?
}
1 w, p$ Y6 q8 b 2 Q2 F+ {, I. ^& m/ o( F/ h1 v
for(i=0;i<node;i++) { o0 D% O& M k3 f/ y% E0 Q
for(j=0;j<node;j++){ s+ Q t6 c, `: F8 V* O
g[i][j]=0.0;8 [3 h- ~! A* e6 L5 `' D
b[i][j]=0.0;
! X" N* Q' Y }% D. j }1 R$ ^; Q5 B! ]
}
, X; s ?6 |3 _- o7 ^ for(n = 0; n < node-1; n++){ 6 O: C5 I5 ~0 h8 s) e" A: B
i = pRoad[n].head;) x$ X# D F/ Q3 c
j = pRoad[n].tail;$ l- w7 \: ~- j0 Q
rr = pRoad[n].r;7 W. ], X' h6 |
xx = pRoad[n].x;
' ?) R: \5 J; e$ C" b. f5 j! O// printf("%d\t%d\t%.3f\t%.3f\n", pRoad[n].head, pRoad[n].tail, pRoad[n].r, pRoad[n].x);
/ u3 `' f( Z# o- o bb = 0;5 N% P: G e, } Y5 r R- x
k = 1;+ ]5 f& p7 p4 R: k& Z& d! {
3 _5 _1 U! i$ b# T4 z g[i-1][j-1]+=-(rr/(rr*rr+xx*xx)/k);
9 y$ H( |+ U9 Z; [% F8 v( G b[i-1][j-1]+=-(-xx/(rr*rr+xx*xx)/k);
$ t \- s' d- p) Z1 i8 F- v g[j-1][i-1]+=-(rr/(rr*rr+xx*xx)/k);
8 M& x$ y2 K/ q& P b[j-1][i-1]+=-(-xx/(rr*rr+xx*xx)/k);! Y( d3 J3 b1 V2 p9 p# \9 U
g[i-1][i-1]+=rr/((rr*rr+xx*xx)*k*k);6 R9 b2 H8 T+ O! [. i5 |
g[j-1][j-1]+=rr/(rr*rr+xx*xx);6 o6 B5 O! Y1 |8 w, n1 V$ K
b[i-1][i-1]+=bb+(-xx/((rr*rr+xx*xx)*k*k));
/ X/ m7 U2 p- S' v b[j-1][j-1]+=bb+(-xx/(rr*rr+xx*xx));8 M+ t( L$ W9 K) ^# }
}- A. n! {$ N% X4 d
for(i=0;i<node;i++){
" d: l8 o# O9 R angle[i] = 0;* C0 R: t+ j1 O* a# H. K
v[i] = 1;) w, |! O! @% B! w7 W% D0 _
p[i] = pNodePQ[i].p;
6 w9 H3 n5 y' Y: @- e2 S q[i] = pNodePQ[i].q;" @$ D. I0 _ {6 ^/ J9 \
// printf("P:%.3f\t Q:%.3f\n", pNodePQ[i].p, pNodePQ[i].q);$ ^3 g8 R8 D( ]8 Y' m
e[i]=v[i]*cos(angle[i]*PI/180);1 P: o- G0 `1 R \8 [) D. S
f[i]=v[i]*sin(angle[i]*PI/180);
" m- f: P( B8 W1 u H n8 i }, C; H) u @) S% ?8 J" J" u
// flag1[1]=1;
5 u3 L/ _& c5 [6 Z' w$ S
1 x& q. j% u4 \1 v// printf("共有n=%d条支路\n",n);
+ J6 f( p0 O4 x7 v' D( d/ i8 p) t// printf("节点导纳矩阵如下:\n");& l/ w G! W8 F) `
; [" V# a- \7 e0 q" j// for(i=0;i<node;i++){( r* D' g7 B1 {! X
// for(j=0;j<node;j++)
8 _* j" u. T, n2 ~2 j// printf("%lf+j%lf ", g[i][j],b[i][j]);
* H. {( v' u5 ], P7 c' @// printf("\n\n");}3 d* p& K0 P) l
//% M0 r; O+ R& A% G+ P# e7 n3 O
// printf("初始值如下:\n");1 W% i# A) X5 y- {( E0 p4 e% R
// printf("节点号 电压 相角 有功 无功 e f\n");
. w% b# H3 p6 }# L6 G) o# v& h// for(i=0;i<node;i++)& j5 q7 a. n1 A: r
// printf("%d %lf %lf %lf %lf %lf %lf\n", (i+1), v[i], angle[i], p[i], q[i], e[i], f[i]);- ~2 X/ y5 L* ]% N5 O% u! B9 a: p; \% f
4 j4 X/ X/ o. o7 w3 B; b
for(t=0;t<50;t++){8 b/ r' [, b, h+ z" C" U. ~
// printf("\n第%d次迭代开始:\n", t);
" D: v: e! Q; F- y4 J5 W for(i=0;i<node;i++){
6 Y0 w% a( w3 U: ^1 W if(i==balc) /*如果是平衡节点*/7 D6 j# v ?) q
continue;
) {) N% ^$ s. } else{ / X3 [7 q3 n; M: W; [' X. q
com1=0.0, com2=0.0;$ C9 y; i. O+ q- q/ T2 K9 f0 P
for(j=0;j<node;j++){( B% H6 V# ~5 z
com1+=g[i][j]*e[j]-b[i][j]*f[j];
8 }5 v/ T. H) q* p$ o; Z com2+=g[i][j]*f[j]+b[i][j]*e[j];- f1 _" e6 H, M9 W% A" \! X
}& a. L. m+ Y% B* I: F: g% v$ y
if(flag1[i]!=1){ /*如果是PQ节点*/1 u6 H3 a' p1 n. t# I9 x x7 i
dp[i]=p[i]-e[i]*com1-f[i]*com2;
0 i7 o/ X# m d4 b! d dq[i]=q[i]-f[i]*com1+e[i]*com2;
2 X) I3 H3 r1 O" q: c }5 `* I a3 C7 c% E1 g( a6 O% \/ D( }3 \
else{
+ [% Y5 l1 w; [0 h* v dp[i]=p[i]-e[i]*com1-f[i]*com2;5 t5 t" s1 o+ H# U% z2 k
dvv[i]=v[i]*v[i]-(e[i]*e[i]+f[i]*f[i]);+ k8 Q+ m+ a% A: p7 B
}7 S$ Y) a. j" g) g- c5 o1 ]
}, W/ x: W( j; h
}% y- P' c; W' `1 c& D. i8 y; g% j6 {
6 i" ]+ [1 r/ I3 u( c for(i=0,j=0;i<node;i++){
9 Q8 x9 d( F( K3 t$ ~ if(i==balc) continue;
0 |+ s. V/ L; Y2 d6 e# @2 o* j7 e else if(flag1[i]!=1){9 `$ W3 c7 r' t! p7 ~* R
jcbb[j++]=dp[i];
7 a( i% e( {: _ K3 m+ k. J$ f) Q! f jcbb[j++]=dq[i];
- Q8 r' Q; o% w' g. i8 e' K// printf("\ndp[%d]=%lf\ndq[%d]=%lf",(i+1),dp[i],(i+1),dq[i]);
4 q! M" [4 l; I Y/ n4 k }
6 j& g5 k, |/ Z( n l* M) w$ L7 i H else{
4 i* E, E* G) | I jcbb[j++]=dp[i];
! c0 o0 F. _! }9 E9 L jcbb[j++]=dvv[i];1 D; m3 B+ ^$ e& d1 e4 L
// printf("\ndp[%d]=%lf\ndvv[%d]=%lf",(i+1),dp[i],(i+1),dvv[i]); j7 g% U+ ~% c/ W) ?
}/ c0 u% M5 A; S9 J: W
}/ I& c" i* n6 D L3 Q: Q( [: Y
// printf("\n");7 ~# v4 L" \. x
$ J* j8 T3 x. J: U V
for(i=0;i<node;i++) {
" K7 h9 N6 Z2 Y+ l% ` e% i/ K, Q: t if(fabs(dp[i])>=E||fabs(dq[i])>=E||fabs(dvv[i])>=E)$ K+ s* x2 h" i! S& ]- b) R1 K
break;
: j1 x) {! S3 N+ o5 w0 | }
- r% T2 Y0 i4 p; T7 F if(i>=node)
" h% @1 J5 ^ x( W break;
" Q' G1 x& c/ u3 f6 Q1 O$ c
0 h, |: s% y% N, x
! t. @ @; }% { M( z6 r4 [ for(i=0,i1=0;i<node;i++){
6 U* }5 O* \ N: R& D! [ if(i==balc). h: n2 C( s6 x& u& d- R( U
continue;' c/ P3 T n$ z2 `
i1++;& ^3 y3 X2 q/ e7 K8 V0 H5 w
n=2*i1;% {1 @ @! M! K& L6 \) e# d
for(j=0,j1=0;j<node;j++){. }: C( n0 r ^6 i3 m
if(j==balc) continue;
' [3 B! F$ P9 l' M0 C9 i( z j1++;4 {0 n f! v' u% [* s4 |2 C9 Q
m=j1*2;
9 w+ h2 z6 e% Q7 u6 v; A if(i!=j){
$ j' h4 ~+ P H* V jcb[n-2][m-2]=-(g[i][j]*e[i]+b[i][j]*f[i]);. i; p& U* C" S
jcb[n-2][m-1]=b[i][j]*e[i]-g[i][j]*f[i];3 U: J, O' v d" V7 C
if(flag1[i]!=1)3 l; L- O0 |! b) i) C1 B1 D+ ^
{" e- }' a3 v" r% i. L0 G
jcb[n-1][m-2]=jcb[n-2][m-1];4 Y' X" ^/ ] `9 M8 i
jcb[n-1][m-1]=-jcb[n-2][m-2];) O* o3 s* Z, D. X7 n
}
1 @* P. ~) b C else& ?4 C6 F8 B: ]- l- A
jcb[n-1][m-2]=jcb[n-1][m-1]=0.0;
7 V: e3 ~% u* ~ }' v1 B! y) F6 `8 g* y# H
else{
# }& @) a O) U, ^ com1=0.0, com2=0.0;
9 D6 f/ E: ~; ^2 N9 e for(k1=0;k1<node;k1++)
9 F% Y# K' [! G6 ^( m {
+ ^0 Y' E/ ?! H1 v/ a5 z/ v4 z& N com1+=g[i][k1]*e[k1]-b[i][k1]*f[k1];! n T0 W# @7 P( c3 z1 {
com2+=g[i][k1]*f[k1]+b[i][k1]*e[k1];
2 _* K) N0 |' A }
' S6 }) ? x. w& Q; {5 m; ^. F jcb[n-2][m-2]=-com1-g[i][i]*e[i]-b[i][i]*f[i];
. j) |- A. W7 s4 w+ T% B# x jcb[n-2][m-1]=-com2+b[i][i]*e[i]-g[i][i]*f[i];
% V$ O# E% e. t if(flag1[i]!=1)' \! g: m% I- v! k+ V
{# }5 V) z8 {6 ?) K5 d
jcb[n-1][m-2]=com2+b[i][i]*e[i]-g[i][i]*f[i];
8 E) j% P3 S6 r2 p2 H, x1 F; r; N jcb[n-1][m-1]=-com1+g[i][i]*e[i]+b[i][i]*f[i];' f/ C; K$ B- W ?3 X
}
- z- y" W( ?- a/ ?8 _% B else$ [7 ^5 S7 X; ]5 J9 U
{! Y% @( [3 T7 v$ { W
jcb[n-1][m-2]=-2*e[i];
( a/ ]( H3 N& F, \. e6 m jcb[n-1][m-1]=-2*f[i];0 P( p2 a* t! }; j( T: C& t
}+ ~- \$ L: N: v7 Y& V) I, C- @( h
}
, g4 N: G* r% A8 L4 }+ t }
8 S- Q# a1 v1 v/ \0 Z }
5 q" h6 q7 h# {6 j& T4 D/ g ( n! y- B; \0 o
// printf("\n第%d次输出-J矩阵如下:\n", t);
. z: _0 a% M! N- y1 s- L for(i=0;i<2*(node-1);i++){6 J* T# _2 G- O2 ]6 Y2 e3 Z; ?
for(j=0;j<2*(node-1);j++){5 U3 U1 y: _; d! U+ B
jcb[i][j]*=-1.0;
+ u) ~5 y/ z4 o" T* y, m$ _// printf("%lf ", jcb[i*M+j]);
( K/ {4 \: v7 s3 G* r }- O9 Q; K6 r* A" v
// printf("\n\n");
( i$ }* W# n* ]9 h- ]5 A }; u8 I/ f$ W3 X4 g$ H
" S' l; C# H9 a /*算线形方程组*/
3 n- `: A; x8 |7 w2 s if (agaus(&jcb[0],&jcbb[0],2*(node-1))!=0) {
% Y a! [4 ]/ K$ p, K for (i=0,j=0;i<2*(node-1);i++) {0 A& N) S* l4 x/ v6 P- }
if(j==balc)
' g/ D: c; H' S2 d% c4 _ j++;
+ u+ e5 J: E9 p( ]+ u/ {
( E7 Y6 h% W, z1 i* F( m: Y9 Q if(i%2==0){
8 b6 v a- r8 J# ]# a e[j]+=jcbb[i];
1 E! U& G& ~, H// printf("de[%d]=%lf e[%d]=%lf\n", (j+1),jcbb[i],(j+1),e[j]);2 H L! J( l. W- i
}
7 v4 I; y W( S$ i4 } else{
& x; |' [! `! o! F f[j]+=jcbb[i];: Y3 a3 D! O* U% o+ z% L0 g. I+ A
// printf("df[%d]=%lf f[%d]=%lf\n",(j+1),jcbb[i],(j+1),f[j]);
) f' b( B8 f4 e: G! B$ Z' { M j++;! q* ^6 J$ P P) v* b
}' G/ t! q# t5 n: ^, a
} _. B& ~5 S% L+ B2 m# A
}
! o3 \% H- j9 p }
/ m3 w5 u- _6 l$ G0 ~5 Q/ ] G+ `" Q # b/ P; p6 j% B
// printf("共经过了%d次迭代\n", t);
7 p1 o/ y3 D6 d% K" v
' r3 J5 n+ z( ]) o /*求平衡节点P,Q*/
9 t8 m8 j" G9 {6 s i=balc;
4 Z' h& ?2 c, X com1=0.0, com2=0.0;1 E' x9 l9 Q# }8 Q5 k
for(j=0;j<node;j++){
( h4 g7 }, {- b3 p- _ com1+=g[i][j]*e[j]-b[i][j]*f[j];
6 h" h6 m6 _* \1 [ com2+=g[i][j]*f[j]+b[i][j]*e[j];
2 j% p9 {5 U. W/ A' N3 i }
7 g' o4 |' [% E8 W7 x% T; p8 T p[i]=e[i]*com1+f[i]*com2;6 q- @% M" a' l, |1 A- j
q[i]=f[i]*com1-e[i]*com2;4 n( N& S% n0 @- Y
2 H1 y1 y3 s9 x8 W /*求其他各节点P,Q*/7 k+ R. Z5 f1 _1 T
for(i=0;i<node;i++){2 z2 T$ @' ~- T: r4 ^- b) y5 v
if(i==balc) continue;, w& F: q, U( L$ J; H. q
else
2 o1 U7 M! o9 a& R7 [ {
3 ^9 c4 Q8 z' E4 Y( C4 F0 ? com1=0.0, com2=0.0;" [4 d' a. s9 Y, v
for(j=0;j<node;j++): M. L+ D7 X# r; A, @1 h9 P
{& G j4 k# T' j3 _- W; W) x+ Y
com1+=g[i][j]*e[j]-b[i][j]*f[j];5 ~4 @/ `# u0 _; @# F) j
com2+=g[i][j]*f[j]+b[i][j]*e[j];
9 Y+ F# \/ D/ z# y; Z- b( M" w. S }6 T3 X. q4 g8 i& |+ [
p[i]=e[i]*com1+f[i]*com2;% W, ?* o1 p8 k9 X
q[i]=f[i]*com1-e[i]*com2;- v* M6 f7 M8 ^: J3 J" D8 C
}+ o1 K j2 Z3 C+ @6 k% X; ?1 K. @
}
7 d0 S1 e ^2 s1 n. S# c ' F4 W: x3 L; b
// printf("最终结果为:\n");6 u4 U& P# {" d! c J3 n1 \5 W2 w. G2 w
// printf("节点号 电压 相角 有功 无功 e f\n");' p2 n) B3 K8 ?! B4 y0 n
for(i=0;i<node;i++)) ^0 `1 g, v+ G, O$ c* [
{! ?, v1 I" q4 b7 t% X- y
v[i]=sqrt(e[i]*e[i]+f[i]*f[i]);! G( C! F# d, k' l8 L
angle[i]=atan(f[i]/e[i])*180/PI;
0 T7 [* N3 i$ Q7 M5 h/ b/ r! C+ F; b sump+=p[i];
) }# } H/ X1 v9 C/ w# t+ s sumq+=q[i];- Z' _3 i) Q j9 h" o6 P8 q& G
// printf("%d %lf %lf %lf %lf %lf %lf\n", (i+1), v[i], angle[i], p[i], q[i], e[i], f[i]);- ]4 B- E; M) }/ f) N2 L
} |
|