📄 end1000.c.txt
字号:
/** */
/*******************************形成不计接地电容,计入支路电阻的有功导纳阵*********************************/
for(i=1;i<=N;i++)
{
Yii[i].G=0; /*初始化清零*/
Yii[i].B=0;
NYsum1[i]=0;
}
for(n=1;n<=Nb;n++)
{
i=abs(Branch[n].i);
j=abs(Branch[n].j);
R=Branch[n].R;
X=Branch[n].X;
YK=Branch[n].YK;
Zmag2=R*R+X*X;
Gij=R/Zmag2;
Bij=-X/Zmag2; /*由阻抗计算导纳*/
/***************互导纳**************/
if(Branch[n].i<0||Branch[n].j<0)/*判断是否为变压器支路*/
{
Yij[n].G=-Gij/YK;
Yij[n].B=-Bij/YK;
}
else
{
Yij[n].G=-Gij;
Yij[n].B=-Bij;
}
Yij[n].j=j;
/**************************自导纳******************************/
if(Branch[n].i<0||Branch[n].j<0)/*再次判断是否为变压器支路*/
{
Yii[i].G=Yii[i].G+Gij/YK;
Yii[i].B=Yii[i].B+Bij/YK;
Yii[j].G=Yii[j].G+Gij/YK;
Yii[j].B=Yii[j].B+Bij/YK; /*形成B'时用*/
}
else
{
Yii[i].G=Yii[i].G+Gij;
Yii[i].B=Yii[i].B+Bij;
Yii[j].G=Yii[j].G+Gij;
Yii[j].B=Yii[j].B+Bij; /*形成B'时用*/
}
NYsum1[i]++;
}/*for的括号*/
NYseq1[1]=1;
for(i=1;i<=N-1;i++)
NYseq1[i+1]=NYseq1[i]+NYsum1[i];
/********************************形成因子表1*****************************
***一定用f4中未追加接地支路时的Yii,Yij数组的值,抛掉了与有功无关的接地***
***支路,要及时形成!
***追加接地支路的最完整的导纳阵暂时用不上,在求功率误差时才用到**********/
for(i=1;i<=N-1;i++)
{
for(count=i+1;count<=N-1;count++)
B[count]=0;
B[i]=Yii[i].B; /*A框*/
for(count=NYseq1[i];count<=NYseq1[i+1]-1;count++)
{
j=Yij[count].j;
B[j]=Yij[count].B;/*B框*/ /*从有功导纳阵中取数*/
}
n_u=1; /*D框*/
i_above=1;
for(i_above=1;i_above<=i-1;i_above++)
{
for(count=1;count<=NUsum1[i_above];count++)
{
if(U1[n_u].j!=i) /*没初始化就用了U1,可能会有问题!!*/
n_u++;
else goto next1;
}/*for's*/
goto next2;
next1:Btempt=U1[n_u].value/D1[i_above];
for(;count<=NUsum1[i_above];count++)/*count初值必须继承上面的,而不是1!*/
{
j=U1[n_u].j;
B[j]=B[j]-Btempt*U1[n_u].value;
n_u++;
}
goto next2;
next2:; /*一条空语句!!!*/
}/*for's*/
Btempt=1.0/B[i];
D1[i]=Btempt;
count=0;
for(j=i+1;j<=N-1;j++)
{
if(B[j]!=0)
{
U1[n_u].value=B[j]*Btempt;
U1[n_u].j=j;
count++;
n_u++;
}
}
NUsum1[i]=count;
}/*for's*/
/**************************************fb1结束****************************************/
/************************追加接地支路形成完整节点导纳阵开始***************************/
/***************************追加接地支路,只影响自导纳***************************/
for(n=1;n<=Nb;n++)
{
i=Branch[n].i;
j=Branch[n].j;
YK=Branch[n].YK; /*赋循环初值*/
if(i<0||j<0) /*判断有无变压器支路*/
{
if(i<0)
{
i=abs(i); /*书上印错!!!*/
Gij=Yij[n].G;
Bij=Yij[n].B; /*B'*/
/*i节点侧*/
Yii[i].G=Yii[i].G+(1.0-1.0/YK)*Gij;
Yii[i].B=Yii[i].B+(1.0-1.0/YK)*Bij; /*B'*/
/*j节点侧*/
Yii[j].G=Yii[j].G+(1.0-YK)*Gij;
Yii[j].B=Yii[j].B+(1.0-YK)*Bij; /*B'*/
}/*if i<0*/
else
{
j=abs(j);
Gij=Yij[n].G;
Bij=Yij[n].B; /*B'*/
/*j节点侧*/
Yii[j].G=Yii[j].G+(1.0-1.0/YK)*Gij;
Yii[j].B=Yii[j].B+(1.0-1.0/YK)*Bij; /*B'*/
/*i节点侧*/
Yii[i].G=Yii[i].G+(1.0-YK)*Gij;
Yii[i].B=Yii[i].B+(1.0-YK)*Bij; /*B'*/
}/*else i<0*/
}/*if i<0,j<0*/
else /*无变压器支路*/
{
Bij=YK;
/*假设为集中参数电路,导纳均分给i,j两节点*/
Yii[i].B=Yii[i].B+Bij;
Yii[j].B=Yii[j].B+Bij; /*B';i,j上分别加*/
} /*else 无变压器*/
}/*for的*/
/************************追加接地支路形成完整节点导纳阵结束***************************/
/***************************************f13开始******************************************/
/** *****/
/** 给节点电压赋初值 *****/
/** *****/
for(i=1;i<=N-1;i++)
{
NodeVoltage[i].V=V0;
NodeVoltage[i].theta=0.0;
}
for(n=1;n<=Npv;n++)
{
i=PVNode[n].i;
NodeVoltage[i].V=PVNode[n].V;
}
NodeVoltage[N].V=V_Slack;
/***************************************f13结束******************************************/
/*******************************************************主循环开始******************************************************/
timer=0;
flag=1;
do
{
/*****************************************f12开始*****************************************/
/** 求各节点功率 ***/
/** ***/
for(i=1;i<=N;i++)
NodePower[i][flag]=0.0;/*初始化,P Q 全部清0*/
for(i=1;i<=N;i++)
{
Vi=NodeVoltage[i].V;
/*对角元素的影响*/
if(flag==1)
A=Yii[i].G; /*p中 V平方*G,从完整导纳阵中取数*/
else
A=-Yii[i].B ; /*q中-V平方*B*/
NodePower[i][flag]=NodePower[i][flag]+Vi*Vi*A;
if(i!=N) /*与书上不同,改了!!!*/
{
for(n=NYseq1[i];n<=NYseq1[i+1]-1;n++)
{
if(flag==1)
{
A=Yij[n].G;
C=Yij[n].B;
}
else
{
A=-Yij[n].B;/*书上又因错了 */
C=Yij[n].G;
}
j=Yij[n].j; /*取出G,B,j*/
VV=Vi*NodeVoltage[j].V; /*Vi*Vj*/
theta=NodeVoltage[i].theta-NodeVoltage[j].theta;/*delta_theta*/
A=A*VV*cos(theta);/*还好cos sin函数中的参数为弧度,不用转化为度*/
C=C*VV*sin(theta);
NodePower[i][flag]=NodePower[i][flag]+A+C;
NodePower[j][flag]=NodePower[j][flag]+A-C;
}
}
else break; /*等于N时直接跳出循环。连接下面*/
} /*for's*/
/*****************************************f12结束*****************************************/
/*****************************************f14开始*****************************************/
/** 求各节点功率偏差量 ***/
/** 求最大功率误差 ***/
i=1;
n_pv=1;
i_pv=PVNode[1].i;
MaxError=0.0; /*初始化*/
for(i=1;i<=N;i++)
{
Vi=NodeVoltage[i].V;
if(flag==1)
Wi=Node[i].P_G+Node[i].P_L-NodePower[i][1];
else
Wi=Node[i].Q_G+Node[i].Q_L-NodePower[i][2];
if(i==N)break; /*此处的break跳出for循环!*/
else
{
if(flag==2&&i==i_pv)
{
n_pv++;
i_pv=PVNode[n_pv].i;
DI[i]=0;
}
else
{
if((Wi>MaxError)||(-Wi>MaxError))
MaxError=((Wi>-Wi)?Wi:-Wi);/*书上错了,没考虑abs函数返回为int*/
DI[i]=Wi/Vi;
}
}
}/*for's*/
/*****************************************f14结束*****************************************/
if(flag==1)
{
/*****************************************用因子表1解方程开始*********************************/
n_u=1;
for(i=1;i<=N-1;i++)
{
DItemp=DI[i];
for(count=1;count<=NUsum1[i];count++)
{
j=U1[n_u].j;
DI[j]=DI[j]-DItemp*U1[n_u].value;
n_u++;
}
DI[i]=DItemp*D1[i];
}
for(i=N-1;i>=1;i--)
{
DItemp=DI[i];
for(count=1;count<=NUsum1[i];count++)
{
n_u--;
j=U1[n_u].j;
DItemp=DItemp-DI[j]*U1[n_u].value;
}
DI[i]=DItemp;
}
/*************************************用因子表1解方程结束****************************************/
}
else
{
/*************************************用因子表2解方程开始****************************************/
n_u=1;
for(i=1;i<=N-1;i++)
{
DItemp=DI[i];
for(count=1;count<=NUsum2[i];count++)
{
j=U2[n_u].j;
DI[j]=DI[j]-DItemp*U2[n_u].value;
n_u++;
}
DI[i]=DItemp*D2[i];
}
for(i=N-1;i>=1;i--)
{
DItemp=DI[i];
for(count=1;count<=NUsum2[i];count++)
{
n_u--;
j=U2[n_u].j;
DItemp=DItemp-DI[j]*U2[n_u].value;
}
DI[i]=DItemp;
}
/*************************************用因子表2解方程结束****************************************/
}
/***************************************f15开始*************************************/
/***************************统一进行修正(内含flag=1或2时)****************************/
/** 平衡节点V&角 定死了,不参加修正 *****/
/*正式进行修正运算*/
for(i=1;i<=N;i++)
{
if(flag==1)
{
Dtheta=DI[i]/V0; /*重大疑惑:书上对PV节点修正时也除以1.0,并非除以1.05*/
NodeVoltage[i].theta=NodeVoltage[i].theta-Dtheta;
Theta[i]=NodeVoltage[i].theta/3.1415926*180;
}
else
{
DV=DI[i];
NodeVoltage[i].V=NodeVoltage[i].V-DV;
}
}
/***************************************f15结束*************************************/
/***************************************跳转控制************************************/
if(flag==1)
{
flag=2;
}
else
{
timer++;
flag=1;
}
}while(MaxError>ERROR);
/**************************************do-while主循环结束*************************************************/
/*************************************节点结果输出显示*****************************************/
window(1,2,80,24); /*简单的背景设置*/
textbackground(LIGHTCYAN); /*这个颜色搭配不错*/
textcolor(BLACK);
clrscr();
gotoxy(1,2);
printf("After %d iterations the result of Bus is\n",timer);
printf("Voltage :\n");
for(i=1;i<=N;i++)
printf("%f\t",NodeVoltage[i].V);
printf("Theta :\n");
for(i=1;i<=N;i++)
printf("%f\t",Theta[i]);
printf("Active Power :\n");
for(i=1;i<=N;i++)
printf("%f\t",NodePower[i][1]);
printf("Reactive Power :\n");
for(i=1;i<=N;i++)
printf("%f\t",NodePower[i][2]);
/*******************************支路数据输出**********************************/
PLoss=0.0;
QLoss=0.0; /*初始化清0*/
for(n=1;n<=Nb;n++)
{
i=abs(Branch[n].i);
j=abs(Branch[n].j);
R=Branch[n].R;
X=Branch[n].X;
YK=2*Branch[n].YK;
Vi=NodeVoltage[i].V;
theta=NodeVoltage[i].theta;
Ei=Vi*cos(theta);
Fi=Vi*sin(theta);
Vj=NodeVoltage[j].V;
theta=NodeVoltage[j].theta;
Ej=Vj*cos(theta);
Fj=Vj*sin(theta);
if(Branch[n].i<0||Branch[n].j<0)
{
if(Branch[n].i<0)
{
Ei=2*Ei/YK;
Fi=2*Fi/YK;
}
else
{
Ej=2*Ej/YK;
Fj=2*Fj/YK;
}
YK=0.0;
}
DE=Ei-Ej;
DF=Fi-Fj;
Zmag2=R*R+X*X;
Ir=(DE*R+DF*X)/Zmag2;
Ii=(DF*R-DE*X)/Zmag2;
Pij=Ir*Ei+Ii*Fi;
Qij=Ir*Fi-Ii*Ei;
Pji=-Ir*Ej-Ii*Fj;
Qji=-Ir*Fj+Ii*Ej;
Qij=Qij-Vi*Vi*YK/2.0;
Qji=Qji-Vj*Vj*YK/2.0;
PLoss=PLoss+Pij+Pji;
QLoss=QLoss+Qij+Qji;
gotoxy(20,13+n);
printf("%f\t%f\t%f\t%f",Pij,Qij,Pji,Qji);
}/*for's*/
gotoxy(1,12);
printf("The Result of Line is");
gotoxy(1,13);
for(i=0;i<6;i++)
printf("%s",Line_menu1[i]);
for(i=0;i<Nb;i++)
{
gotoxy(4,14+i);
printf("%d",Branch[i+1].i);
}
for(i=0;i<Nb;i++)
{
gotoxy(12,14+i);
printf("%d",Branch[i+1].j);
}
gotoxy(1,19);
printf("The Total Active SunHao is %f",PLoss);
gotoxy(1,20);
printf("The Total Reactive SunHao is %f",QLoss);
}/*if(key==C)的*/
/*if(key==Key_H)
/*显示帮助文档*/
/*cputs("hello flowH");*/
if(key==Key_Q)
exit(0); /*调用了退出函数*/
else
goto lebel; /*goto语句*/
}/*while的*/
}/*main的*/
/*****************取键盘扫描码子函数*****************/
int get_key()
{ /*对BIOS调用,包含在<dos.h>文件中*/
union REGS rg;
rg.h.ah=0;
int86(0x16,&rg,&rg); /*16号中断调用*/
return rg.h.ah; /*返回键盘码*/
}
/******************取键盘码子函数结束********************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -