📄 cpp2.cpp
字号:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include "stdlib.h"
#include<iomanip.h>
#include<math.h>
#include<fstream.h>
#define pi 3.1415926
int i,j,k,p,q,y;
/*
N :节点 L:支路数
data[100][6]:输入数据
*/
int N,L,N0;
/*
getSysData() 子函数功能:从输入文件得到系统接线图数据
*/
void getSysData(){
}
void main(){
FILE *result; //定义文件用于输出结果,此文件包含节点导纳矩阵
result=fopen("result.txt","w");
//以及每次迭代的节点电压修正值、PV节点的功率、迭代收敛后的最终潮流分布
//**************从文本文件读取线路和节点数据
ifstream fLine;
fLine.open("Line.txt"); //Line.txt 放置线路间的信息,第一个数据是节点个数
fLine>>N>>L;
double LD[100][7]; //从文件里读出的线路参数
for(i=0;i<L;i++)
{
for(j=0;j<7;j++)
{
fLine>>LD[i][j];
}
}
cout<<"*****************************************"<<"\n";
cout<< N<<"\n";
cout<< L<<"\n";
fLine.close();
ifstream fNode;
fNode.open("Node.txt"); //Node.txt 放置节点的参数信息
double ND[100][9]; //从文件里读出的节点参数
for(i=0;i<N;i++)
{
for(j=0;j<9;j++)
{
fNode>>ND[i][j];
}
}
//************************************形成节点导纳矩阵YG(实部),YB(虚部)
//double * * YG=new double * [node_num+1]; //节点导纳矩阵的实部
//double * * YG=new double * [N+1]; //定义节点导纳矩阵的实部矩阵
//double * * YB=new double * [N+1]; //定义节点导纳矩阵的虚部矩阵
double YG[100][10];
double YB[100][10];
for(i=0;i<N;i++){ //初始化纳矩阵的实部矩阵和虚部矩阵
for(j=0;j<N;j++){
YG[i][j]=YB[i][j]=0;
}
}
int p,q; //临时变量,保存节点
for(i=0;i<L;i++)
{
if(LD[i][6]==0) //线路无变压器或者标准变比类型
{
p=LD[i][0]-1;
q=LD[i][1]-1;
}
else //非标准变压器类型
{
q=LD[i][0]-1;
p=LD[i][1]-1;
}
YG[p][q]=YG[p][q]-LD[i][2]/(LD[i][5]*(pow(LD[i][2],2)+pow(LD[i][3],2)));
YG[q][p]=YG[p][q];
YG[q][q]=YG[q][q]+LD[i][2]/(pow(LD[i][5],2)*(pow(LD[i][2],2)+pow(LD[i][3],2)));
YG[p][p]=YG[p][p]+LD[i][2]/(pow(LD[i][2],2)+pow(LD[i][3],2));
YB[p][q]=YB[p][q]+LD[i][3]/(LD[i][5]*(pow(LD[i][2],2)+pow(LD[i][3],2)));
YB[q][p]=YB[p][q];
YB[q][q]=YB[q][q]-LD[i][3]/(pow(LD[i][5],2)*(pow(LD[i][2],2)+pow(LD[i][3],2)))+LD[i][4]/2;
YB[p][p]=YB[p][p]-LD[i][3]/(pow(LD[i][2],2)+pow(LD[i][3],2))+LD[i][4]/2;
}
//****************输出节点导纳矩阵到文本文件
fprintf(result,"***************节点导纳矩阵******************: \n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
fprintf(result,"%9.6f",YG[i][j]);
fprintf(result,"+j");
fprintf(result,"%9.6f",YB[i][j]);
fprintf(result," ");
}
fprintf(result,"\n");
}
fprintf(result,"\n");
fprintf(result,"*********************************: \n");
//********节点初始参数
double *E=new double[N]; //电压实部
double *F=new double[N]; //电压虚部
double *V=new double[N]; //
double *P=new double[N]; //有功
double *Q=new double[N]; //无功
// double *B=new double[N];
for (i=0;i<N;i++)
{
E[i]=ND[i][4];
F[i]=ND[i][5];
P[i]=ND[i][0]-ND[i][2];
Q[i]=ND[i][1]-ND[i][3];
V[i]=ND[i][6];
YB[i][i]=YB[i][i]+ND[i][7];
}
//********节雅可比矩阵***************************************
N0=2*N;
int BalancePoint=1,a=0,m,ICT1=0,IT2=1,ICT2[40];
float pr =0.00001;
double C[20],D[20],P1,Q1,DP,DV,DQ,V2,J[30][21],O[20];
double SP[30][30],SQ[30][30],SP1[30][30],SQ1[30][30],e1,f1,e2,f2,R,X,K,c,A1,A2,A3,A4,A5,A6,DET;
while(IT2!=0)
{
IT2=0;
for(i=0;i<N;i++)
{
if(i!=(BalancePoint-1))
{
C[i]=0;D[i]=0;
for(j=0;j<N;j++)
{
C[i]+=YG[i][j]*E[j]-YB[i][j]*F[j];
D[i]+=YG[i][j]*F[j]+YB[i][j]*E[j];
}
P1=C[i]*E[i]+F[i]*D[i];
Q1=F[i]*C[i]-D[i]*E[i];
//求P、Q
V2=E[i]*E[i]+F[i]*F[i];
if(ND[i][8]!=3)
{
DP=P[i]-P1;
DQ=Q[i]-Q1;
for(j=0;j<N;j++)
{
if(j!=(BalancePoint-1)&&j!=i)
{
A1=-YG[i][j]*E[i]-YB[i][j]*F[i];
A2=YB[i][j]*E[i]-YG[i][j]*F[i];
A3=A2;
A4=-A1;
p=2*i+1,q=2*j+1,J[p-1][q-1]=A3;J[p-1][N0]=DQ;m=p+1;
J[m-1][q-1]=A1;J[m-1][N0]=DP;q=q+1;J[p-1][q-1]=A4;J[m-1][q-1]=A2;
}
else if(j==i&&j!=(BalancePoint-1))
{
A1=-C[i]-YG[i][i]*E[i]-YB[i][i]*F[i];
A2=-D[i]+YB[i][i]*E[i]-YG[i][i]*F[i];
A3=D[i]+YB[i][i]*E[i]-YG[i][i]*F[i];
A4=-C[i]+YG[i][i]*E[i]+YB[i][i]*F[i];
p=2*i+1;q=2*j+1;J[p-1][q-1]=A3;J[p-1][N0]=DQ;m=p+1;
J[m-1][q-1]=A1;J[m-1][N0]=DP;q=q+1;J[p-1][q-1]=A4;J[m-1][q-1]=A2;
}
}
}
else
{
DP=P[i]-P1;
DV=V[i]*V[i]-V2;
for(j=0;j<N;j++)
{
if(j!=(BalancePoint-1)&&j!=i)
{
A1=-YG[i][j]*E[i]-YB[i][j]*F[i];
A2=YB[i][j]*E[i]-YG[i][j]*F[i];
A5=0;
A6=0;
p=2*i+1,q=2*j+1;J[p-1][q-1]=A5;J[p-1][N0]=DV;
m=p+1;J[m-1][q-1]=A1;J[m-1][N0]=DP;q=q+1;J[p-1][q-1]=A6;J[m-1][q-1]=A2;
}
else if(j==i&&j!=(BalancePoint-1))
{
A1=-C[i]-YG[i][i]*E[i]-YB[i][i]*F[i];
A2=-D[i]+YB[i][i]*E[i]-YG[i][i]*F[i];
A5=-2*E[i];
A6=-2*F[i];
p=2*i+1;q=2*j+1;J[p-1][q-1]=A5;J[p-1][N0]=DV;m=p+1;
J[m-1][q-1]=A1;J[m-1][N0]=DP;q=q+1;J[p-1][q-1]=A6;J[m-1][q-1]=A2;
}
}
}
}
}
//雅可比矩阵
for(i=2;i<N0;i++)
{
for(j=i+1;j<=N0;j++)
J[i][j]=J[i][j]*1.0/J[i][i];
for(j=i+1;j<N0;j++)
{
for(k=i+1;k<N0+1;k++)
J[j][k]-=J[j][i]*J[i][k];
}
}
for(i=N0-2;i>1;i--)
{
for(j=i+1;j<N0;j++)
J[i][N0]-=J[i][j]*J[j][N0];
}
for(i=2;i<N0-1;)
{
L=1.0*i/2;
E[L]-=J[i][N0];
F[L]-=J[i+1][N0];
i=i+2;
}
for(i=2;i<N0;i++)
{
DET=J[i][N0];
if(J[i][N0]<0)
DET=-J[i][N0];
if(DET>=pr)
IT2=IT2+1;
}
ICT2[a]=IT2;
a=a+1;
ICT1=ICT1+1;
}
//迭代结束
cout<<"迭代次数:"<<ICT1<<endl;
cout<<"没有达到精度要求的个数:"<<endl;
for(i=0;i<a;i++)
{
cout<<ICT2[i]<<"\t";
}
cout<<"\n";
//*************************************************test
for(i=0;i<N;i++)
{
V[i]=hypot(E[i],F[i]);
O[i]=atan(F[i]/E[i])*180.0/pi;
}
cout<<"各节点的实际电压标么值为(节点号从小到大):"<<endl;
for(i=0;i<N;i++)
{
if(E[i]==0)
{
if(F[i]==0)
cout<<"0"<<" ";
else
cout<<F[i]<<"j"<<" ";
}
else
{
if(F[i]>0)
cout<<E[i]<<"+"<<F[i]<<"j"<<" ";
else if(F[i]<0)
cout<<E[i]<<F[i]<<"j"<<" ";
else
cout<<E[i]<<" ";
}
}
cout<<"\n\n";
cout<<"各节点的电压大小为:"<<endl;
for(i=0;i<N;i++)
{
cout<<V[i]<<" ";
}
cout<<"\n\n";
cout<<"各节点的电压相角为:"<<endl;
for(i=0;i<N;i++)
{
cout<<O[i]<<" ";
}
cout<<"\n\n";
cout<<"各节点的功率为:"<<endl;
for(i=0;i<N;i++)
{
C[i]=0,D[i]=0;
for(j=0;j<N;j++)
{
C[i]+=YG[i][j]*E[j]-YB[i][j]*F[j];
D[i]+=YG[i][j]*F[j]+YB[i][j]*E[j];
}
P1=C[i]*E[i]+F[i]*D[i];
Q1=F[i]*C[i]-D[i]*E[i];
if(P1==0)
{
if(Q1==0)
cout<<"0"<<" ";
else
cout<<Q1<<"j"<<" ";
}
else
{
if(Q1>0)
cout<<P1<<"+"<<Q1<<"j"<<" ";
else if(Q1<0)
cout<<P1<<Q1<<"j"<<" ";
else
cout<<P1<<" ";
}
}
cout<<"\n\n";
cout<<"各支路的首端功率为:"<<endl;
for(i=0;i<L;i++)
{
if(LD[i][6]==0)
{
p=LD[i][0]-1;
q=LD[i][1]-1;
}
else
{
q=LD[i][0]-1;
p=LD[i][1]-1;
}
e1=E[p],f1=F[p],c=LD[i][4],R=LD[1][2],X=LD[i][3],e2=E[q],f2=F[q],K=LD[i][5];
SP[p][q]=(e1*e1*K*R-e1*e2*R-e1*f2*X+K*f1*f1*R-f1*f2*R+e2*f1*X)/((R*R+X*X)*K);
SQ[p][q]=(-e1*e1*c-f1*f1*c)/2+(e1*f2*R+K*X*e1*e1-e1*e2*X-e2*f1*R+K*f1*f1*X-f1*f2*X)/((R*R+X*X)*K);
if(SP[p][q]==0)
{
if(SQ[p][q]==0)
cout<<"0"<<" ";
else
cout<<SQ[p][q]<<"j"<<" ";
}
else
{
if(SQ[p][q]>0)
cout<<SP[p][q]<<"+"<<SQ[p][q]<<"j"<<" ";
else if(SQ[p][q]<0)
cout<<SP[p][q]<<SQ[p][q]<<"j"<<" ";
else
cout<<SP[p][q]<<" ";
}
}
cout<<"\n\n";
cout<<"各支路的末端功率为:"<<endl;
for(i=0;i<L;i++)
{
if(LD[i][6]==0)
{p=LD[i][0]-1,q=LD[i][1]-1;}
else {q=LD[i][0]-1,p=LD[i][1]-1;}
e1=E[q],f1=F[q],c=LD[i][4],R=LD[1][2],X=LD[i][3],e2=E[p],f2=F[p],K=LD[i][5];
SP1[q][p]=(e1*e1*K*R-e1*e2*R-e1*f2*X+K*f1*f1*R-f1*f2*R+e2*f1*X)/((R*R+X*X)*K);
SQ1[q][p]=(-e1*e1*c-f1*f1*c)/2+(e1*f2*R+K*X*e1*e1-e1*e2*X-e2*f1*R+K*f1*f1*X-f1*f2*X)/((R*R+X*X)*K);
if(SP1[q][p]==0)
{
if(SQ1[q][p]==0)
cout<<"0"<<" ";
else
cout<<SQ1[q][p]<<"j"<<" ";
}
else
{
if(SQ1[q][p]>0)
cout<<SP1[q][p]<<"+"<<SQ1[q][p]<<"j"<<" ";
else if(SQ1[q][p]<0)
cout<<SP1[q][p]<<SQ1[q][p]<<"j"<<" ";
else
cout<<SP1[q][p]<<" ";
}
}
cout<<"\n\n";
cout<<"各支路的功率损耗为:"<<endl;
for(i=0;i<L;i++)
{
if(LD[i][6]==0)
{ p=LD[i][0]-1,q=LD[i][1]-1;}
else {q=LD[i][0]-1,p=LD[i][1]-1;}
DP=SP[p][q]+SP1[q][p];
DQ=SQ[p][q]+SQ1[q][p];
if(DP==0)
{
if(DQ==0)
cout<<"0"<<" ";
else
cout<<DQ<<"j"<<" ";
}
else
{
if(DQ>0)
cout<<DP<<"+"<<DQ<<"j"<<" ";
else if(DQ<0)
cout<<DP<<DQ<<"j"<<" ";
else
cout<<DP<<" ";
}
}
//*}*************结束************************************************
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -