|
|
软件程序
| 软件/程序名称: |
牛顿拉夫讯 |
| 软件/程序大小: |
1k |
| 软件/程序语言: |
简体中文 |
| 运行平台: |
Windows XP/2003/Vista |
| 功能简介: |
牛顿拉夫讯 |
| 授权方式: |
免费版 |
| 研究/处理: |
汉化 |
|
马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!
您需要 登录 才可以下载或查看,没有账号?立即加入
×
谁能帮忙看看这个牛顿拉夫讯怎么改进的,能用于配电网潮流计算?' R; N! P- I! P( |4 H0 m$ X$ o( s8 J
牛顿拉夫讯$ F8 @- [. Z. j0 \
double PowerFlow(int iNode, int iBalc, ROAD *pRoad, NodePQ *pNodePQ, bool vOutputVoltage = false)4 I6 r! ~: o, Z
{
/ z" J9 D3 c1 F0 M- c2 f m: z4 H: E int M=2*(iNode-1);, \8 H* e9 O% T K
int flag1[N]; // PV节点标志
/ H$ m- d9 c- a" k1 h7 g+ ~ # b% U! l5 Y$ r; G, \6 T- W$ ]1 i
double g[N][N]; // 电导
5 Y5 Y: [+ a; v% A double b[N][N]; // 电纳
/ k# ^! I1 o. ~1 D% o& ]7 } double dvv[N]; // 电压微分
+ k7 U/ r5 ^% f0 @, D8 b% w double angle[N]; // 相角( \8 @, F5 X8 @3 m3 f
double p[N],dp[N]; // 有功及其微分
9 I- {. J. w8 b, z. x double q[N],dq[N]; // 无功及其微分
& p+ m. M. _. [8 m, M+ P double e[N]; // 节点电压实部0 J; Z% z B9 ~, ?* M' t# M+ x
double f[N]; // 节点电压虚部, b9 [( [, `8 G1 L) f3 W
double *jcbb = new double[M];
8 m: p1 X. B3 ]$ g- ` double *jcb = new double [M][M];% t& A# h: p3 V; u
9 g: K% \. u. F: g& r5 C int i,j,i1,j1,n,m,t,k1,balc,node/*,flag,npv*/;9 e! q5 X' c: w$ f s! v
double rr,xx,bb,k,com1,com2,sump=0.0,sumq=0.0;
( t/ [# i! r: B: ^ double lossp=0.0, lossq=0.0;$ S6 }5 m' m% C6 a1 d
node = iNode; // 节点数9 u- R( r% Z+ u7 r2 \' R
balc = iBalc - 1; // 平衡节点5 {" w0 N2 D/ `0 Y3 B1 [
for(i=0;i<node;i++){9 h2 ?# G/ \. N) V+ o
flag1[i]=0; N6 `: A, C4 }, X7 H+ T
dp[i]=0.0;
! [/ a0 t2 ~8 c, E dq[i]=0.0;! z2 b1 P: N+ g2 m1 H7 N
dvv[i]=0.0;
" N# x& P }/ P( j- z) s; s }# R$ W6 X/ V# i" |
7 y9 A$ d6 w* n4 K n+ [ for(i=0;i<node;i++) {+ ^6 ~ _; L; B7 w$ |
for(j=0;j<node;j++){
/ | m6 N b; N U4 c. Z* @ g[i][j]=0.0;% ` H) R4 X4 ^
b[i][j]=0.0;
( ^; v& }1 N! P; l) V4 |& P/ q }
6 }) _1 p$ r9 m6 D }! t) H; k( C$ u% E
for(n = 0; n < node-1; n++){
0 f" Q0 |4 W4 | i = pRoad[n].head;
- P/ _6 T- T! Q j = pRoad[n].tail;
0 c& U; [4 q* k+ D* P- v6 ~' C rr = pRoad[n].r;
* |' H! R) M k- V) j3 Q! l/ h xx = pRoad[n].x;
* }- i4 p: [4 a1 ~) T// printf("%d\t%d\t%.3f\t%.3f\n", pRoad[n].head, pRoad[n].tail, pRoad[n].r, pRoad[n].x); \# y9 C V& X& g; [8 D. Q
bb = 0;! y4 i8 h6 d1 d7 ]: {' y
k = 1;
1 V5 R3 Q8 r9 h/ ^
& v$ \' t+ B( ? F g[i-1][j-1]+=-(rr/(rr*rr+xx*xx)/k);
( `: c- z/ ~5 W2 @4 t } b[i-1][j-1]+=-(-xx/(rr*rr+xx*xx)/k);; |! M8 ]* u- `% _/ c
g[j-1][i-1]+=-(rr/(rr*rr+xx*xx)/k);; M/ y$ q6 z, W/ t
b[j-1][i-1]+=-(-xx/(rr*rr+xx*xx)/k);
' F* z4 x, q# n4 [ h) m1 \6 V9 ~ g[i-1][i-1]+=rr/((rr*rr+xx*xx)*k*k);
, Z1 Q* P! |& s g[j-1][j-1]+=rr/(rr*rr+xx*xx);' t h7 M% \4 I6 K
b[i-1][i-1]+=bb+(-xx/((rr*rr+xx*xx)*k*k));
P$ A" K% W X b[j-1][j-1]+=bb+(-xx/(rr*rr+xx*xx));
. m. q7 n% { v6 L+ A8 C1 O4 w: H" g }, S Q) [+ m! M. b& V6 f& T
for(i=0;i<node;i++){
4 F/ e, J) j, m8 ?$ p$ w angle[i] = 0;
8 w a& N7 _& K3 M v[i] = 1;$ i- ]9 _1 V/ Y
p[i] = pNodePQ[i].p;5 K# u( K' P8 g* n9 U6 I$ x- [
q[i] = pNodePQ[i].q;! X: ?" A* Z8 @+ j" R5 U
// printf("P:%.3f\t Q:%.3f\n", pNodePQ[i].p, pNodePQ[i].q);; t3 T% h5 ^/ b4 T/ _, A, ]
e[i]=v[i]*cos(angle[i]*PI/180);
2 W) h3 Q; Z t4 c f[i]=v[i]*sin(angle[i]*PI/180);# d8 r. `3 y" k! p' ]/ L
}( u. d, e/ C# O: V; _6 L
// flag1[1]=1;
3 n; U7 |0 l/ k# u6 t7 n, ?* V1 ?. |( R
// printf("共有n=%d条支路\n",n);1 ], O1 L9 {0 u) E v5 ], ^
// printf("节点导纳矩阵如下:\n");6 H K# i3 _4 [
0 {9 T x' J9 {& l+ m// for(i=0;i<node;i++){+ W, j# e# e+ w5 {! Q
// for(j=0;j<node;j++)
: S/ u0 W* O/ r3 r% [- R% \: B+ j// printf("%lf+j%lf ", g[i][j],b[i][j]);
/ }) o0 V" \* b' m0 j' G4 _// printf("\n\n");}
5 E& v3 e Q: k+ c) g6 \//6 z( Y' V8 C6 u9 }
// printf("初始值如下:\n");# u# {: [2 q) ~2 m# L( _
// printf("节点号 电压 相角 有功 无功 e f\n"); m# ?" V$ s W& G: @# F/ g5 A
// for(i=0;i<node;i++)! y3 r) d F% I$ X, p
// printf("%d %lf %lf %lf %lf %lf %lf\n", (i+1), v[i], angle[i], p[i], q[i], e[i], f[i]);
: v( | P+ c0 W- a# r' q6 b , m) o& [& B- I n8 d
for(t=0;t<50;t++){( K: V6 t& J5 Z( {
// printf("\n第%d次迭代开始:\n", t);; W. ]1 E/ {6 f3 u1 V
for(i=0;i<node;i++){6 v9 ~! b1 y- O9 Y
if(i==balc) /*如果是平衡节点*/3 P6 k2 J) D8 {/ @: e0 K+ ?3 L
continue;: @9 _! d( F0 D7 I' e
else{ 9 L3 U/ j5 k+ W0 s+ ?5 a! M# o3 I
com1=0.0, com2=0.0;
& O; M# d; V/ ^# Y for(j=0;j<node;j++){
L. q. y4 h- u& I) Y8 M" c" S com1+=g[i][j]*e[j]-b[i][j]*f[j];& C' V- o& x& \
com2+=g[i][j]*f[j]+b[i][j]*e[j];# F3 |: J/ ]6 G) f, t0 X
}$ ~- l: a+ K# v
if(flag1[i]!=1){ /*如果是PQ节点*/
. A7 n% P m# B* \9 f dp[i]=p[i]-e[i]*com1-f[i]*com2;
8 N5 V# R9 w/ C dq[i]=q[i]-f[i]*com1+e[i]*com2;4 o8 d1 Q2 c% d2 m
}2 Z! R! l7 l1 U* z; [( L
else{) o& l& P; L& i' H
dp[i]=p[i]-e[i]*com1-f[i]*com2;. O) x8 }- Y7 E
dvv[i]=v[i]*v[i]-(e[i]*e[i]+f[i]*f[i]);
( ]+ J6 k8 y6 C0 [& {$ \# ] }
V& }- p4 C; V. R }
2 w& f( o" |. r% F5 k; x }+ e6 [3 U; p7 M! v7 y
2 }, M& \1 h' A: w for(i=0,j=0;i<node;i++){ ; v) e: B/ g( V+ p1 E6 r+ \
if(i==balc) continue;
- q* g. }2 ^$ T F5 |4 c2 ~ else if(flag1[i]!=1){, N" j( ]) s( J& z2 j7 G
jcbb[j++]=dp[i];
3 ^2 x$ Z! y( D/ E jcbb[j++]=dq[i];
5 |% q. ~3 u' r C, i6 }// printf("\ndp[%d]=%lf\ndq[%d]=%lf",(i+1),dp[i],(i+1),dq[i]);) y! @3 C7 ^6 E: [! ` j: D
}
" R! I$ }1 w1 [ `, w else{
" z8 I& W5 K+ ?8 O; e7 |, f% ^ jcbb[j++]=dp[i];
" M# f3 z( |* r$ U8 w2 |& L jcbb[j++]=dvv[i];- w- t; v* Y& U1 D
// printf("\ndp[%d]=%lf\ndvv[%d]=%lf",(i+1),dp[i],(i+1),dvv[i]);
2 W7 [" ?, M1 F6 n( e }
b5 I4 r8 v4 j% H" m }
, M o6 m+ v" a) k& S// printf("\n");
3 e' O8 C# K6 w, j5 B' l7 M1 z+ \4 }
0 u( s0 G f j; {. P for(i=0;i<node;i++) {( |/ q. Q! W& d+ l* _
if(fabs(dp[i])>=E||fabs(dq[i])>=E||fabs(dvv[i])>=E)0 ?: t) y; q1 `! G8 U' b c! M
break;
2 H2 I+ J1 t" J1 T3 S }
- Z& L; b% o0 P- ?) b* D if(i>=node)8 F/ N9 v( ~# [! [' L
break;
# N+ F+ [0 v' [9 P; V* X 4 ?( f& B+ N+ x* k V. n* [# ~& `
2 `" {/ u8 R5 S) K: V for(i=0,i1=0;i<node;i++){* l) g, n/ t) D9 z3 _! I: X
if(i==balc)
9 L, `" E) r( Q& a! X H5 _, k5 ~ continue;% a* m2 ?9 K3 n# K1 T) o0 x( v) d- ~5 m8 }
i1++;2 i G" L9 k7 Z! I4 ]3 V/ ]
n=2*i1;8 b5 I- T2 o: B4 A
for(j=0,j1=0;j<node;j++){
6 n% {9 W/ H' f if(j==balc) continue;
& w/ B: b3 J7 n" g+ w' g$ h( O4 Z j1++;8 W p/ E' f, d$ J4 o* ^
m=j1*2;: U, e: s5 G" ?9 H& N
if(i!=j){
0 U; l6 j; t/ S/ c jcb[n-2][m-2]=-(g[i][j]*e[i]+b[i][j]*f[i]);2 l2 _9 \3 j R
jcb[n-2][m-1]=b[i][j]*e[i]-g[i][j]*f[i];2 p$ z! R' w m7 v) H
if(flag1[i]!=1)& V7 Y9 N3 F9 n* R* l4 Q7 f) F3 x8 U
{0 z$ r# O* y5 T
jcb[n-1][m-2]=jcb[n-2][m-1];' l4 _, g" W) u& m- F C6 o% P2 o
jcb[n-1][m-1]=-jcb[n-2][m-2];0 v+ [) C% ]/ _4 z
}
0 o% A. S7 f4 j i else
; `. {) V" |8 W3 G7 G3 G$ ~7 S. `1 t jcb[n-1][m-2]=jcb[n-1][m-1]=0.0;
- F: A0 `. t) p" P8 R2 L/ U }
% {; ^4 h9 Z# X' n$ b' F: o6 ?" ^ else{
$ U: O- z* W2 `3 x V/ L' h com1=0.0, com2=0.0;# r- P$ ?* W* S% m; O7 z
for(k1=0;k1<node;k1++)
% K8 C( o' w4 A' Z; ~ {
# B' {5 y2 e+ u' b com1+=g[i][k1]*e[k1]-b[i][k1]*f[k1];2 A) H! Q! u% Y* G Q
com2+=g[i][k1]*f[k1]+b[i][k1]*e[k1];7 m$ V8 Y- h7 \2 a- L* s
}- v! d% U3 }8 v' D) j0 n& Z
jcb[n-2][m-2]=-com1-g[i][i]*e[i]-b[i][i]*f[i];
! M) `5 r5 n Y: k& |5 r) o jcb[n-2][m-1]=-com2+b[i][i]*e[i]-g[i][i]*f[i]; R5 X1 N; y8 i" j% H
if(flag1[i]!=1)
6 a% q5 H) w# c. Q; H* C {
& h3 a$ k s" m jcb[n-1][m-2]=com2+b[i][i]*e[i]-g[i][i]*f[i];
3 g1 m3 e k u$ \! r" q4 s jcb[n-1][m-1]=-com1+g[i][i]*e[i]+b[i][i]*f[i];
$ ] F7 } _: {( { }
9 g; B N& i1 f- e5 u J else( q/ M. t7 d- c
{
' K" ~- n+ c8 }' z6 m, L2 A: g jcb[n-1][m-2]=-2*e[i];
) b! Y7 q- [0 t, Q jcb[n-1][m-1]=-2*f[i];
" y* E- h* g4 x: m- e3 U9 ]# G }
8 K5 c( R; M6 X* h }+ X" ]0 _7 h6 [3 v
}) W9 ]1 c/ F. k! T: A( |* l9 f: S v, u
}
/ Z, \3 R. L# |
6 f' K. b1 y/ Q* _; f) A// printf("\n第%d次输出-J矩阵如下:\n", t);' n, {, l( h% u& K2 J( w$ b* M
for(i=0;i<2*(node-1);i++){- U% y7 L- f) v4 @
for(j=0;j<2*(node-1);j++){
+ ?, _/ L3 |0 |( f$ `5 o jcb[i][j]*=-1.0;* A1 f7 y! g7 \$ l! l- i k
// printf("%lf ", jcb[i*M+j]); y ]. M5 L. Z4 J6 m* C7 Z. r
}2 q7 {1 |0 D1 e" ~ r. ~: [
// printf("\n\n");
( i- F+ ~4 j4 q# W( f8 Q: y U }
8 X X e7 p: K7 p0 y3 ]+ w / |9 e( C6 _5 t m V
/*算线形方程组*/
2 a# e) T7 H) ^7 n* S; m1 q* e if (agaus(&jcb[0],&jcbb[0],2*(node-1))!=0) {
5 B p, m K; [9 n8 h for (i=0,j=0;i<2*(node-1);i++) {& O/ \& g9 {- ]" m4 J; F# H
if(j==balc) ; }8 @5 l' f, |" R/ U( J! J
j++;# a; q: i. c# y* g, G" G& }
! [/ _: t" _4 t+ }; P4 }& y. V
if(i%2==0){4 c# P+ ~* P8 p1 G; E4 q* L
e[j]+=jcbb[i];% | {# x" W! ?0 B9 Z
// printf("de[%d]=%lf e[%d]=%lf\n", (j+1),jcbb[i],(j+1),e[j]);1 @# e8 X$ a" R( R. |6 |
}9 r+ _1 G& ~. l9 V9 U7 K
else{. Y ~. }# j7 f
f[j]+=jcbb[i];
6 R2 S2 a. n! k% g. Z0 [/ ]// printf("df[%d]=%lf f[%d]=%lf\n",(j+1),jcbb[i],(j+1),f[j]);
. ]* { s" d8 E$ w n- p/ Z% @ j++;
- G* n' N7 r# }; r# C* H }
6 b" `1 E$ _7 i* l) h b/ y }, k. j$ q; i `6 d$ [1 _
}
! h+ h- L. J4 G7 { }
; n0 t* `* }- K8 s2 `6 p" Q
; J) P% d! h% M// printf("共经过了%d次迭代\n", t);- E/ \& K6 E. C* n
& L: U5 C, W& m6 O7 J+ ?
/*求平衡节点P,Q*/
% @. d7 a; R# P# |) } i=balc;
5 c* n# H, P: w* {2 i com1=0.0, com2=0.0;2 L* _) D" F1 R8 S. d; L
for(j=0;j<node;j++){
5 i- h1 b. L5 r: T com1+=g[i][j]*e[j]-b[i][j]*f[j];- j, Z0 Y7 D$ K& y+ b1 O
com2+=g[i][j]*f[j]+b[i][j]*e[j];4 t! G6 ^( F; g6 K3 ]
}
% k: F5 n* @4 Y; P p[i]=e[i]*com1+f[i]*com2;1 H6 |3 q3 ?: d3 u$ q
q[i]=f[i]*com1-e[i]*com2;
0 z# P0 d: v. s) B' T' o7 U9 H
/ {6 A( f3 a5 Z$ e2 n* e /*求其他各节点P,Q*/+ G* |! _7 |0 q
for(i=0;i<node;i++){
# _6 d/ R L( E; ]) ]$ J" C if(i==balc) continue;/ b* g7 j. J; l( h6 |9 S
else
, b7 B5 r, I! @6 V {* K, m! [, W" X# K
com1=0.0, com2=0.0;- w& {: S4 d/ d d) M% c, ~
for(j=0;j<node;j++)! i: B$ q }& |' I8 e" {, D
{1 C5 G2 S/ |/ D% F8 u g
com1+=g[i][j]*e[j]-b[i][j]*f[j];
$ V6 c, ?/ w( j com2+=g[i][j]*f[j]+b[i][j]*e[j];# D$ C- A6 U6 ^0 A% A6 Z3 Q e5 D
}% W5 v5 Z) {& m6 B8 {
p[i]=e[i]*com1+f[i]*com2;" j3 `. s* B/ {1 b. K! t
q[i]=f[i]*com1-e[i]*com2;6 |, W: X4 c4 L7 G8 x* B# ]" H
}' G3 j5 N8 l* {4 C
}: Q* @" B% O' w7 \' \
8 ]" f9 K& W7 c/ j
// printf("最终结果为:\n");
" K2 y5 v1 ^1 R) ^// printf("节点号 电压 相角 有功 无功 e f\n");
# ~$ H6 Q- Y `1 W3 `; n for(i=0;i<node;i++)
2 V6 s- h% Q+ q! t {1 U" Q$ O( s$ |8 x
v[i]=sqrt(e[i]*e[i]+f[i]*f[i]);
% G: s! Y, ~: B3 _ angle[i]=atan(f[i]/e[i])*180/PI;
) u4 |4 C9 a8 j) B0 {5 K2 Q1 [ sump+=p[i];( l2 r# _) \& c/ E
sumq+=q[i];
9 g- h3 d! R! z6 H) _( Y# G% h// printf("%d %lf %lf %lf %lf %lf %lf\n", (i+1), v[i], angle[i], p[i], q[i], e[i], f[i]);
; t3 N/ g& b+ ?0 B6 G7 r } |
|