📄 pq潮流程序.cpp
字号:
{
outf<<"第"<<i<<"行";
outf<<"第"<<U2[n].j<<"列"<<" "<<U2[n].value<<endl;
n++;
}
}
}
for(n=1;n<=14;n++)
cout<<"D2["<<n<<"]="<<D2[n]<<endl;
for(n=1;n<=25;n++)
cout<<"U2["<<n<<"]="<<U2[n].value<<endl;
}
//----------------三角分解函数块--------------------//
void sanjiao(U_Type *U,int *sum3,double *D)
{
int i,n_u,j,count;
double DItemp;
n_u=1;
for(i=1;i<=nod_num-1;i++)
{
DItemp=DI[i];
for(count=1;count<=sum3[i];count++)
{
j=U[n_u].j;
DI[j]=DI[j]-DItemp*U[n_u].value;
//cout<<"用第"<<i<<"行消去第"<<j<<"行:DI["<<j<<"]="<<"DI["<<j<<"]-DItemp*U["<<n_u<<"].value="
//<<a<<"-"<<DItemp<<"*"<<U[n_u].value<<"="<<DI[j]<<endl;
n_u++;
}
DI[i]=DItemp*D[i];
//cout<<"i="<<i<<" "<<"DI["<<i<<"]"<<DI[i]<<endl;
}
for(i=nod_num-1;i>=1;i--)
{
DItemp=DI[i];
for(count=1;count<=sum3[i];count++)
{
n_u--;
j=U[n_u].j;
DItemp=DItemp-DI[j]*U[n_u].value;
}
DI[i]=DItemp;
}
// cout<<"*********"<<endl;
}
//----------------计算节点功率框图--------------//
void jiediangonglv(int flag)
{
int i,j,n;
double Vi,A,B,VV,theta;
if(flag==1)
for(i=1;i<=nod_num;i++)
{
NodalyPower[i]=0.0;
}
else
for(i=1;i<=nod_num;i++)
{
NodalwPower[i]=0.0;
}
for(i=1;i<=nod_num;i++)
{
Vi=NodalVoltage[i].V;
if(flag==1)
{
A=yii[i].g;
NodalyPower[i]+=Vi*Vi*A;
}
else
{
A=-yii[i].b;
NodalwPower[i]+=Vi*Vi*A;
}
if(i==nod_num)//最后一个节点为平衡节点跳出,不执行以下语句
break;
for(n=seq[i];n<=seq[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;
theta=NodalVoltage[i].theta-NodalVoltage[j].theta;
A=A*VV*cos(theta);
B=B*VV*sin(theta);
if(flag==1)
{
NodalyPower[i]=NodalyPower[i]+A+B;
NodalyPower[j]=NodalyPower[j]+A-B;
}
else
{
NodalwPower[i]=NodalwPower[i]+A+B;
NodalwPower[j]=NodalwPower[j]+A-B;
}
}
}
/*if(flag==2)
{
for(i=1;i<nod_num;i++)
{
cout<<"NodalwPower["<<i<<"]="<<NodalwPower[i]<<endl;
}
}
*/
}
//--------------求最大功率误差的函数块-------------//
void zuidagonglvwucha(int flag)
{
int i,n_g,n_l,n_pv,i_g,i_l,i_pv;
double Wi,Wtemp,Vi;
MaxError=0.0;
i=1;
n_g=1;
n_l=1;
n_pv=1;
i_g=generator[1].i;
i_l=load[1].i;
i_pv=generator[1].i;
for(i=1;i<=nod_num;i++)
{
Vi=NodalVoltage[i].V;//取i节点的电压
if(i==i_l)//如果是负荷支路
{
if(flag==1)
{Wi=load[n_l].P;}
else
{Wi=load[n_l].Q;}
n_l++;
i_l=load[n_l].i;
}
else
Wi=0.0;
Wtemp=Wi;
if(flag==1)
Wi=Wi-NodalyPower[i];
else
Wi=Wi-NodalwPower[i];
if(i==i_g)//如果是发电机支路
{
if(flag==1)
{
NodalyPower[i]=Wtemp;
GeneyPower[i_g]=-Wi;
}
else
{
NodalwPower[i]=Wtemp;
GenewPower[i_g]=-Wi;
}
if(flag==1)
Wi=Wi+generator[n_g].P;
else
Wi=Wi+generator[n_g].Q;
n_g++;
i_g=generator[n_g].i;
}
if(i==pinghengji[1].i)//如果是平衡机
{
if(flag==1)
{
NodalyPower[i]=Wtemp;
PinghengjiyPower[i]=-Wi;
}
else
{ NodalwPower[i]=Wtemp;
PinghengjiwPower[i]=-Wi;
}
if(flag==1)
Wi=Wi+pinghengji[1].P;
else
Wi=Wi+pinghengji[1].Q;
}
if(i==nod_num)//平衡节点参与前半部分的运算,主要是为了求出该节点实际发出的功率,以备打印输出
break;//平衡节点不参与留最大功率误差的运算,以避免对收敛性作出错误的判断
if(flag==2&&i==i_pv)
{
n_pv++;
i_pv=generator[n_pv].i;
DI[i]=0;
}
else
{
if(fabs(Wi)>MaxError)
{
MaxError=fabs(Wi);
ErrorNode=i;
}
DI[i]=Wi/Vi;
}
/*if(flag==2)
cout<<"DI["<<i<<"]="<<DI[i]<<endl;*/
}
cout<<"MaxError="<<MaxError<<endl;
}
//------------修正电压程序函数块----------------//
void xiuzheng(int flag)
{
int i;
double Dtheta,DV;
if(flag==1)//用第一因子表求解
{
sanjiao(U1,sum1,D1);
}
else
sanjiao(U2,sum2,D2);//用第二因子表求解
for(i=1;i<=nod_num-1;i++)
{
if(flag==1)
{
Dtheta=DI[i]/NodalVoltage[i].V;
NodalVoltage[i].theta=NodalVoltage[i].theta-Dtheta;
}
else
{
DV=DI[i];
NodalVoltage[i].V=NodalVoltage[i].V-DV;
//fenxi<<i<<"节点"<<NodalVoltage[i].V<<endl;//??????????///
}
}
//fenxi<<endl;
}
//-------------------迭带函数块------------------//
void Diedai()
{
int i,n;
NodalVoltage=new NodalVoltage_Type[nod_num+1];//节点无功
NodalyPower=new double[nod_num+1];//节点有功
NodalwPower=new double[nod_num+1];//节点电压和相角
DI=new double[nod_num];
GeneyPower=new double[nod_num+1];
GenewPower=new double[nod_num+1];
PinghengjiyPower=new double[nod_num+1];
PinghengjiwPower=new double[nod_num+1];
for(i=1;i<=nod_num;i++)
{
NodalVoltage[i].V=1.0;
NodalVoltage[i].theta=0.0;
}
for(n=1;n<=generator_num;n++)
{
i=generator[n].i;
NodalVoltage[i].V=fabs(generator[n].V);
}
i=pinghengji[1].i;
NodalVoltage[i].V=pinghengji[1].V; //赋平衡机节点的电压
cout<<"i="<<i<<" "<<"NodalVoltage[i].V"<<NodalVoltage[i].V<<" "<<"pinghengji[1].V"<<pinghengji[1].V<<endl;
int flag1=0;
int flag2=0;
//送初值完毕
cout<<"第1次迭带"<<endl;
while(1)
{
jiediangonglv(1);//计算有功功率
zuidagonglvwucha(1);//求有功误差及最大有功功率误差
if(MaxError<E)
flag1=1;
xiuzheng(1);//修正相角
jiediangonglv(2);//计算无功功率
zuidagonglvwucha(2);//求无功误差
if(MaxError<E)
flag2=1;
if(flag1==1&&flag2==1)
break;
xiuzheng(2);//修正电压幅值
diedai++;
cout<<"第"<<diedai+1<<"次迭带"<<endl;
}
}
void dayin()
{
ofstream shuchuuu("节点数据输出.txt");
shuchuuu<<setprecision(5)<<setiosflags(ios::right)<<setiosflags(ios::fixed);
shuchuuu<<"**************************潮流计算程序(西安交通大学电气工程学院胡与非编写)***************************"<<endl;
shuchuuu<<"运行方式名:IEEE_"<<nod_num<<"_Bus_Test_System"<<endl;
shuchuuu<<"系统基本特性:"<<endl;
shuchuuu<<setw(15)<<"基准容量:100(MVA)"<<setw(15)<<"容许适配额:"<<E<<endl;
shuchuuu<<setw(15)<<"母线数:"<<nod_num<<endl;
shuchuuu<<setw(15)<<"发电机数:"<<generator_num+1<<endl;
shuchuuu<<setw(15)<<"负荷数:"<<load_num<<endl;
shuchuuu<<setw(15)<<"线路数:"<<line_num<<endl;
shuchuuu<<setw(15)<<"计算方法:PQ分解法"<<endl;
shuchuuu<<setw(15)<<"迭代次数:"<<diedai+1<<endl;
shuchuuu<<setw(15)<<"最大误差发生在第"<<ErrorNode<<"节点,误差为"<<MaxError<<endl;
shuchuuu<<endl;
shuchuuu<<endl;
shuchuuu<<"---------------------------------------潮流计算结果--------------------------------------------------"<<endl;
shuchuuu<<endl;
shuchuuu<<"***************************************节点电压及功率(标幺值)**************************************"<<endl;
shuchuuu<<"-----------------------------------------------------------------------------------------------------"<<endl;
shuchuuu<<setw(5)<<"节点名"<<setw(10)<<"电压"<<setw(15)<<"相角(度)"<<setw(15)<<"发电机有功"<<setw(15)<<"发电机无功"<<setw(15)<<"负荷有功"<<setw(15)<<"负荷无功"<<endl;
shuchuuu<<"-----------------------------------------------------------------------------------------------------"<<endl;
double P,Q,V,Vmin,theta1,PLoss,QLoss,x,r,YK,Vi,Vj,theta,Ei,Ej,Fi,Fj,z,Pij,Pji,Qij,Qji,DE,DF,Ir,Ii;
int VminNode,i,n,I,J;
P=0.0;
Q=0.0;
Vmin=NodalVoltage[1].V;
VminNode=1;
for(i=1;i<=nod_num;i++)
{
theta=NodalVoltage[i].theta/3.14159*180;//换算成度
V=NodalVoltage[i].V;
if(V<Vmin)
{
Vmin=V;
VminNode=i;
}
}
int flag,j;
int k=1;
while(k<=nod_num)
{
flag=0;
for(i=1;i<=nod_num;i++)
{
if(old[i]==k)
{
for(j=1;j<=generator_num;j++)
{
if(i==generator[j].i)//找到了发电机
{
flag=1;
break;
}
}
if(flag==1)
{
P=GeneyPower[i];
Q=GenewPower[i];
}
else
{
if(i==pinghengji[1].i)
{
P=PinghengjiyPower[i];
Q=PinghengjiwPower[i];
}
else
{
P=0.0;
Q=0.0;
}
}
shuchuuu<<setw(5)<<old[i]<<setw(10)<<NodalVoltage[i].V<<setw(15)<<NodalVoltage[i].theta/3.14159*180<<setw(15)<<P<<setw(15)<<Q<<setw(15)<<setw(15)<<-NodalyPower[i]<<setw(15)<<-NodalwPower[i]<<setw(15)<<endl;
}
}
k++;
}
//cout<<GeneyPower[3]<<endl<<generator[3].P;
//-----------以下打印支路数据---------------//
ofstream zhilu("支路数据输出.txt");
zhilu<<setprecision(5)<<setiosflags(ios::right)<<setiosflags(ios::fixed);
zhilu<<"-----------------------------------------------------------------------------------------------------"<<endl;
zhilu<<"***************************************支路功率及损耗(标幺值)**************************************"<<endl;
zhilu<<"-----------------------------------------------------------------------------------------------------"<<endl;
zhilu<<setw(5)<<"节点i"<<setw(10)<<"节点j"<<setw(15)<<"Pij"<<setw(15)<<"Qij"<<setw(15)<<"Pji"<<setw(15)<<"Qji"<<endl;
PLoss=0.0;
QLoss=0.0;
k=1;
while(k<=line_num)
{
flag=0;
for(n=1;n<=line_num;n++)
{
if(line[n].hh==k)
{
flag=1;
break;
}
}
if(flag==1)
{
I=abs(line[n].i);
J=abs(line[n].j);
r=line[n].r;
x=line[n].x;
YK=line[n].b;
Vi=NodalVoltage[I].V;
theta1=NodalVoltage[I].theta;
Ei=Vi*cos(theta1);
Fi=Vi*sin(theta1);
Vj=NodalVoltage[J].V;
theta1=NodalVoltage[J].theta;
Ej=Vj*cos(theta1);
Fj=Vj*sin(theta1);
if(line[n].i<0||line[n].j<0)
{
if(line[n].i<0)
{
Ei=Ei/YK;
Fi=Fi/YK;
}
else
{
Ej=Ej/YK;
Fj=Fj/YK;
}
YK=0.0;
}
DE=Ei-Ej;
DF=Fi-Fj;
z=r*r+x*x;
Ir=(DE*r+DF*x)/z;
Ii=(DF*r-DE*x)/z;
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;
Qji=Qji-Vj*Vj*YK;
PLoss=PLoss+Pij+Pji;
QLoss=QLoss+Qij+Qji;
if(old[I]<old[J])
zhilu<<setw(5)<<old[I]<<setw(10)<<old[J]<<setw(15)<<Pij<<setw(15)<<Qij<<setw(15)<<Pji<<setw(15)<<Qji<<endl;
if(old[I]>old[J])
zhilu<<setw(5)<<old[J]<<setw(10)<<old[I]<<setw(15)<<Pji<<setw(15)<<Qji<<setw(15)<<Pij<<setw(15)<<Qij<<endl;
}
k++;
}
double Qii,Pii;
k=1;
while(k<=grand_num)
{
flag=0;
for(n=1;n<=grand_num;n++)//计算接地支路的无功功率
{
if(grand[n].hh==k)
{flag=1;
break;
}
}
if(flag==1)
{
i=grand[n].i;
Vi=NodalVoltage[i].V;
YK=grand[n].b;
Qii=Vi*Vi*YK;
Pii=0;
zhilu<<setw(5)<<old[i]<<setw(10)<<old[i]<<setw(15)<<Pii<<setw(15)<<Qii<<setw(15)<<Pii<<setw(15)<<Qii<<endl;
QLoss=QLoss-Qii;
}
k++;
}
zhilu<<"最大网损为:PLOSS="<<PLoss<<" QLOSS="<<QLoss<<endl;
zhilu<<"系统最低电压出现在"<<old[VminNode]<<"节点最低电压为"<<Vmin<<endl;
}
void main()
{
read();
op();
daona();
Diedai();
dayin();
delete []line;
delete []generator;
delete []grand;
delete []load;
delete []youhua;
delete []seq;
delete []sum;
delete []yii;
delete []D1;
delete []D2;
delete []U1;
delete []U2;
delete []NodalyPower;
delete []NodalwPower;
delete []NodalVoltage;
delete []GeneyPower;
delete []GenewPower;
delete []DI;
delete PinghengjiyPower;
delete PinghengjiwPower;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -