|
软件程序
软件/程序名称: |
牛顿拉夫讯 |
软件/程序大小: |
1k |
软件/程序语言: |
简体中文 |
运行平台: |
Windows XP/2003/Vista |
功能简介: |
牛顿拉夫讯 |
授权方式: |
免费版 |
研究/处理: |
汉化 |
马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!
您需要 登录 才可以下载或查看,没有账号?立即加入
×
谁能帮忙看看这个牛顿拉夫讯怎么改进的,能用于配电网潮流计算?5 A3 n ?8 P+ v) K% G
牛顿拉夫讯) |" f$ z& D4 P, H4 d: q$ H4 `2 q) `
double PowerFlow(int iNode, int iBalc, ROAD *pRoad, NodePQ *pNodePQ, bool vOutputVoltage = false)& h# J+ S( r9 D" a! K. M
{
" z6 y* O8 M( _. W! Y6 q: Y int M=2*(iNode-1); `4 K+ E9 O9 q: [5 w* j$ b2 b
int flag1[N]; // PV节点标志
" p8 {: ?7 v% m M. v% v8 m / s+ R) v! q3 R Q
double g[N][N]; // 电导0 p$ G+ m, J# `) H5 a9 C
double b[N][N]; // 电纳( g2 _; G3 P' V/ b2 E% y
double dvv[N]; // 电压微分& t: n; A# Y' X) ~5 x* V+ {( @
double angle[N]; // 相角 f4 p$ n4 \0 g+ H) p" K
double p[N],dp[N]; // 有功及其微分
+ v5 ~/ u8 M9 N* K: q double q[N],dq[N]; // 无功及其微分
" T, Y+ ], [# l: R double e[N]; // 节点电压实部
( d5 T9 H+ `; m% m7 H# m double f[N]; // 节点电压虚部
( \) D& W! s6 r2 M double *jcbb = new double[M];
& p: t5 \" u; R. G8 j double *jcb = new double [M][M];) y) t3 u1 A* l
3 y9 l ~2 S+ _4 C int i,j,i1,j1,n,m,t,k1,balc,node/*,flag,npv*/;$ s$ n" Z. k7 C) ^" Z/ w
double rr,xx,bb,k,com1,com2,sump=0.0,sumq=0.0;
* [% u( {/ V! d' d! m; K double lossp=0.0, lossq=0.0;
4 R, @2 l% d4 A+ z7 \$ x node = iNode; // 节点数
) _1 K( w3 o2 J& v( R balc = iBalc - 1; // 平衡节点3 q: {5 ?& x1 }! S2 B; o
for(i=0;i<node;i++){
0 L M* J& t/ u& @( [+ q- B flag1[i]=0;8 E3 ?- T. C" }4 a5 ]0 W
dp[i]=0.0;
$ x/ {6 p: o6 | dq[i]=0.0;, Z( h( }! o' K1 h9 d
dvv[i]=0.0;
( L$ o' ? G( h9 d: k }
& N! u* ^5 Q( E8 w5 Z 6 c' a( r D" c4 R7 Z. x! u7 c
for(i=0;i<node;i++) {
, o7 l9 _" _/ ^" V9 F for(j=0;j<node;j++){0 a- O; p L% E6 g5 k/ e
g[i][j]=0.0;) S1 G3 Y/ m, y9 \
b[i][j]=0.0;
: y2 q' N( ^7 { }
' A z# D& s3 j }
6 g) s4 i7 t7 v j3 W7 s8 ] for(n = 0; n < node-1; n++){ 6 C( m. D. g( \4 H+ z3 N
i = pRoad[n].head;& K! P d2 u6 w6 u r; ^- U; S: }
j = pRoad[n].tail;
R$ C. y' n: j3 Z' ^ rr = pRoad[n].r;6 b {1 W5 Y6 @$ f+ s. t
xx = pRoad[n].x;( O( s4 z$ d+ u& E, v: j, C1 }2 F
// printf("%d\t%d\t%.3f\t%.3f\n", pRoad[n].head, pRoad[n].tail, pRoad[n].r, pRoad[n].x);) `6 B+ Q5 a1 m2 j
bb = 0;
4 K! Y4 i6 P% n i. O4 R k = 1;- v% C* W& g- r. G
; L: u: W+ ^0 L" @7 a/ p8 \ g[i-1][j-1]+=-(rr/(rr*rr+xx*xx)/k);
! F% h j4 d9 Q2 e b[i-1][j-1]+=-(-xx/(rr*rr+xx*xx)/k);: S6 x- F U0 V; j% n( H, B! s
g[j-1][i-1]+=-(rr/(rr*rr+xx*xx)/k);! D2 e) n4 B) B4 ]
b[j-1][i-1]+=-(-xx/(rr*rr+xx*xx)/k);
( R2 w- \% N( q5 l g[i-1][i-1]+=rr/((rr*rr+xx*xx)*k*k);
% }( R! v, h$ d$ y1 K4 |7 ^ g[j-1][j-1]+=rr/(rr*rr+xx*xx);% y7 Q8 _* B( ]% p* h7 C' v& H
b[i-1][i-1]+=bb+(-xx/((rr*rr+xx*xx)*k*k));* v3 g6 z" j& K8 M3 k3 e5 j' B
b[j-1][j-1]+=bb+(-xx/(rr*rr+xx*xx)); y2 [; \+ n" f' w
}% ~8 v& d7 W$ ?" R# W8 u
for(i=0;i<node;i++){, \$ q' \$ }0 c6 E7 b( [" O) P$ `- t: H
angle[i] = 0;
2 B. C5 q7 d, ]+ Z% q v[i] = 1;0 v; Z$ |2 @ Q8 S7 s! ^
p[i] = pNodePQ[i].p;/ r3 H X% Q1 P% @. h8 V+ B
q[i] = pNodePQ[i].q;
- a8 `' k7 D, D/ K& O, V5 F- C, g// printf("P:%.3f\t Q:%.3f\n", pNodePQ[i].p, pNodePQ[i].q);) }, T. b$ B- R
e[i]=v[i]*cos(angle[i]*PI/180);- |9 G9 @) o5 C2 E/ J
f[i]=v[i]*sin(angle[i]*PI/180);
" ~( }% ]* | q+ n. d5 z7 d }
4 B) N! ~, y9 k, a$ R0 h5 E// flag1[1]=1;
# K- Q0 l- N) ?# S
6 b4 X4 q8 D+ [7 q" t& z9 S// printf("共有n=%d条支路\n",n);
; O7 I" a, b6 s) M+ G// printf("节点导纳矩阵如下:\n");
7 E. v- p* F4 L, l" I" J# Z- ]
4 K% q) k' A' y// for(i=0;i<node;i++){* g) u) Z$ E7 y: i' t- h
// for(j=0;j<node;j++)
; d7 b+ K" k6 _8 C! ]3 ~// printf("%lf+j%lf ", g[i][j],b[i][j]);+ {5 k. m' S7 Q' ^. R+ p
// printf("\n\n");}
- Z3 c- p# L. M* Y0 W2 q//
( ]0 d2 C3 [1 v+ h// printf("初始值如下:\n");
) S" ?. n3 T, Q Y8 R6 a8 W, M4 i3 ?, c// printf("节点号 电压 相角 有功 无功 e f\n");
S) R, y. Z6 h% N4 H$ L// for(i=0;i<node;i++)
# n! \& `9 o0 Y3 c! _// printf("%d %lf %lf %lf %lf %lf %lf\n", (i+1), v[i], angle[i], p[i], q[i], e[i], f[i]);% r7 g9 |6 a, A& m9 a& [1 n
0 g. ~/ E! Z3 z2 j
for(t=0;t<50;t++){6 r3 D0 j7 d6 Q. E1 t& P
// printf("\n第%d次迭代开始:\n", t);2 z9 N) Z5 O: P' g( W) m* p
for(i=0;i<node;i++){
/ k8 f2 O) B# ^9 J9 Y8 m' _ if(i==balc) /*如果是平衡节点*// T& B2 d+ `3 g Z0 `, V0 E6 i
continue;& i; q3 n/ g6 ?) |
else{ - c0 I7 d' r: {: Z
com1=0.0, com2=0.0;, h$ @8 y) _0 R7 P4 l7 x
for(j=0;j<node;j++){' H: R) X; @, `3 t, N) q% v% D9 k
com1+=g[i][j]*e[j]-b[i][j]*f[j];) A1 U0 `+ p& U6 U# K
com2+=g[i][j]*f[j]+b[i][j]*e[j];+ z3 M2 a4 I5 Y' H! p. c7 a0 k8 ]
}
9 C" t3 E6 {% s, J if(flag1[i]!=1){ /*如果是PQ节点*/" S1 s2 n8 a- c% ]0 b" W
dp[i]=p[i]-e[i]*com1-f[i]*com2;
: ~$ L r) x, O4 G8 Q dq[i]=q[i]-f[i]*com1+e[i]*com2;
6 s: I$ v! N3 y; n4 { }
- o( r3 A3 _& P/ @ else{
6 m' y$ g# n& H dp[i]=p[i]-e[i]*com1-f[i]*com2;
M4 [( }! x2 S6 C+ { dvv[i]=v[i]*v[i]-(e[i]*e[i]+f[i]*f[i]);- s1 N0 r6 m8 C& F6 Z
}. ]! B6 _6 e3 f T( _+ G. Z
}$ A5 y) P3 Z( _- M( i
}
8 r h+ B7 Q( Z * {3 G! v4 Q1 T# N( u0 S
for(i=0,j=0;i<node;i++){
$ P! n% F6 c% v8 { if(i==balc) continue;) N$ ? r, T. [
else if(flag1[i]!=1){
) J; d7 H8 h# z+ w F jcbb[j++]=dp[i];
4 X( s$ X& `* H& V5 D jcbb[j++]=dq[i];
6 n% z! \6 \+ Y, E- |// printf("\ndp[%d]=%lf\ndq[%d]=%lf",(i+1),dp[i],(i+1),dq[i]);2 S3 y. v8 J. U
}6 S5 l/ N7 F0 ~
else{
' ?2 r' a3 z! X" y4 i jcbb[j++]=dp[i];) @4 D! [6 K, J; N6 {: ]; U% r
jcbb[j++]=dvv[i];) d+ N" w# E$ W# O) R
// printf("\ndp[%d]=%lf\ndvv[%d]=%lf",(i+1),dp[i],(i+1),dvv[i]);
& Y+ t8 ` p$ R$ O8 {2 o; @ }: n) Y* d# m+ G% q4 e
}
- R2 F6 ]5 G3 B' {// printf("\n");
) y2 g4 S& [# ?2 g0 r g7 @/ ~$ i* h ) h% g- |9 s) ]0 r
for(i=0;i<node;i++) {; B+ s: _' {7 v8 U$ x
if(fabs(dp[i])>=E||fabs(dq[i])>=E||fabs(dvv[i])>=E)2 }4 o- l. f9 g3 J y
break;
) D' O+ g8 C, U }1 l @9 `9 c( N2 l/ y! v# {# I
if(i>=node). ^: {5 b5 W9 q9 q
break; ( O7 {; `% X& S
5 h4 q' N5 P. v0 ?2 s4 Z+ H6 p$ T, s
: O6 a2 h5 G- h. Y; z O for(i=0,i1=0;i<node;i++){
+ G- o+ z) `, A8 B if(i==balc)
4 m4 d$ @/ P6 H ?! C continue;! Y/ ^$ J* b/ J0 Q" g) A
i1++;0 @* J) _; r$ U. M1 H: {# j7 ^! M
n=2*i1;3 E" t; ~5 N. R Z8 \0 N( D& k
for(j=0,j1=0;j<node;j++){
$ @2 `% n) c9 `, |1 |3 ^2 d if(j==balc) continue;
( I6 ~( L. U/ G# _, S% u3 k j1++;
% l7 ]# y/ q+ o7 v& u m=j1*2;. o" D! }9 z* U# h7 v/ G* Q
if(i!=j){ 6 i5 {0 w, P! j! i) Q+ {; p
jcb[n-2][m-2]=-(g[i][j]*e[i]+b[i][j]*f[i]);# A' B, m1 _/ L) J1 m" e
jcb[n-2][m-1]=b[i][j]*e[i]-g[i][j]*f[i];
* W- a; l8 L, {# w3 G if(flag1[i]!=1)! L! k( g) X+ M2 N+ M4 ^6 _- B
{
3 \% V. ^ Z2 ^9 W5 _ x H7 c jcb[n-1][m-2]=jcb[n-2][m-1];8 o, M9 A$ f8 D" X0 L8 \9 M
jcb[n-1][m-1]=-jcb[n-2][m-2];7 d3 m% M: @! m, g5 P
}9 K" V. S" Y, R
else& R- t- F7 A J3 @8 ^' K
jcb[n-1][m-2]=jcb[n-1][m-1]=0.0;$ b6 r+ a$ Y2 K6 E" V
}0 _: a2 o# @3 { n
else{2 B1 [) H' n$ _. ^& m* f$ c
com1=0.0, com2=0.0;6 G; K3 V$ |: Y2 D, d
for(k1=0;k1<node;k1++)7 C* D% k L2 S3 \5 B+ g, B
{8 Q( C+ |& H1 Q8 s
com1+=g[i][k1]*e[k1]-b[i][k1]*f[k1];
, ^6 n# [# x( `: v com2+=g[i][k1]*f[k1]+b[i][k1]*e[k1];
; @8 l# G8 A% j' y) G9 [& D* \6 A0 T" e }
. [) t, y6 z, ~" r, n! K jcb[n-2][m-2]=-com1-g[i][i]*e[i]-b[i][i]*f[i];
2 L* s& v4 W5 J4 E+ D. ]8 S jcb[n-2][m-1]=-com2+b[i][i]*e[i]-g[i][i]*f[i];0 C* _% Q# x/ A) V- U: D
if(flag1[i]!=1)% l4 U' A T" \, \" g$ g, T3 ~( O
{6 L$ n& Q' m1 l
jcb[n-1][m-2]=com2+b[i][i]*e[i]-g[i][i]*f[i];
* _8 |7 M, @9 {* Z3 b jcb[n-1][m-1]=-com1+g[i][i]*e[i]+b[i][i]*f[i];6 d! d0 Y' E9 L4 Y
}
( }" @+ Q: Z+ } else
. {/ p) [4 f- Y; d) | {
+ R& I& }; x0 U; j6 a0 f+ v jcb[n-1][m-2]=-2*e[i];
. w0 q* c0 T! F2 ~ jcb[n-1][m-1]=-2*f[i];
2 _& S- @% k" G& I) X! u' B }
6 g l4 s" Y6 W4 H: C! |1 m }
: {7 v6 n, d. j% P) { }+ A4 S0 k) @, x+ j6 ~
}
# e" _6 B2 C. V! W: U
8 w1 C0 Q3 l. g/ U8 P; M$ w// printf("\n第%d次输出-J矩阵如下:\n", t);
9 u {: `% {- e. `' ` f3 _8 j for(i=0;i<2*(node-1);i++){& k) V i4 v* q$ L! p
for(j=0;j<2*(node-1);j++){
& V2 G) A0 a7 d) M" @( B jcb[i][j]*=-1.0;
& }# J* P- q4 b4 Q2 I g// printf("%lf ", jcb[i*M+j]);# J7 D+ I+ z4 t+ t3 f
}
* @& D6 z; i0 X" x8 y# b// printf("\n\n");
) B3 e+ G0 X1 B. a }1 w4 e5 I: j- L8 Z! [' u. k* @0 }
+ v# i; |2 y& h+ J5 k/ y% f4 J; @ /*算线形方程组*/
3 H3 n' }& h; `' [% D5 q O% n9 b if (agaus(&jcb[0],&jcbb[0],2*(node-1))!=0) {4 k* O4 G0 d" Y$ N. r4 ^$ F6 y
for (i=0,j=0;i<2*(node-1);i++) {
9 \6 E6 C' y1 b% n' x$ \; T/ d if(j==balc) 7 {2 O( l' Y* F, |! E9 U
j++;
$ Q1 s' N# x, H' s7 [$ [ + _/ D' Z% _+ C! Y
if(i%2==0){0 Q8 ~2 ^) O0 ]* x1 r8 O
e[j]+=jcbb[i];
. l8 ^& `/ ]. Q/ E# n3 ~2 h// printf("de[%d]=%lf e[%d]=%lf\n", (j+1),jcbb[i],(j+1),e[j]); [3 `, f! R! o. o) n) V- R$ M
}+ O" f: q, P4 _6 m) M8 A+ M
else{
& E2 h" D g! j6 W- ] X f[j]+=jcbb[i];
7 E- c5 u4 M' ]: w' F/ ]// printf("df[%d]=%lf f[%d]=%lf\n",(j+1),jcbb[i],(j+1),f[j]);
7 y! H& a9 X1 W6 P6 P4 ^1 ~6 V5 w j++;8 T% H7 ] f! K( ~/ j
}) m h: E' \5 W, m) O' H
}
3 Q) g: x1 ]9 x/ g, a6 _, S }# O, a4 M: U& g) d
}
n/ G- q! m4 ]) s+ p5 j % L! S4 C9 }9 W! P5 y( |
// printf("共经过了%d次迭代\n", t);% C3 h8 d: Y# b6 _. [
7 k7 n$ t. l: j* y' T$ n- x /*求平衡节点P,Q*/5 D# o+ S+ b8 m" c
i=balc;. C$ g" A$ P' v: f8 @, J
com1=0.0, com2=0.0;, W2 K3 ^$ Z) P8 B
for(j=0;j<node;j++){
. c7 k" y- K3 C/ x# N- v3 i com1+=g[i][j]*e[j]-b[i][j]*f[j];- [% P) x a' I$ {" g
com2+=g[i][j]*f[j]+b[i][j]*e[j];
8 E) B/ \8 U- | }
6 X- H$ G: y* v% D' J2 | d2 \ p[i]=e[i]*com1+f[i]*com2;
, T2 R1 P6 Z/ ^# E5 E q[i]=f[i]*com1-e[i]*com2;
, X. P5 g0 I ^: u* W7 A+ M+ o4 H y3 ?+ @6 a$ | u3 t5 M
/*求其他各节点P,Q*/+ p0 Q( ^7 v' ?7 t0 P1 B
for(i=0;i<node;i++){, f7 o' L1 G" q" M7 C
if(i==balc) continue;1 N8 U# Y3 J! b
else
, G. W5 |; C! N; ?5 j% B {
: t* Z1 E% k' X, W6 \ com1=0.0, com2=0.0;- |. y9 S9 v: w& v
for(j=0;j<node;j++)6 M( d8 o* Z$ e
{
2 e$ D4 {3 X' c+ g: n com1+=g[i][j]*e[j]-b[i][j]*f[j];
' F5 r+ b9 M; j2 l# [8 l3 ~0 a com2+=g[i][j]*f[j]+b[i][j]*e[j];
3 j$ s5 |/ [6 J6 A6 f) T( e }
9 p2 y& w; f5 e, k& x a9 @) _ p[i]=e[i]*com1+f[i]*com2; h3 Q C9 u; n# S0 l
q[i]=f[i]*com1-e[i]*com2;
' X2 }0 x0 p' E9 O }, Q; B. Z- ~8 R2 H( C
}
8 J) r- }- k, I: j& c5 V- [ " G. e l- J X# P4 G, P* P
// printf("最终结果为:\n");- G8 S/ {( q2 G3 d) v
// printf("节点号 电压 相角 有功 无功 e f\n");- w+ x0 M/ S+ Z ?8 _2 s
for(i=0;i<node;i++)
, K7 F* j1 ?' Z& v2 @ {, K' e' h! h" u5 Y5 i4 W
v[i]=sqrt(e[i]*e[i]+f[i]*f[i]);
: g2 |# ]' t. H: U8 [% e/ e angle[i]=atan(f[i]/e[i])*180/PI;
6 B# e1 \5 n5 p/ g5 e6 M; w sump+=p[i];
7 g+ o% M3 X5 N! i L5 y* l sumq+=q[i];/ e2 V! e3 |1 W- q1 d+ ~) D# N) N
// printf("%d %lf %lf %lf %lf %lf %lf\n", (i+1), v[i], angle[i], p[i], q[i], e[i], f[i]);( W$ a( O+ g# C, G$ p
} |
|