📄 pq潮流程序.cpp
字号:
#include<fstream.h>
#include<math.h>
#include <iomanip.h>
//----------------线路数据结构体--------------//
struct Line
{
int i;//线路一端所连的节点号,节点号绝对值i<j,i按绝对值从小到大排列;
//节点号为负表示为变压器支路,负号的节点侧为变压器的非标准变比侧;此时节点电容换为变压器变比
int j;//线路另一端所连的节点号
double r;//线路电阻
double x;//线路电抗
double b;//接地电容,若为变压器节点电容换为变压器变比//这里的b为线路导纳的一半b/2
int hh;//标记支路号 用于还原输出
}*line;
//----------------接地线路数据结构体--------------//
struct Grand_line
{
int i;//接地支路号
double r;//接地支路电阻
double b;//接地支路电容
int hh;//标记支路号,用于还原输出
}*grand;
//----------------发电机数据结构体--------------//
struct Generator
{
int i;//发电机节点号,最后一个发电机为平衡节点
double P;//发电机有功功率
double Q;//发电机无功功率
double V;//发电机机端电压,电压为负表示PV节点
}*generator;
struct Pinghengji
{
int i;//平衡机节点号,最后一个发电机为平衡节点
double P;//平衡机有功功率
double Q;//平衡机无功功率
double V;//平衡机机端电压
}*pinghengji;
//----------------负荷数据结构体--------------//
struct Load
{
int i;//负荷节点号
double P;//负荷的有功功率
double Q;//负荷的无功功率
double V;//负荷处的电压(初始为0)
}*load;
//----------------优化结构体--------------//
struct Youhua
{int nn;//记录节点的度
int nn1;
int *jd;//记录节点号
int *w;
}*youhua;
//-------------自导纳结构体--------------//
struct Yii
{double g,b;
}*yii;
struct Yii1
{double g,b;
}*yii1;
//------------互导纳结构体----------------//
struct Yij
{double g,b;
int j;
}*yij;
struct Yij1
{double g,b;
int j;
}*yij1;
//----------------U--------------//
struct U_Type
{double value;
int j;
}*U1,*U2,*U;
//-------------------节点电压数组-----------------//
struct NodalVoltage_Type
{double V,theta;
}*NodalVoltage;
//---------定义支路数,节点数,接地支路数,发电机数,负荷数,平衡节点号,精度---//
int line_num,nod_num,grand_num,generator_num,load_num,ph;
int diedai=0;//统计迭带次数
int test;
int *sum,*seq ,*seq1,*sum1,*seq2,*sum2,*old,*neww;
double *D1,*D2,*NodalyPower,*NodalwPower,*GeneyPower,*GenewPower,*DI,*PinghengjiyPower,*PinghengjiwPower;
double MaxError=50;
int ErrorNode=0;
double E;
//ofstream fenxi("分析.txt");
//---------定义读入函数块-------------------------------//
void read()
{
char *a;
A: cout<<"请输入测试系统的节点数:";
cin>>test;
switch(test)
{
case 5:a="D5.txt";
break;
case 14:a="D14.txt";
break;
case 30:a="D30.txt";
break;
case 57:a="D57.txt";
break;
case 118:a="D118.txt";
break;
default:
cout<<"input error:没有找到相应节点的测试系统"<<endl;
goto A;
}
//ofstream outfile("原始数据输出.txt");
ifstream in(a,ios::in|ios::nocreate);
if(!in)
{
cout<<"open error"<<endl;
}
//---读入支路数,节点数,接地支路数,发电机数,负荷数,平衡节点号,精度---//
in>>line_num>>nod_num>>grand_num>>generator_num>>load_num>>ph>>E;
/* outfile<<"线路数为:"<<line_num<<" "<<"节点数为:"<<nod_num<<" "<<"接地线路数为:"<<grand_num<<" ";
outfile<<"发电机数为:"<<generator_num<<" "<<"负荷数为:"<<load_num<<"平衡节点号为: "<<ph<<"精度为"<<E<<endl;*/
//---输入各线路的两端节点号,电阻,电抗,电容---------//
line=new struct Line[line_num+3];//动态开辟line_num+1个Line类型的结构体;
int k=1;
for(int i=1;i<=line_num;i++)//只用到1-line_num+1个
{in>>line[i].i>>line[i].j>>line[i].r>>line[i].x>>line[i].b;
line[i].hh=k;
k++;
}
/* for(i=1;i<=line_num;i++)
{outfile<<line[i].i<<" "<<line[i].j<<" "<<line[i].r<<" "<<line[i].x<<" "<<line[i].b<<"非接地支路"<<line[i].hh<<endl;
}*/
//---输入各接地线路的节点号,电阻,电容---------//
grand=new struct Grand_line[grand_num+3];//动态开辟grand_num+1个Grand_line类型的结构体;
k=1;
for(i=1;i<=grand_num;i++)
{in>>grand[i].i>>grand[i].r>>grand[i].b;
grand[i].hh=k;
k++;
}
/* for(i=1;i<=grand_num;i++)
{outfile<<grand[i].i<<" "<<grand[i].r<<" "<<grand[i].b<<" "<<"接地支路"<<grand[i].hh<<endl;
}*/
//---输入发电机的节点号,有功功率,无功功率,电压---------//
generator=new struct Generator[generator_num+3];//动态开辟generator_num+1个Generator类型的结构体;
for(i=1;i<=generator_num;i++)
{in>>generator[i].i>>generator[i].P>>generator[i].Q>>generator[i].V;
}
/*for(i=1;i<=generator_num;i++)
{outfile<<generator[i].i<<" "<<generator[i].P<<" "<<generator[i].Q<<" "<<generator[i].V<<"发电机"<<endl;
}*/
//---输入平衡机的节点号,有功功率,无功功率,电压---------//
pinghengji=new struct Pinghengji[2];//动态开辟2个Pinghengji类型的结构体;
in>>pinghengji[1].i>>pinghengji[1].P>>pinghengji[1].Q>>pinghengji[1].V;
// outfile<<pinghengji[1].i<<" "<<pinghengji[1].P<<" "<<pinghengji[1].Q<<" "<<pinghengji[1].V<<"平衡机"<<endl;
//---输入负荷的节点号,有功功率,无功功率,电压---------//
load=new struct Load[load_num+3];//动态开辟load_num+1个Load类型的结构体;
for(i=1;i<=load_num;i++)
{in>>load[i].i>>load[i].P>>load[i].Q>>load[i].V;
}
/*for(i=1;i<=load_num;i++)
{outfile<<load[i].i<<" "<<load[i].P<<" "<<load[i].Q<<" "<<load[i].V<<"负荷"<<endl;
}*/
}
//---优化节点编号函数块-----------------------------//
void op()
{
old=new int[nod_num+1];//开辟一个空间存放原来的节点号
neww=new int[nod_num+1];//开辟一个空间存放新的的节点号
int i,j,n,m,min,k,mm,a,flag,jj,nnn,bb,kk;
youhua=new struct Youhua[nod_num+1];
for( i=1;i<=nod_num;i++)
{
youhua[i].jd=new int[20];
youhua[i].w=new int[20];
old[i]=0;
neww[i]=0;
}
for(i=1;i<=nod_num;i++)//清零
{ youhua[i].nn=0;
}
for(i=1;i<=line_num;i++)//按支路扫描,统计每个节点的度以及每个节点连接的是什么
{ a=0;
n=abs(line[i].i);
m=abs(line[i].j);
if(m==abs(line[i-1].j)&&n==abs(line[i-1].i))//并联支路只用计算一次度,形成初始化度表;连了些什么,每个点有多少度;
{a=1;}
if(!a)
{
youhua[n].nn++;
youhua[m].nn++;
youhua[n].jd[youhua[n].nn]=m;
youhua[m].jd[youhua[m].nn]=n;
}
}
k=1;
cout<<"消去"<<old[k-1]<<"节点"<<endl;
for(i=1;i<=nod_num;i++)//输出调试
{flag=0;
for(j=1;j<=k;j++)
if(i==old[j])
{flag=1;break;}
if(!flag)
{cout<<i<<" ";
for(j=1;j<=youhua[i].nn;j++)
cout<<youhua[i].jd[j]<<" ";
cout<<"**"<<youhua[i].nn<<endl;
}
}
while(k<=nod_num)
{
min=1000;
for(i=1;i<=nod_num;i++)
{ flag=0;
for(j=1;j<=k-1;j++)//如果是已经编过号的则不考虑
if(i==old[j])
{flag=1;break;
}
if(!flag)
{ if(min>youhua[i].nn)
{min=youhua[i].nn;//记录下最小度的节点号
old[k]=i;//新-老变换对
neww[i]=k;//老-新变换对
}//记录下旧的节点号,新的节点号为k
}
}
//--------扫描该删去那些节点的连接---------//
for(i=1;i<=youhua[old[k]].nn;i++)
{ mm=youhua[old[k]].jd[i];
for(j=1;j<=youhua[mm].nn;j++)//对*(youhua[mm].jd)进行操作
{
if(youhua[mm].jd[j]==old[k])
{ for(jj=j;jj<=youhua[mm].nn-1;jj++)
{ youhua[mm].jd[jj]=youhua[mm].jd[jj+1];//把后面的元素赋给前面
}
youhua[mm].nn--;//度减1
break;
}
}
}
//--------扫描有没有新增加的度---------//
for(i=1;i<=youhua[old[k]].nn;i++)//扫描(youhua[old[k]].jd[i])
{ mm=youhua[old[k]].jd[i];//2
for(jj=i+1;jj<=youhua[old[k]].nn;jj++)
{ nnn=youhua[old[k]].jd[jj];//5
flag=0;
for(j=1;j<=youhua[mm].nn;j++)
if(nnn==youhua[mm].jd[j])//5 8
{flag=1;break;}
if(!flag)
{ youhua[mm].nn++;//度数加1
youhua[nnn].nn++;
youhua[mm].jd[youhua[mm].nn]=nnn;//把新增加的度放在最后一位
youhua[nnn].jd[youhua[nnn].nn]=mm;
}
}
}
k++;
}
//-----------把平衡节点的编号放在最后一位-------//
for(i=1;i<=nod_num;i++)
{ if(old[i]==ph)
{ for(j=i;j<=nod_num-1;j++)
{old[j]=old[j+1];
neww[old[j+1]]--;
}
old[nod_num]=ph;
neww[ph]=nod_num;
}
}
//-------------优化后的编号------------------//
ofstream outfil("新老编号对照.txt");
outfil<<"新老编号对照"<<endl;
for(i=1;i<=nod_num;i++)
outfil<<i<<" "<<old[i]<<endl;
ofstream outfilee("老新编号对照.txt");
outfilee<<"老新编号对照"<<endl;
for(i=1;i<=nod_num;i++)
outfilee<<i<<" "<<neww[i]<<endl;
//--------改变线路的节点的编号---------------//
for(i=1;i<=line_num;i++)
{
for(j=1;j<=nod_num;j++)
{
if(abs(line[i].i)==old[j])
{
if(line[i].i>0)
line[i].i=j;
else
line[i].i=-j;
break;
}
}
for(j=1;j<=nod_num;j++)
{
if(abs(line[i].j)==old[j])
{
if(line[i].j>0)
line[i].j=j;
else
line[i].j=-j;
break;
}
}
if(abs(line[i].i)>abs(line[i].j))
{
a=line[i].i;
line[i].i=line[i].j;
line[i].j=a;
}
}
/* ofstream shuchuyuanshi("f0.txt");
for(i=1;i<=line_num;i++)
{
shuchuyuanshi<<line[i].i<<" "<<line[i].j<<" "<<line[i].r<<" "<<line[i].x<<" "<<line[i].b<<endl;
}*/
// ofstream shuchu("f2.txt");
//--------改变接地线路的节点的编号---------------//
for(i=1;i<=grand_num;i++)
{
for(j=1;j<=nod_num;j++)
{
if(grand[i].i==old[j])
{ grand[i].i=j;
break;
}
}
}
for(i=1;i<=grand_num-1;i++)
{
for(j=i+1;j<=grand_num;j++)
{
if(grand[i].i>grand[j].i)
{ grand[grand_num+1]=grand[i];
grand[i]=grand[j];
grand[j]=grand[grand_num+1];
}
}
}
/* for(k=1;k<=grand_num;k++)//输出调试
{
shuchu<<grand[k].i<<" "<<grand[k].r<<" "<<grand[k].b<<" "<<"接地支路"<<grand[k].hh<<endl;
}*/
//--------改变发电机节点的编号---------------//
for(i=1;i<=generator_num;i++)
{
for(j=1;j<=nod_num;j++)
{
if(generator[i].i==old[j])
{ generator[i].i=j;
break;
}
}
}
for(i=1;i<=generator_num-1;i++)
{
for(j=i+1;j<=generator_num;j++)
{
if(generator[i].i>generator[j].i)
{ generator[generator_num+1]=generator[i];
generator[i]=generator[j];
generator[j]=generator[generator_num+1];
}
}
}
/* for(k=1;k<=generator_num;k++)//输出调试
{
shuchu<<generator[k].i<<" "<<generator[k].P<<" "<<generator[k].Q<<" "<<generator[k].V<<"发电机"<<endl;
}*/
//-----------改变平衡机节点的编号,因为只有一个平衡机所以不用重新排序-----//
for(j=1;j<=nod_num;j++)
{
if(pinghengji[1].i==old[j])
{ pinghengji[1].i=j;
break;
}
}
// shuchu<<pinghengji[1].i<<" "<<pinghengji[1].P<<" "<<pinghengji[1].Q<<" "<<pinghengji[1].V<<"平衡机"<<endl;
//--------改变负荷节点的编号---------------//
for(i=1;i<=load_num;i++)
{
for(j=1;j<=nod_num;j++)
{
if(load[i].i==old[j])
{ load[i].i=j;
break;
}
}
}
/* ofstream shuchu1("f3.txt");
for(k=1;k<=load_num;k++)//输出调试
{
shuchu1<<load[k].i<<" "<<load[k].P<<" "<<load[k].Q<<" "<<load[k].V<<"负荷"<<endl;
}*/
for(i=1;i<=load_num-1;i++)
{
for(j=i+1;j<=load_num;j++)
{
if(load[i].i>load[j].i)
{ load[load_num+1]=load[i];
load[i]=load[j];
load[j]=load[load_num+1];
}
}
}
/* for(k=1;k<=load_num;k++)//输出调试
{
shuchu<<load[k].i<<" "<<load[k].P<<" "<<load[k].Q<<" "<<load[k].V<<"负荷"<<endl;
}*/
//从小到大的排列//
for( i=1;i<=nod_num;i++)//清零
{ youhua[i].nn=0;
youhua[i].nn1=0;
}
for(i=1;i<=line_num;i++)//按支路扫描,统计优化后每个节点的度以及每个节点连接的是什么
{
n=abs(line[i].i);
m=abs(line[i].j);
youhua[n].nn++;
youhua[m].nn++;
if(m>n)
{
youhua[n].nn1++;
youhua[n].jd[youhua[n].nn1]=m;
}
if(n>m)
{ youhua[m].nn1++;
youhua[m].jd[youhua[m].nn1]=n;
}
}
for(i=1;i<=nod_num;i++)
{
for(j=1;j<=youhua[i].nn1;j++)
for(k=j;k<=youhua[i].nn1;k++)
if(youhua[i].jd[j]>youhua[i].jd[k])
{a=youhua[i].jd[j];
youhua[i].jd[j]=youhua[i].jd[k];
youhua[i].jd[k]=a;
}
}
k=0;
cout<<"支路号"<<endl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -