牛拉法计算C程序Word格式文档下载.docx
《牛拉法计算C程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《牛拉法计算C程序Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
doubleiteration=;
double**Jacob;
double**invJac;
double*dfe;
structNodeType*Node;
structBranchType*Branch;
voidmain()
voidLoadData();
voidFormY();
voidDeltaS();
voidFormJacob();
voidInvJac();
voidUpdateU();
voidCalculatePQ();
intkk;
LoadData();
FormY();
printf("
Î
ó
²
î
¾
«
¶
È
iteration=%lf\n"
iteration);
kk=0;
DeltaS();
while(error>
iteration&
&
kk<
50)
FormJacob();
UpdateU();
kk++;
}
µ
ü
´
ú
Ê
ý
ª
%4d\n"
kk);
CalculatePQ();
Ö
error=%e\n"
error);
\n"
);
{×
¢
:
\nNÎ
½
Ú
ã
º
Å
£
¬
TpÎ
À
à
Ð
Í
¨
Æ
ä
1Î
PQ½
2Î
PV½
3Î
â
©
\nAmpÎ
ç
Ñ
¹
¡
DltaÎ
Ï
»
Ç
PdÎ
³
ö
Ä
Ó
¦
Â
QdÎ
Þ
\nPsÎ
·
QsÎ
BcÎ
Á
Ý
¿
}\n"
voidLoadData()
inti,j;
inttN,tType;
doublete,tf,tPd,tQd,tPs,tQs,tBc;
FILE*fp;
charfilename[50]={"
"
ë
¼
þ
Ã
û
(Ì
á
Ë
ù
Ô
TXTÎ
)£
"
scanf("
%s"
filename);
if((fp=fopen(filename,"
r"
))==NULL)
cannotopenthefile:
return;
fscanf(fp,"
%d"
&
n);
¸
%d\n"
n);
Node=(structNodeType*)malloc(sizeof(structNodeType)*n);
÷
Õ
°
for(i=0;
i<
n;
i++)
%d%d%lf%lf%lf%lf%lf%lf%lf"
Node[i].N,&
Node[i].Type,&
Node[i].e,&
Node[i].f,&
Node[i].Pd,&
Node[i].Qd,&
Node[i].Ps,&
Node[i].Qs,&
Node[i].Bc);
if(Node[i].Type==1)
nPQ++;
elseif(Node[i].Type==2)
nPV++;
elseif(Node[i].Type==3)
nPH++;
nPQ);
nPV);
nPH);
for(j=0;
j<
n-1;
j++)
n-j-1;
if(Node[i].Type>
Node[i+1].Type)
tN=Node[i].N;
Node[i].N=Node[i+1].N;
Node[i+1].N=tN;
tType=Node[i].Type;
Node[i].Type=Node[i+1].Type;
Node[i+1].Type=tType;
te=Node[i].e;
Node[i].e=Node[i+1].e;
Node[i+1].e=te;
tf=Node[i].f;
Node[i].f=Node[i+1].f;
Node[i+1].f=tf;
tPd=Node[i].Pd;
Node[i].Pd=Node[i+1].Pd;
Node[i+1].Pd=tPd;
tQd=Node[i].Qd;
Node[i].Qd=Node[i+1].Qd;
Node[i+1].Qd=tQd;
tPs=Node[i].Ps;
Node[i].Ps=Node[i+1].Ps,Node[i+1].Ps=tPs;
tQs=Node[i].Qs;
Node[i].Qs=Node[i+1].Qs;
Node[i+1].Qs=tQs;
tBc=Node[i].Bc;
Node[i].Bc=Node[i+1].Bc;
Node[i+1].Bc=tBc;
Us=(double*)malloc(sizeof(double)*(n-1));
Us[i]=Node[i].e;
nbr);
§
nbr);
Branch=(structBranchType*)malloc(sizeof(structBranchType)*nbr);
nbr;
%d%d%d%lf%lf%lf%lf"
Branch[i].Nbr,&
Branch[i].Nl,&
Branch[i].Nr,&
Branch[i].R,&
Branch[i].X,&
Branch[i].Bn,&
Branch[i].Kt);
Mark=0;
if(Branch[i].Nl==Node[j].N&
Mark==0)
Branch[i].Nl=j+1;
Mark=1;
if(Branch[i].Nr==Node[j].N&
Branch[i].Nr=j+1;
fclose(fp);
voidFormY()
doubleZ2;
G=(double**)malloc(sizeof(double*)*n);
B=(double**)malloc(sizeof(double*)*n);
G[i]=(double*)malloc(sizeof(double)*n);
B[i]=(double*)malloc(sizeof(double)*n);
G[i][j]=0;
B[i][j]=0;
Z2=Branch[i].R*Branch[i].R+Branch[i].X*Branch[i].X;
if(Branch[i].Kt==0)
G[Branch[i].Nl-1][Branch[i].Nr-1]-=Branch[i].R/Z2;
B[Branch[i].Nl-1][Branch[i].Nr-1]+=Branch[i].X/Z2;
G[Branch[i].Nr-1][Branch[i].Nl-1]=G[Branch[i].Nl-1][Branch[i].Nr-1];
B[Branch[i].Nr-1][Branch[i].Nl-1]=B[Branch[i].Nl-1][Branch[i].Nr-1];
else
G[Branch[i].Nl-1][Branch[i].Nr-1]-=Branch[i].R/Z2/Branch[i].Kt;
B[Branch[i].Nl-1][Branch[i].Nr-1]+=Branch[i].X/Z2/Branch[i].Kt;
Z2=Branch[j].R*Branch[j].R+Branch[j].X*Branch[j].X;
if(Branch[j].Kt==0&
(Branch[j].Nl-1==i||Branch[j].Nr-1==i))
G[i][i]=G[i][i]+Branch[j].R/Z2;
B[i][i]=B[i][i]-Branch[j].X/Z2;
elseif(Branch[j].Kt!
=0&
G[i][i]=G[i][i]+Branch[j].R/Z2/Branch[j].Kt;
B[i][i]=B[i][i]-Branch[j].X/Z2/Branch[j].Kt;
B[Branch[i].Nl-1][Branch[i].Nl-1]+=Branch[i].Bn;
B[Branch[i].Nr-1][Branch[i].Nr-1]+=Branch[i].Bn;
B[Branch[i].Nl-1][Branch[i].Nl-1]-=(1-Branch[i].Kt)/Branch[i].Kt/Branch[i].Kt/Branch[i].X;
B[Branch[i].Nr-1][Branch[i].Nr-1]-=(Branch[i].Kt-1)/Branch[i].Kt/Branch[i].X;
B[i][i]=B[i][i]+Node[i].Bc;
voidDeltaS()
mid1=(double*)malloc(sizeof(double)*n);
mid2=(double*)malloc(sizeof(double)*n);
dS=(double*)malloc(sizeof(double)*2*(n-1));
mid1[i]=0;
mid2[i]=0;
mid1[i]=mid1[i]+G[i][j]*Node[j].e-B[i][j]*Node[j].f;
mid2[i]=mid2[i]+G[i][j]*Node[j].f+B[i][j]*Node[j].e;
dS[2*i]=Node[i].Ps-Node[i].Pd-(Node[i].e*mid1[i]+Node[i].f*mid2[i]);
if(i<
nPQ)
dS[2*i+1]=Node[i].Qs-Node[i].Qd-(Node[i].f*mid1[i]-Node[i].e*mid2[i]);
dS[2*i+1]=Us[i]*Us[i]-(Node[i].e*Node[i].e+Node[i].f*Node[i].f);
error=0;
2*(n-1);
if(dS[i]<
0&
error<
-dS[i])
error=-dS[i];
elseif(dS[i]>
dS[i])
error=dS[i];
voidFormJacob()
Jacob=(double**)malloc(sizeof(double*)*2*(n-1));
Jacob[i]=(double*)malloc(sizeof(double)*2*(n-1));
Jacob[i][j]=0;
if(i!
=j)
Jacob[2*i][2*j]=B[i][j]*Node[i].e-G[i][j]*Node[i].f;
Jacob[2*i][2*j+1]=-G[i][j]*Node[i].e-B[i][j]*Node[i].f;
Jacob[2*i][2*i]=B[i][i]*Node[i].e-G[i][i]*Node[i].f-mid2[i];
Jacob[2*i][2*i+1]=-G[i][i]*Node[i].e-B[i][i]*Node[i].f-mid1[i];
nPQ;
Jacob[2*i+1][2*j]=G[i][j]*Node[i].e+B[i][j]*Node[i].f;
Jacob[2*i+1][2*j+1]=B[i][j]*Node[i].e-G[i][j]*Node[i].f;
Jacob[2*i+1][2*i]=G[i][i]*Node[i].e+B[i][i]*Node[i].f-mid1[i];
Jacob[2*i+1][2*i+1]=B[i][i]*Node[i].e-G[i][i]*Node[i].f+mid2[i];
for(i=nPQ;
if(i==j)
Jacob[2*i+1][2*i]=-2*Node[i].f;
Jacob[2*i+1][2*i+1]=-2*Node[i].e;
voidInvJac()
inti,j,k;
doubletemp;
invJac=(double**)malloc(sizeof(double*)*2*(n-1));
invJac[i]=(double*)malloc(sizeof(double)*2*(n-1));
invJac[i][j]=0;
invJac[i][j]=1;
temp=Jacob[j][i]/Jacob[i][i];
for(k=0;
k<
k++)
Jacob[j][k]-=Jacob[i][k]*temp;
invJac[j][k]-=invJac[i][k]*temp;
if(Jacob[i][i]!
=1)
temp=Jacob[i][i];
invJac[i][j]=invJac[i][j]/temp;
voidUpdateU()
dfe=(double*)malloc(sizeof(double)2*(n-1));
InvJac();
dfe[i]=0;
dfe[i]-=invJac[i][j]*dS[j];
Node[i].e+=dfe[2*i+1];
Node[i].f+=dfe[2*i];
voidCalculatePQ()
mid1[n-1]=0;
mid2[n-1]=0;
mid1[n-1]=mid1[n-1]+G[n-1][j]*Node[j].e-B[n-1][j]*Node[j].f;
mid2[n-1]=mid2[n-1]+G[n-1][j]*Node[j].f+B[n-1][j]*Node[j].e;
Node[n-1].Ps=Node[n-1].e*mid1[n-1];
Node[n-1].Qs=-Node[n-1].e*mid2[n-1];
Node[i].Qs=Node[i].f*mid1[i]-Node[i].e*mid2[i];
if(Node[i].N>
Node[i+1].N)
te=sqrt(Node[i].e*Node[i].e+Node[i].f*Node[i].f);
tf=atan(Node[i].f/Node[i].e)*180/PI;
Node[i].e=te;
Node[i].f=tf;
×
NTpAmpDltaPdQdPsQsBc\n"
%4d%4d%%%%%%%\n"
Node[i].N,Node[i].Type,Node[i].e,Node[i].f,Node[i].Pd,Node[i].Qd,Node[i].Ps,Node[i].Qs,Node[i].Bc);