#include \"NEquation.h\" #include \"math.h\" #include \"config.h\"void test() { }
void GetData()//Read the data { FILE *fp;
int i;
if((fp=fopen(\"F:\\\\1061180523\\\\flow\\\\data\\\\data.txt\
fscanf(fp,\"%d,%f,%f,%f,%f,%f,%f,%d\oltage,&gBus[i].Phase, }
&gBus[i].GenP,&gBus[i].GenQ,&gBus[i].LoadP,&gBus[i].LoadQ,&gBus[i].Type);
for(i=0;i<=Bus_Num-1;i++) {
{ printf(\"Can not open the file named 'data.txt' \\n\"); }
return; NEquation ob1;
ob1.SetSize(2); ob1.Data(0,0)=1; ob1.Data(0,1)=2; ob1.Data(1,0)=2; ob1.Data(1,1)=1; ob1.Value(1)=4; ob1.Run();
printf(\"x1=%f\\n\alue(0)); printf(\"x2=%f\\n\alue(1));
ob1.Value(0)=5;
}
for(i=0;i<=Line_Num-1;i++) { }
fscanf(fp,\"%d,%d,%d,%f,%f,%f,%f\ &gLine[i].R,&gLine[i].X,&gLine[i].B,&gLine[i].k);
fclose(fp);
void GetYMatrix() {
int i,j; FILE *fp;
// calculate the Y matrix int bus1,bus2;
float r,x,d,g,b;
for(i=0;i<=Bus_Num-1;i++) //导纳矩阵赋初值为零
{ }
for(j=0;j<=Bus_Num-1;j++)
{ }
gY_G[i][j]=0; gY_B[i][j]=0;
for(i=0; i<=Line_Num-1; i++) {
bus1=gLine[i].No_I-1; //线路一侧连接的节点号减1 bus2=gLine[i].No_J-1; //线路另一侧连接的节点号减1 r=gLine[i].R; x=gLine[i].X; d=r*r+x*x; g=r/d;
b=-x/d;
if(gLine[i].k==0) //没有变压器的情况 {
gY_G[bus1][bus1]=gY_G[bus1][bus1]+g;
gY_G[bus2][bus2]=gY_G[bus2][bus2]+g;
//gY_G[bus1][bus1]=g
//gY_G[bus2][bus2]=g gY_G[bus1][bus2]=gY_G[bus1][bus2]-g; //gY_G[bus1][bus2]=-g 矩阵是对称的
gY_G[bus2][bus1]=gY_G[bus2][bus1]-g;
//gY_G[bus2][bus1]=-g gY_B[bus1][bus1]=gY_B[bus1][bus1]+b+gLine[i].B; //gY_B[bus1][bus1]=b+gLine[i].B gY_B[bus2][bus2]=gY_B[bus2][bus2]+b+gLine[i].B; //gY_B[bus2][bus2]=b+gLine[i].B
gY_B[bus1][bus2]=gY_B[bus1][bus2]-b;
//gY_B[bus1][bus2]=-b gY_B[bus2][bus1]=gY_B[bus2][bus1]-b; //gY_B[bus2][bus1]=-b
}
else //有变压器的情况 {
gY_G[bus1][bus1]=gY_G[bus1][bus1]+g/gLine[i].k+g*(1-gLine[i].k)/gLine[i].k/gLine[i].k;
// output the Y matrix
if((fp=fopen(\"F:\\\\1061180523\\\\flow\\\\data\\\\ymatrix.txt\ { }
fprintf(fp,\"---Y Matrix---\\n\");
for(i=0;i<=Bus_Num-1;i++) {
for(j=0;j<=Bus_Num-1;j++) {
printf(\"Can not open the file named 'ymatrix.txt' \\n\"); return ;
gY_B[bus1][bus1]=gY_B[bus1][bus1]+b/gLine[i].k+b*(1-gLine[i].k)/gLine[i].k/gLine[i].k; }
}
gY_B[bus2][bus2]=gY_B[bus2][bus2]+b/gLine[i].k+b*(gLine[i].k-1)/gLine[i].k; gY_B[bus1][bus2]=gY_B[bus1][bus2]-b/gLine[i].k; gY_B[bus2][bus1]=gY_B[bus2][bus1]-b/gLine[i].k;
gY_G[bus2][bus2]=gY_G[bus2][bus2]+g/gLine[i].k+g*(gLine[i].k-1)/gLine[i].k; gY_G[bus1][bus2]=gY_G[bus1][bus2]-g/gLine[i].k; gY_G[bus2][bus1]=gY_G[bus2][bus1]-g/gLine[i].k;
}
}
}
fprintf(fp,\"Y(%d,%d)=(%10.5f,%10.5f)\\n\
fclose(fp);
void SetInitial() { }
void GetUnbalance() { int i,j;
FILE *fp;
for(i=0;i<=Bus_Num-2;i++) {
gDelta_P[i]=gBus[i+1].GenP-gBus[i+1].LoadP;
if(gBus[i+1].Type==2) //PV节点
else gDelta_Q[i]=gBus[i+1].GenQ-gBus[i+1].LoadQ; for(j=0;j<=Bus_Num-1;j++) { int i;
for(i=0;i<=Bus_Num-1;i++) { }
if(gBus[i].Type==3) { } { }
gf[i]=0; ge[i]=1;
gf[i]=gBus[i].Voltage*sin(gBus[i].Phase); ge[i]=gBus[i].Voltage*cos(gBus[i].Phase);
else
gDelta_Q[i]=gBus[i+1].Voltage*gBus[i+1].Voltage-(ge[i+1]*ge[i+1]+gf[i+1]*gf[i+1]);
gDelta_P[i]=gDelta_P[i]-ge[i+1]*(gY_G[i+1][j]*ge[j]-gY_B[i+1][j]*gf[j])-gf[i+1]*(gY_G[i+1][j]*gf[j]+gY_B[i+1][j]*ge[j]);
if(gBus[i+1].Type==1) //PQ节点
gDelta_Q[i]=gDelta_Q[i]-gf[i+1]*(gY_G[i+1][j]*ge[j]-gY_B[i+1][j]*gf[j])+ge[i+1]*(gY_G[i+1][j]*gf[j]+gY_B[i+1][j]*ge[j]); } }
void GetJaccobi() { int i,j;
float ga[Bus_Num-1],gb[Bus_Num-1]; FILE *fp;
for(i=0;i<=Bus_Num-2;i++) //计算注入电流 {
ga[i]=0; gb[i]=0;
for(j=0;j<=Bus_Num-1;j++) { }
ga[i]=ga[i]+gY_G[i+1][j]*ge[j]-gY_B[i+1][j]*gf[j]; gb[i]=gb[i]+gY_G[i+1][j]*gf[j]+gY_B[i+1][j]*ge[j];
}
for(i=0;i<=Bus_Num-2;i++) //合并 {
gDelta_PQ[2*i]=gDelta_P[i]; gDelta_PQ[2*i+1]=gDelta_Q[i];
}
if((fp=fopen(\"F:\\\\1061180523\\\\flow\\\\data\\\ance.txt\{ }
printf(\"Can not open the file named 'unbalance.txt' \\n\"); return ;
fprintf(fp,\"---Unbalance---\\n\"); for(i=0;i<=2*Bus_Num-3;i++) {
fprintf(fp,\"Unbalance[%d]=%10.5f\\n\ }
fclose(fp);
}
for(i=0;i<=Bus_Num-2;i++) {
for(j=0;j<=Bus_Num-2;j++) {
if(i!=j) { gJaccobi[2*i][2*j]=-gY_B[i+1][j+1]*ge[i+1]+gY_G[i+1][j+1]*gf[i+1];
gJaccobi[2*i][2*j+1]=gY_G[i+1][j+1]*ge[i+1]+gY_B[i+1][j+1]*gf[i+1]; if(gBus[i+1].Type==2) //PV节点 {
gJaccobi[2*i+1][2*j]=0; gJaccobi[2*i+1][2*j+1]=0;
}
else //PQ { }
gJaccobi[2*i+1][2*j]=-gJaccobi[2*i][2*j+1]; gJaccobi[2*i+1][2*j+1]=gJaccobi[2*i][2*j];
}
else {
gJaccobi[2*i][2*j]=-gY_B[i+1][j+1]*ge[i+1]+gY_G[i+1][j+1]*gf[i+1]+gb[i];
gJaccobi[2*i][2*j+1]=gY_G[i+1][j+1]*ge[i+1]+gY_B[i+1][j+1]*gf[i+1]+ga[i]; if(gBus[i+1].Type==2) //PV节点
{ }
gJaccobi[2*i+1][2*j]=2*gf[i+1]; gJaccobi[2*i+1][2*j+1]=2*ge[i+1];
else //PQ {
gJaccobi[2*i+1][2*j]=-gY_G[i+1][j+1]*ge[i+1]-gY_B[i+1][j+1]*gf[i+1]+ga[i]; gJaccobi[2*i+1][2*j+1]=-gY_B[i+1][j+1]*ge[i+1]+gY_G[i+1][j+1]*gf[i+1]-gb[i]; } }
if((fp=fopen(\"F:\\\\1061180523\\\\flow\\\\data\\\\jaccobi.txt\ {
printf(\"Can not open the file named 'jaccobi.txt' \\n\"); return ; }
}
}
fprintf(fp,\"---Jaccobi Matrix---\\n\"); for(i=0;i<=2*Bus_Num-3;i++)
}
{ } fclose(fp);
for(j=0;j<=2*Bus_Num-3;j++) { fprintf(fp,\"jaccobi(%d,%d)=%10.5f\\n\}
void GetRevised() {
int i,j;
FILE *fp;
NEquation ob1; //解矩阵方程 ob1.SetSize(2*(Bus_Num-1)); for(i=0;i<=2*Bus_Num-3;i++) for(j=0;j<=2*Bus_Num-3;j++) ob1.Data(i,j)=gJaccobi[i][j]; for(i=0;i<=2*Bus_Num-3;i++)
ob1.Value(i)=gDelta_PQ[i]; ob1.Run();
for(i=0;i<=Bus_Num-2;i++) { gDelta_f[i]=ob1.Value(2*i); gDelta_e[i]=ob1.Value(2*i+1);
gDelta_fe[2*i]=gDelta_f[i]; gDelta_fe[2*i+1]=gDelta_e[i];
}
if((fp=fopen(\"F:\\\\1061180523\\\\flow\\\\data\\\\revised.txt\ { }
fprintf(fp,\"---Revised---\\n\"); for(i=0;i<=2*Bus_Num-3;i++) { } fclose(fp);
fprintf(fp,\"revised[%d]=%10.5f\\n\
printf(\"Can not open the file named 'revised.txt' \\n\"); return ;
}
void GetNewValue()
{ }
int main(int argc, char* argv[]) { int i,Count_Num;
float maxValue;
int i;
FILE *fp;
for(i=0;i<=Bus_Num-2;i++) {
gf[i+1]=gf[i+1]+gDelta_f[i]; ge[i+1]=ge[i+1]+gDelta_e[i];
}
if((fp=fopen(\"F:\\\\1061180523\\\\flow\\\\data\\\\newvalue.txt\{ }
fprintf(fp,\"---New Value---\\n\");
for(i=0;i<=Bus_Num-2;i++) { }
fprintf(fp,\"f(%d)=%10.5f,e(%d)=%10.5f\\n\
printf(\"Can not open the file named 'newvalue.txt' \\n\"); return ;
fclose(fp);
test(); GetData(); GetYMatrix();
SetInitial();
for(Count_Num=0;Count_Num<=100;Count_Num++) {
GetUnbalance(); GetJaccobi(); GetRevised(); GetNewValue();
maxValue=fabs(gDelta_fe[0]); for(i=1;i<=2*(Bus_Num-1)-1;i++) {
if(maxValue}}
maxValue=fabs(gDelta_fe[i]);
}
}
if(maxValuebreak;printf(\"%d\\n\for(i=0;i<=Bus_Num-1;i++) { }
printf(\"%10.5f\\n\
return 0;