📄 powerflowdlg.cpp
字号:
{
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;
b_ij=-1.0/X;
if(Branch[n].i<0||Branch[n].j<0) //若为变压器导纳需除以非标准变比
{
Yij[n].G=-Gij/YK;
Yij[n].B=Bij/YK;
Yijl[n].G=0.0;
Yijl[n].B=-b_ij/YK;
}
else //输电线路按式(4-1)计算
{
Yij[n].G=-Gij;
Yij[n].B=Bij;
Yijl[n].G=0.0;
Yijl[n].B=-b_ij;
}
Yij[n].j=j;
Yijl[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;
Yiil[i].B=Yiil[i].B+b_ij/YK;
Yiil[j].B=Yiil[j].B+b_ij/YK;
}
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;
Yiil[i].B=Yiil[i].B+b_ij;
Yiil[j].B=Yiil[j].B+b_ij;
}
NYsum[i]=NYsum[i]+1;
}
NYseq[1]=1;
for(i=1;i<=m_N-1;i++)
{
NYseq[i+1]=NYseq[i]+NYsum[i];
}
}
//接地支路的导纳矩阵形成函数
CPowerflowDlg::CGndy()
{
double YK,b_ij,Gij,Bij;;
int i,j,n;
for(n=1;n<=m_Nb;n++)
{
i=Branch[n].i;
j=Branch[n].j;
YK=Branch[n].YK;
if(i<0||j<0)
{
if(i<0) //变压器非标准变比设在i侧,并累计相应的自导纳
{
i=abs(i);
Gij=Yij[n].G;
Bij=Yij[n].B;
b_ij=Yijl[n].B;
Yii[i].G=Yii[i].G+(1.0-1.0/YK)*Gij;
Yii[i].B=Yii[i].B+(1.0-1.0/YK)*Bij;
Yiil[i].B=Yiil[i].B+(1.0-1.0/YK)*b_ij;
Yii[j].G=Yii[j].G+(1.0-YK)*Gij;
Yii[j].B=Yii[j].B+(1.0-YK)*Bij;
Yiil[j].B=Yiil[j].B+(1.0-YK)*b_ij;
}
else //设在j侧
{
j=abs(j);
Gij=Yij[n].G;
Bij=Yij[n].B;
b_ij=Yijl[n].B;
Yii[j].G=Yii[j].G+(1.0-1.0/YK)*Gij;
Yii[j].B=Yii[j].B+(1.0-1.0/YK)*Bij;
Yiil[j].B=Yiil[j].B+(1.0-1.0/YK)*b_ij;
Yii[i].G=Yii[i].G+(1.0-YK)*Gij;
Yii[i].B=Yii[i].B+(1.0-YK)*Bij;
Yiil[i].B=Yiil[i].B+(1.0-YK)*b_ij;
}
}
else //对输电线路累计充电电容自导纳
{
Bij=YK/2;
b_ij=YK/2;
Yii[i].B=Yii[i].B+Bij;
Yii[j].B=Yii[j].B+Bij;
Yiil[i].B=Yiil[i].B+b_ij;
Yiil[j].B=Yiil[j].B+b_ij;
}
}
}
//形成因子表
CPowerflowDlg::CYinzb()
{
int n_pv=1,n_u=1,i,j;
double Btemp;
int i_pv=PVNode[1].i;
for(i=1;i<=m_N-1;i++)
{
if((flag==2)&&(i=i_pv)) //形成第二因子表时跳过PV节点有关的行
{
n_pv=n_pv+1;
i_pv=PVNode[n_pv].i;
NUsum[i]=0;
D[i]=0;
continue;
}
else
{
for(int count=i+1;count<=m_N-1;count++)
{
B[count]=0.0;
}
if(flag==1) //形成第一因子表时需用到不接地导纳矩阵
B[i]=Yii[i].B;
else //形成第二因子表时需用到接地导纳矩阵
B[i]=Yiil[i].B;
for(count=NYseq[i];count<=NYseq[i+1]-1;count++)
{
if(flag==1)
{
j=Yij[count].j;
B[j]=Yij[count].B;
}
else
{
j=Yijl[count].j;
B[j]=Yijl[count].B;
}
}
if(flag==2)
{
for(count=1;count<=Npv;count++) //形成第二因子表跳过与PV节点有关的列
{
int j=PVNode[count].i;
B[j]=0;
}
}
n_u=1;
for(int i_above=1;i_above<=i-1;i_above++)
{
for(count=1;count<=NUsum[i_above];)
{
if(U[n_u].j!=i)
{
count=count+1;
n_u=n_u+1;
}
else
{
Btemp=U[n_u].value/D[i_above];
while(count<=NUsum[i_above])
{
j=U[n_u].j;
B[j]=B[j]-Btemp*U[n_u].value;
count=count+1;
n_u=n_u+1;
}
}
}
}
}
Btemp=1.0/B[i]; //形成因子表的第i行元素
D[i]=Btemp;
int count=0;
for(int j=i+1;j<=m_N-1;j++)
{
if(B[j]==0)
continue;
else
{
U[n_u].value=B[j]*Btemp;
U[n_u].j=j;
count=count+1;
n_u=n_u+1;
}
NUsum[i]=count;
}
}
}
//线性方程组的求解
CPowerflowDlg::CXxfczj()
{
int n_u=1,count,i,j;
// struct U_Type U[200];
for(i=1;i<=m_N-1;i++) //执行前代运算
{
DItemp=DI[i];
for(count=1;count<=NUsum[i];count++)
{
j=U[n_u].j;
DI[j]=DI[j]-DItemp*U[n_u].value;
n_u=n_u+1;
}
DI[i]=DItemp*D[i];
}
for(i=m_N-1;i>=1;i--) //执行回代运算
{
DItemp=DI[i];
for(count=1;count<=NUsum[i];count++)
{
n_u=n_u-1;
j=U[n_u].j;
DItemp=DItemp-DI[j]*U[n_u].value;
}
DI[i]=DItemp;
}
}
//计算节点功率
CPowerflowDlg::CPQNodal()
{
double Vi,VV,A,B,theta;
int i,j,n;
for(i=1;i<=m_N;i++)
{
NodalPower[i][flag]=0.0;
}
for(i=1;i<=m_N;i++)
{
Vi=NodalVoltage[i].V;
if(flag==1)
A=Yii[i].G;
else
A=-Yii[i].B;
NodalPower[i][flag]+=Vi*Vi*A; //公式(4-24)
if(i==m_N)
break;
else
{
for(n=NYseq[i];n<=NYseq[i+1]-1;n++)
{
if(flag==1)
{
A=Yij[n].G;
B=Yij[n].B;
}
else
{
A=-Yij[n].B;
B=Yij[n].G;
}
j=Yij[n].j;
VV=Vi*NodalVoltage[j].V; //以下与式(4-27)对应
theta=NodalVoltage[i].theta-NodalVoltage[j].theta;
A=A*VV*cos(theta);
B=B*VV*sin(theta);
NodalPower[i][flag]=NodalPower[i][flag]+A+B;
NodalPower[j][flag]=NodalPower[j][flag]+A-B;
}
}
}
}
//送电压初值
CPowerflowDlg::CVNodal()
{
/* struct NodalVoltage_Type NodalVoltage[100];
struct PVNode_Type PVNode[100];*/
for(int i=1;i<=m_N;i++) //向PQ节点送其应维持的电压
{
NodalVoltage[i].V=m_Vo;
NodalVoltage[i].theta=0.0;
}
for(int n=1;n<=Npv;n++) //向PV节点送其应维持的电压
{
i=PVNode[n].i;
NodalVoltage[i].V=PVNode[n].V;
}
}
//计算功率误差,并留最大功率误差
CPowerflowDlg::CMaxError()
{
int i=1;
double Vi,Wi,Wtemp;
int n_g=1,n_l=1,n_pv=1,ErrorNode;
int i_g=Generator[1].i,i_l=Load[1].i,i_pv=PVNode[1].i;
MaxError=0.0;
do//(i=1;i<=m_N;i++)
{
Vi=NodalVoltage[i].V;
if(i==i_l) //判断是否为负荷节点
{
if(flag==1)
Wi=Load[n_l].P;
else
Wi=Load[n_l].Q;
n_l=n_l+1;
i_l=Load[n_l].i;
}
else
Wi=0.0;
Wtemp=Wi;
Wi=Wi-NodalPower[i][flag];
if(i==i_g) //判断是否为发电机节点
{
NodalPower[i][flag]=Wtemp;
GenePower[i_g][flag]=-Wi;
if(flag==1)
Wi=Wi+Generator[n_g].P;
else
Wi=Wi+Generator[n_g].Q;
n_g=n_g+1;
i_g=Generator[n_g].i;
}
if(i==m_N) //平衡节点不参与留最大功率误差的运算
break;
else
{
if((flag==2)&&(i==i_pv))
{
n_pv=n_pv+1;
i_pv=PVNode[n_g].i;
DI[i]=0;
}
else
{
if(fabs(Wi)>MaxError)
{
MaxError=fabs(Wi); //获取最大功率误差
ErrorNode=i;
}
}
DI[i]=Wi/Vi;
}
i+=1;
}
while(1);
}
//修正电压
CPowerflowDlg::CRefVoltage()
{
// struct NodalVoltage_Type NodalVoltage[100];
double Dtheta,DV;
CXxfczj(); //求解线性方程组
for(int i=1;i<=m_N-1;i++)
{
if(flag==1) //进行角度修正
{
Dtheta=DI[i]/m_Vo;
NodalVoltage[i].theta=NodalVoltage[i].theta-Dtheta;
}
else //电压幅值修正
{
DV=DI[i];
NodalVoltage[i].V=NodalVoltage[i].V-DV;
}
}
}
//输出节点数据
CPowerflowDlg::COutNodalData()
{
double Vmin,V,theta,P,Q;
double a[50],Pg[50],Qg[50];
int VminNode=1;
Vmin=NodalVoltage[1].V;
int i_g=Generator[1].i;
int n_g=1;
for(int i=1;i<=m_N;i++)
{
theta=NodalVoltage[i].theta/3.14159*180;
V=NodalVoltage[i].V;
if(V<Vmin)
{
Vmin=V;
VminNode=i;
}
else
;
if(i==i_g)
{
P=GenePower[i][1];
Q=GenePower[i][2];
n_g=n_g+1;
i_g=Generator[n_g].i;
}
else
{
P=0.0;
Q=0.0;
}
//cout i,V,theta,NodalPower[i][1],NodalPower[i][2],P,Q;
a[i]=theta;Pg[i]=P;Qg[i]=Q;
cout<<"i="<<i<<"\t"<<"V="<<V<<"\t"<<"a="<<theta<<"\t"<<"Pl="<<NodalPower[i][1]<<"\t"<<"Ql="<<NodalPower[i][2]<<"\t"<<"Pg="<<P<<"\t"<<"Qg="<<Q<<endl;
m_vmin=Vmin;m_node=VminNode;
}
m_i1=1;m_v1=NodalVoltage[1].V;m_a1=a[1];m_i2=2;m_v2=NodalVoltage[2].V;m_a2=a[2];
m_i3=3;m_v3=NodalVoltage[3].V;m_a3=a[3];m_i4=4;m_v4=NodalVoltage[4].V;m_a4=a[4];
m_i5=5;m_v5=NodalVoltage[5].V;m_a5=a[5];
m_pgo1=Pg[1];m_qgo1=Qg[1];m_pgo2=Pg[2];m_qgo2=Qg[2];m_pgo3=Pg[3];m_qgo3=Qg[3];
m_pgo4=Pg[4];m_qgo4=Qg[4];m_pgo5=Pg[5];m_qgo5=Qg[5];
}
//支路数据输出
CPowerflowDlg::COutBranchData()
{
PLoss=0.0,QLoss=0.0;
double R,X,YK,Zmag2,Vi,theta,Ei,Fi,Vj,Ej,Fj,DE,DF,Ir,Ii,Pij,Qij,Pji,Qji;
int i,j,n;
for(n=1;n<=m_Nb;n++)
{
i=abs(Branch[n].i);
j=abs(Branch[n].j);
R=Branch[n].R;
X=Branch[n].X;
YK=Branch[n].YK;
Vi=NodalVoltage[i].V;
theta=NodalVoltage[i].theta;
Ei=Vi*cos(theta);
Fi=Vi*sin(theta);
Vj=NodalVoltage[j].V;
theta=NodalVoltage[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=Ei/YK;
Fi=Fi/YK;
}
else
{
Ej=Ej/YK;
Fj=Fj/YK;
}
YK=0.0;
}
else
;
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;
//cout i,j,Pij,Qij,Pji,Qji;
cout<<"i="<<i<<"\t"<<"j="<<j<<"\t"<<"Pij="<<Pij<<"\t"<<"Qij="<<Qij<<"\t"<<"Pji="<<Pji<<"\t"<<"Qji="<<Qji<<endl;
m_pij=Pij;m_qij=Qij;
m_pji=Pji;m_qji=Qji;
}
//cout PLoss,QLoss,Vmin,VminNode;
m_ploss=PLoss;m_qloss=QLoss;//<<"\t"<<"Vmin="<<Vmin<<\"t"<<"VminNode="<<VminNode<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -