📄 pq潮流程序.cpp
字号:
for(i=1;i<=nod_num;i++)
{
for(j=1;j<=youhua[i].nn1;j++)
{k++;
youhua[i].w[j]=k;//记录下新的支路号
}
}
cout<<"优化后的度表"<<endl;
/*for(i=1;i<=nod_num;i++)//输出调试
{
cout<<i<<" ";
for(j=1;j<=youhua[i].nn1;j++)
cout<<youhua[i].jd[j]<<"支路数为"<<youhua[i].w[j]<<" ";
cout<<"**"<<youhua[i].nn1<<endl;
}
for(i=1;i<=line_num;i++)//输出调试
{cout<<line[i].i<<" "<<line[i].j<<" "<<line[i].r<<" "<<line[i].x<<" "<<line[i].b<<"非接地支路"<<endl;
}
for(i=1;i<=grand_num;i++)//输出调试
{cout<<grand[i].i<<" "<<grand[i].r<<" "<<grand[i].b<<"接地支路"<<endl;
}
for(i=1;i<=generator_num;i++)//输出调试
{cout<<generator[i].i<<" "<<generator[i].P<<" "<<generator[i].Q<<" "<<generator[i].V<<"发电机支路"<<endl;
}
for(i=1;i<=load_num;i++)//输出调试
{cout<<load[i].i<<" "<<load[i].P<<" "<<load[i].Q<<" "<<load[i].V<<"负荷支路"<<endl;
}
cout<<"*******"<<endl;*/
jj=0;
/* ofstream outfile("f1.txt");
if(!outfile)
cout<<"error";*/
bb=0;
min=1000;
for(j=1;j<=nod_num;j++)
{
kk=1;
for(i=1;i<=line_num;i++)
{if(abs(line[i].i)==j&&abs(line[i].j)==youhua[j].jd[kk])
{
jj=youhua[j].w[kk];//支路号交换
// cout<<"j="<<j<<"jj="<<jj<<endl;
line[line_num+1]=line[i];
line[i]=line[jj];
line[jj]=line[line_num+1];
kk++;
i=jj;
}
}
/*for(i=1;i<=line_num;i++)
outfile<<line[i].i<<" "<<line[i].j<<" "<<line[i].r<<" "<<line[i].x<<" "<<line[i].b<<"非接地支路"<<j<<endl;*/
}
/* outfile<<"zuizhong"<<endl;
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;
}
*/
}
//--------------求导纳矩阵函数块---------------------//
void daona()
{
int i,j,n,i1,j1,a;
double r,x,yk,z,g,b,b1;
//---------形成不接地支路的导纳矩阵----------//
sum=new int [nod_num+1];
seq=new int [nod_num+1];
yii=new struct Yii[nod_num+1];
yij=new struct Yij[line_num+1];
yii1=new struct Yii1[nod_num+1];
yij1=new struct Yij1[line_num+1];
for(i=1;i<=nod_num;i++)
{yii[i].g=0.0;
yii[i].b=0.0;
yii1[i].g=0.0;
yii1[i].b=0.0;
sum[i]=0;
}
int mm=1;
for(n=1;n<=line_num;n++)
{
i=abs(line[n].i);
i1=line[n].i;
j=abs(line[n].j);
j1=line[n].j;
r=line[n].r;
x=line[n].x;
yk=line[n].b;
z=r*r+x*x;
g=r/z;
b=-x/z;
b1=-1.0/x;
if(line[n].i==line[n-1].i&&line[n].j==line[n-1].j)//处理并联支路
{
if(i1<0||j1<0)
{
yij[mm-1].g=yij[mm-1].g-g/yk;
yij[mm-1].b=yij[mm-1].b-b/yk;
yij1[mm-1].b=yij1[mm-1].b-b1/yk;
mm--;
}
else
{yij[mm-1].g=yij[mm-1].g-g;
yij[mm-1].b=yij[mm-1].b-b;
yij1[mm-1].b=yij1[mm-1].b-b1;
mm--;
}
}
else
{
if(i1<0||j1<0)//形成互导纳
{
yij[mm].g=-g/yk;
yij[mm].b=-b/yk;
yij1[mm].g=0.0;
yij1[mm].b=-b1/yk;
}
else
{
yij[mm].g=-g;
yij[mm].b=-b;
yij1[mm].g=0.0;
yij1[mm].b=-b1;
}
}
yij[mm].j=j;
yij1[mm].j=j;
mm++;
if(i1<0||j1<0)//形成自导纳
{
yii[i].g=yii[i].g+g/yk;
yii[i].b=yii[i].b+b/yk;
yii[j].g=yii[j].g+g/yk;
yii[j].b=yii[j].b+b/yk;
yii1[i].b=yii1[i].b+b1/yk;
yii1[j].b=yii1[j].b+b1/yk;
}
else
{
yii[i].g=yii[i].g+g;
yii[i].b=yii[i].b+b;
yii[j].g=yii[j].g+g;
yii[j].b=yii[j].b+b;
yii1[i].b=yii1[i].b+b1;
yii1[j].b=yii1[j].b+b1;
}
if(line[n].i==line[n-1].i&&line[n].j==line[n-1].j)
a=0;
else sum[i]=sum[i]+1;
}
seq[1]=1;
for(i=1;i<=nod_num-1;i++)
{
seq[i+1]=seq[i]+sum[i];
}
void formb(int flag);
void formbb(int flag);
formb(1);//形成因子表1
//---------形成追加接地支路的导纳矩阵----------//
for(n=1;n<=line_num;n++)
{
i=line[n].i;
j=line[n].j;
r=line[n].r;
x=line[n].x;
yk=line[n].b;
z=r*r+x*x;
g=r/z;
b=-x/z;
b1=-1.0/x;
if(i<0||j<0)
{
if(i<0)
{
g=-g/yk;
b=-b/yk;
b1=-b1/yk;
yii[abs(i)].g=yii[abs(i)].g+(1.0-1.0/yk)*g;
yii[abs(i)].b=yii[abs(i)].b+(1.0-1.0/yk)*b;
yii1[abs(i)].b=yii1[abs(i)].b+(1.0-1.0/yk)*b1;
yii[j].g=yii[j].g+(1.0-yk)*g;
yii[j].b=yii[j].b+(1.0-yk)*b;
yii1[j].b=yii1[j].b+(1.0-yk)*b1;
}
else
{
g=-g/yk;;
b=-b/yk;
b1=-b1/yk;
yii[abs(j)].g=yii[abs(j)].g+(1.0-1.0/yk)*g;
yii[abs(j)].b=yii[abs(j)].b+(1.0-1.0/yk)*b;
yii1[abs(j)].b=yii1[abs(j)].b+(1.0-1.0/yk)*b1;
yii[i].g=yii[i].g+(1.0-yk)*g;
yii[i].b=yii[i].b+(1.0-yk)*b;
yii1[i].b=yii1[i].b+(1.0-yk)*b1;
}
}
else
{
b=yk;
b1=yk;
yii[i].b=yii[i].b+b;
yii[j].b=yii[j].b+b;
yii1[i].b=yii1[i].b+b1;
yii1[j].b=yii1[j].b+b1;
}
}
for(n=1;n<=grand_num;n++)
{
b=grand[n].b;
b1=grand[n].b;
yii[grand[n].i].b=yii[grand[n].i].b+b;
yii1[grand[n].i].b=yii1[grand[n].i].b+b;
}
formbb(2);//形成因子表2
/*cout<<"列号"<<endl;
for(n=1;n<=line_num;n++)
{cout<<yij[n].j<<" "<<endl;
}
cout<<"seq******"<<endl;
for(n=1;n<=nod_num;n++)
{cout<<seq[n]<<" "<<endl;
}*/
ofstream outfile1("导纳矩阵.txt");
n=1;
for(i=1;i<=nod_num-1;i++)
{ outfile1<<"第"<<i<<"行"<<" "<<"第"<<i<<"列的自导纳元素为"<<" "<<yii[i].g<<"+j"<<yii[i].b<<endl;
j=seq[i+1]-seq[i];
for(;j>0;j--)
{outfile1<<"第"<<i<<"行";
outfile1<<"第"<<yij[n].j<<"列的互导纳元素为"<<" "<<yij[n].g<<"+j"<<yij[n].b<<endl;
n++;
}
}
outfile1<<"第"<<i<<"行"<<" "<<"第"<<i<<"列的自导纳元素为"<<" "<<yii[i].g<<"+j"<<yii[i].b<<endl;
/*ofstream outfile2("导纳矩阵2.txt");
n=1;
for(i=1;i<=nod_num-1;i++)
{ outfile2<<"第"<<i<<"行"<<" "<<"第"<<i<<"列的自导纳元素为"<<" "<<yii1[i].g<<"+j"<<yii1[i].b<<endl;
j=seq[i+1]-seq[i];
for(;j>0;j--)
{outfile2<<"第"<<i<<"行";
outfile2<<"第"<<yij1[n].j<<"列的互导纳元素为"<<" "<<yij1[n].g<<"+j"<<yij1[n].b<<endl;
n++;
}
}
outfile2<<"第"<<i<<"行"<<" "<<"第"<<i<<"列的自导纳元素为"<<" "<<yii1[i].g<<"+j"<<yii1[i].b<<endl;
*/
}
void formb(int flag)//形成因子表1
{
int n_pv,i,count,j,n_u,i_above,i_pv,n;
double Btemp;
U1=new struct U_Type [2000];
double *B;
B=new double[nod_num+1];
D1=new double[nod_num+1];
seq1=new int[nod_num];
sum1=new int[nod_num];
n_pv=1;
i_pv=generator[1].i;
for(i=1;i<=nod_num-1;i++)
{
if(flag==2&&i==i_pv)
{
n_pv++;
i_pv=generator[n_pv].i;
sum1[i]=0;
D1[i]=0;
}
else
{
for(count=i+1;count<=nod_num-1;count++)//清零
{
B[count]=0.0;
}
B[i]=yii[i].b;
for(count=seq[i];count<=seq[i+1]-1;count++)
{//cout<<yij[count].b<<" ";
j=yij[count].j;
B[j]=yij[count].b;
}
if(flag==2)
{
for(count=1;count<=n_pv;count++)
{
j=generator[count].i;
B[j]=0;
}
}
n_u=1;
i_above=1;
while(i_above<=i-1)
{
count=1;
while(count<=sum1[i_above])
{
if(U1[n_u].j==i)
{Btemp=U1[n_u].value/D1[i_above];
break;
}
count++;
n_u++;
}
while(count<=sum1[i_above])//把那一行的各列加到被消去行的各行
{
j=U1[n_u].j;//列号
B[j]=B[j]-Btemp*U1[n_u].value;//由对称性可知
count++;
n_u++;
}
i_above++;
}
Btemp=1.0/B[i];
D1[i]=Btemp;
count=0;
for(j=i+1;j<=nod_num-1;j++)//统计上三角
{
if(B[j]==0)
continue;
U1[n_u].value=B[j]*Btemp;//规格化
U1[n_u].j=j;
count++;
n_u++;
}
sum1[i]=count;
}
}
delete []B;
seq1[1]=1;
/*for(i=1;i<=nod_num-1;i++)
{
seq1[i+1]=seq1[i]+sum1[i];
}*/
ofstream outf("因子表1.txt");
n=1;
outf<<"因子表1"<<endl;
for(i=1;i<=nod_num-1;i++)
{
outf<<"第"<<i<<"行"<<" "<<"第"<<i<<"列"<<" "<<D1[i]<<endl;
j=sum1[i];
for(;j>0;j--)
{
outf<<"第"<<i<<"行";
outf<<"第"<<U1[n].j<<"列"<<" "<<U1[n].value<<endl;
n++;
}
}
/* cout<<"n_u="<<n_u;
for(n=1;n<=14;n++)
cout<<"D1["<<n<<"]="<<D1[n]<<endl;
for(n=1;n<=25;n++)
cout<<"U1["<<n<<"]="<<U1[n].value<<endl;*/
}
void formbb(int flag)//形成因子表2
{
int n_pv,i,count,j,n_u,i_above,i_pv,n;
double Btemp;
double *B;
U2=new struct U_Type [2000];
B=new double[nod_num+1];
D2=new double[nod_num+1];
seq2=new int[nod_num];
sum2=new int[nod_num];
n_pv=1;
i_pv=generator[1].i;
for(i=1;i<=nod_num-1;i++)
{
if(flag==2&&i==i_pv)
{
n_pv++;
i_pv=generator[n_pv].i;
sum2[i]=0;
D2[i]=0;
}
else
{
for(count=i+1;count<=nod_num-1;count++)//清零
{
B[count]=0.0;
}
B[i]=yii1[i].b;
for(count=seq[i];count<=seq[i+1]-1;count++)
{//cout<<yij1[count].b<<" ";
j=yij1[count].j;
B[j]=yij1[count].b;
}
if(flag==2)
{
for(count=1;count<=generator_num;count++)
{
j=generator[count].i;
B[j]=0;
}
}
n_u=1;
i_above=1;
while(i_above<=i-1)
{
count=1;
while(count<=sum2[i_above])
{
if(U2[n_u].j==i)
{Btemp=U2[n_u].value/D2[i_above];
break;
}
count++;
n_u++;
}
while(count<=sum2[i_above])//把那一行的各列加到被消去行的各行
{
j=U2[n_u].j;//列号
B[j]=B[j]-Btemp*U2[n_u].value;//由对称性可知
count++;
n_u++;
}
i_above++;
}
Btemp=1.0/B[i];
D2[i]=Btemp;
count=0;
for(j=i+1;j<=nod_num-1;j++)//统计上三角
{
if(B[j]==0)
continue;
U2[n_u].value=B[j]*Btemp;//规格化
U2[n_u].j=j;
count++;
n_u++;
}
sum2[i]=count;
}
}
delete []B;
seq2[1]=1;
/* for(i=1;i<nod_num-1;i++)
{
seq2[i+1]=seq2[i]+sum2[i];
}*/
ofstream outf("因子表2.txt");
n=1;
outf<<"因子表2"<<endl;
for(i=1;i<=nod_num-1;i++)
{ flag=0;
for(j=1;j<=generator_num;j++)
if(i==generator[j].i)
{
flag=1;
break;
}
if(!flag)
{
outf<<"第"<<i<<"行"<<" "<<"第"<<i<<"列"<<" "<<D2[i]<<endl;
j=sum2[i];
for(;j>0;j--)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -