牛拉法计算C程序.docx
- 文档编号:7789932
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:14
- 大小:16.31KB
牛拉法计算C程序.docx
《牛拉法计算C程序.docx》由会员分享,可在线阅读,更多相关《牛拉法计算C程序.docx(14页珍藏版)》请在冰豆网上搜索。
牛拉法计算C程序
#include<>
#include<>
#include<>
#definePI
structNodeType
{
intN;
intType;
doublee;
doublef;
doublePd;
doubleQd;
doublePs;
doubleQs;
doubleBc;
};
structBranchType
{
intNbr;
intNl;
intNr;
doubleR;
doubleX;
doubleBn;
doubleKt;
};
intn;
intnPQ;
intnPV;
intnPH;
intnbr;
intng;
intMark=0;
double**G;
double**B;
double*dS;
double*mid1,*mid2;
double*Us;
doubleerror=1;
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();
DeltaS();
kk++;
}
printf("µü´ú´ÎÊýΪ%4d\n",kk);
CalculatePQ();
printf("Îó²îÖµerror=%e\n",error);
printf("\n");
printf("\n");
printf("{×¢:
\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]={""};
printf("ÇëÊäÈëÊý¾ÝÎļþÃû(Ìáʾ£ºÊý¾ÝËùÔÚTXTÎļþ)£º");
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("cannotopenthefile:
\n");
return;
}
fscanf(fp,"%d",&n);
printf("½Úµã¸öÊýΪ£º%d\n",n);
Node=(structNodeType*)malloc(sizeof(structNodeType)*n);
printf("µ÷ÕûÇ°µÄ½Úµã²ÎÊýΪ£º\n");
for(i=0;i fscanf(fp,"%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); for(i=0;i { if(Node[i].Type==1) nPQ++; elseif(Node[i].Type==2) nPV++; elseif(Node[i].Type==3) nPH++; } printf("PQ½Úµã¸öÊý£º%d\n",nPQ); printf("PV½Úµã¸öÊý£º%d\n",nPV); printf("ƽºâ½Úµã¸öÊý£º%d\n",nPH); for(j=0;j for(i=0;i { 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)); for(i=0;i Us[i]=Node[i].e; fscanf(fp,"%d",&nbr); printf("֧·¸öÊýΪ£º%d\n",nbr); Branch=(structBranchType*)malloc(sizeof(structBranchType)*nbr); for(i=0;i fscanf(fp,"%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); for(i=0;i { Mark=0; for(j=0;j { if(Branch[i].Nl==Node[j].N&&Mark==0) { Branch[i].Nl=j+1; Mark=1; } } } for(i=0;i { Mark=0; for(j=0;j { if(Branch[i].Nr==Node[j].N&&Mark==0) { Branch[i].Nr=j+1; Mark=1; } } } fclose(fp); } voidFormY() { inti,j; doubleZ2; G=(double**)malloc(sizeof(double*)*n); B=(double**)malloc(sizeof(double*)*n); for(i=0;i { G[i]=(double*)malloc(sizeof(double)*n); B[i]=(double*)malloc(sizeof(double)*n); } for(i=0;i for(j=0;j { G[i][j]=0; B[i][j]=0; } for(i=0;i { 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; 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]; } } for(i=0;i for(j=0;j { 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&&(Branch[j].Nl-1==i||Branch[j].Nr-1==i)) { 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; } } for(i=0;i { if(Branch[i].Kt==0) { B[Branch[i].Nl-1][Branch[i].Nl-1]+=Branch[i].Bn; B[Branch[i].Nr-1][Branch[i].Nr-1]+=Branch[i].Bn; } else { 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; } } for(i=0;i B[i][i]=B[i][i]+Node[i].Bc; } voidDeltaS() { inti,j; mid1=(double*)malloc(sizeof(double)*n); mid2=(double*)malloc(sizeof(double)*n); dS=(double*)malloc(sizeof(double)*2*(n-1)); for(i=0;i { mid1[i]=0; mid2[i]=0; for(j=0;j { 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 dS[2*i+1]=Node[i].Qs-Node[i].Qd-(Node[i].f*mid1[i]-Node[i].e*mid2[i]); else dS[2*i+1]=Us[i]*Us[i]-(Node[i].e*Node[i].e+Node[i].f*Node[i].f); } error=0; for(i=0;i<2*(n-1);i++) { if(dS[i]<0&&error<-dS[i]) error=-dS[i]; elseif(dS[i]>0&&error error=dS[i]; } } voidFormJacob() { inti,j; Jacob=(double**)malloc(sizeof(double*)*2*(n-1)); for(i=0;i<2*(n-1);i++) Jacob[i]=(double*)malloc(sizeof(double)*2*(n-1)); for(i=0;i<2*(n-1);i++) for(j=0;j<2*(n-1);j++) Jacob[i][j]=0; for(j=0;j { for(i=0;i { 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; } else { 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]; } } for(i=0;i { if(i! =j) { 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; } else { 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;i { 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)); for(i=0;i<2*(n-1);i++) invJac[i]=(double*)malloc(sizeof(double)*2*(n-1)); for(i=0;i<2*(n-1);i++) for(j=0;j<2*(n-1);j++) { if(i! =j) invJac[i][j]=0; else invJac[i][j]=1; } for(i=0;i<2*(n-1);i++) { for(j=0;j<2*(n-1);j++) { if(i! =j) { temp=Jacob[j][i]/Jacob[i][i]; for(k=0;k<2*(n-1);k++) { Jacob[j][k]-=Jacob[i][k]*temp; invJac[j][k]-=invJac[i][k]*temp; } } } } for(i=0;i<2*(n-1);i++) if(Jacob[i][i]! =1) { temp=Jacob[i][i]; for(j=0;j<2*(n-1);j++) invJac[i][j]=invJac[i][j]/temp; } } voidUpdateU() { voidInvJac(); inti,j; dfe=(double*)malloc(sizeof(double)2*(n-1)); InvJac(); for(i=0;i<2*(n-1);i++) { dfe[i]=0; for(j=0;j<2*(n-1);j++) dfe[i]-=invJac[i][j]*dS[j]; } for(i=0;i { Node[i].e+=dfe[2*i+1]; Node[i].f+=dfe[2*i]; } } voidCalculatePQ() { inti,j; inttN,tType; doublete,tf,tPd,tQd,tPs,tQs,tBc; mid1[n-1]=0; mid2[n-1]=0; for(j=0;j { 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]; for(i=nPQ;i Node[i].Qs=Node[i].f*mid1[i]-Node[i].e*mid2[i]; for(j=0;j for(i=0;i { if(Node[i].N>Node[i+1].N) { 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; } } for(i=0;i { 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; } printf("×îÖÕ½á¹ûΪ£º\n"); printf("NTpAmpDltaPdQdPsQsBc\n"); for(i=0;i printf("%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); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 牛拉法 计算 程序