⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 powerflowdlg.cpp

📁 电力系统分析的NR法潮流计算、暂态稳定计算VC++源码。
💻 CPP
字号:
// PowerFlowDlg.cpp : implementation file
//

#include "stdafx.h"
#include "高电.h"
#include "PowerFlowDlg.h"
#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

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// PowerFlowDlg dialog


PowerFlowDlg::PowerFlowDlg(CWnd* pParent /*=NULL*/)
	: CDialog(PowerFlowDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(PowerFlowDlg)
	m_Line = _T("");
	m_LineNum = _T("");
	m_Node = _T("");
	m_NodeNum = _T("");
	m_Result = _T("");
	m_Ygb = _T("");
	//}}AFX_DATA_INIT
}


void PowerFlowDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(PowerFlowDlg)
	DDX_Text(pDX, IDC_Line, m_Line);
	DDX_Text(pDX, IDC_LineNum, m_LineNum);
	DDX_Text(pDX, IDC_Node, m_Node);
	DDX_Text(pDX, IDC_NodeNum, m_NodeNum);
	DDX_Text(pDX, IDC_RESULT, m_Result);
	DDX_Text(pDX, IDC_YGB, m_Ygb);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(PowerFlowDlg, CDialog)
	//{{AFX_MSG_MAP(PowerFlowDlg)
	ON_BN_CLICKED(IDC_BUTTON1, OnBtAnalysis)
	ON_BN_CLICKED(IDC_BUTTON2, OnBtData)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// PowerFlowDlg message handlers

void PowerFlowDlg::OnBtAnalysis() 
{
	int i,j,k,p,q,y, N,L,N0;
/*
	N :节点 L:支路数 
*/
		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];
			}
		}
		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];
			}
		}		      	                   
	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;
	}
//****************输出节点导纳矩阵到文本文件
CString  strY;
CString  strR;
CString  str1;
CString  str2;
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,"    ");
				str1.Format("%9.6f",YG[i][j]);
				str1.TrimLeft();
				str2.Format("%9.6f",YB[i][j]);
				str2.TrimLeft();
				strY=strY+str1+"+j"+str2+"  ";
			}
			fprintf(result,"\n");
			strY=strY+"\r\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];
                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<<"没有达到精度要求的个数:"<<endl;
	str1.Format("%d",ICT1);
	strR="迭代次数 :"+str1+"\r\n";
	strR=strR+"依次没有达到精度要求的个数为:";
	for(i=0;i<a;i++)
	{
		cout<<ICT2[i]<<"\t";
		str1.Format("%d",ICT2[i]);
		strR=strR+str1+" ";
	}
	strR=strR+"\r\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;
	}
	strR=strR+"各节点的实际电压标么值为(节点号从小到大):";
	for(i=0;i<N;i++)
	{
		if(E[i]==0)
			{
			if(F[i]==0)
					str1="0";
				else{
					str1.Format("%9.6f",F[i]);
					str1=str1+"j";
					}					
			}
		else
			{
			if(F[i]>0){
					str1.Format("%9.6f",E[i]);
					str2.Format("%9.6f",F[i]);
					str1=str1+"+"+str2+"j";
			}
			else if(F[i]<0){
					str1.Format("%9.6f",E[i]);
					str2.Format("%9.6f",F[i]);
					str1=str1+str2+"j";
			}
			else
					str1.Format("%9.6f",E[i]);
			}
		strR=strR+str1;
	}
	strR=strR+"\r\n";
	strR=strR+"各节点的电压大小为:";
	for(i=0;i<N;i++)
	{
		str1.Format("%9.6f",V[i]);
		strR=strR+str1;
	}
	strR=strR+"\r\n";
	strR=strR+"各节点的电压相角为:";
	for(i=0;i<N;i++)
	{	
		str1.Format("%9.6f",D[i]);
		strR=strR+str1;
	}
	strR=strR+"\r\n";
	strR=strR+"各节点的功率为:";
	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];
		str1.Format("%9.6f",P1);
		str2.Format("%9.6f",Q1);
		if(P1==0)
			{
				if(Q1==0)
					str1="0";
				else{
					str1=str2+"j";
				}
					
			}
		else
			{
				
			if(Q1>0)	
				str1=str1+"+"+str2+"j";		
			else if(Q1<0)
				str1=str1+str2+"j";
			else
				;
		}
	strR=strR+str1+" ";
	}
	strR=strR+"\r\n";
	strR=strR+"各支路的首端功率为:";
	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);
		str1.Format("%9.6f",SP[p][q]);
		str2.Format("%9.6f",SQ[p][q]);
		if(SP[p][q]==0)
			{
				if(SQ[p][q]==0)
					str1="0";
				else
					str1=str2+"j";
			}
		else
			{
				if(SQ[p][q]>0)
					str1=str1+"+"+str2+"j";
				else if(SQ[p][q]<0)
					str1=str1+str2+"j";
				else
					;
			}
	strR=strR+str1+" ";
	}
	strR=strR+"\r\n";
	strR=strR+"各支路的末端功率为:";
	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);
		str1.Format("%9.6f",SP1[q][p]);
		str2.Format("%9.6f",SQ1[q][p]);
		if(SP1[q][p]==0)
			{
				if(SQ1[q][p]==0)
					str1="0";
				else
					str1=str1+"j";
			}
		else
			{
				if(SQ1[q][p]>0)
					str1=str1+"+"+str2+"j";
				else if(SQ1[q][p]<0)
					str1=str1+str2+"j";
				else
					;
			}
	strR=strR+str1+" ";
	}
	strR=strR+"\r\n";
	strR=strR+"各支路的功率损耗为:";
	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];
		str1.Format("%9.6f",DP);
		str2.Format("%9.6f",DQ);
		if(DP==0)
			{
				if(DQ==0)
					str1="0";
				else
					str1=str2+"j";
			}
		else
			{
				if(DQ>0)
					str1=str1+"+"+str2+"j";
				else if(DQ<0)
					str1=str1+str2+"j";
				else
					;
			}
	strR=strR+str1+" ";
	}
	
	m_Ygb=strY;
	m_Result=strR; 
	UpdateData(FALSE);

	
}

void PowerFlowDlg::OnBtData() 
{
	int i,j;
	int N,L;
	CString  strLNum;
	CString  strNNum;
	CString  strLd;
	CString  strNd;
	CString  str;
	ifstream fLine;
	fLine.open("Line.txt");		//Line.txt  放置线路间的信息,第一个数据是节点个数
	fLine>>N>>L;
	str.Format("%d",N);
	strNNum=str;
	str.Format("%d",L);
	strLNum=str;
	double LD[100][7];                      //从文件里读出的线路参数
	for(i=0;i<L;i++)      
		{
			for(j=0;j<7;j++)
			{
				fLine>>LD[i][j];
				str.Format("%9.2f",LD[i][j]);
				str.TrimLeft();
				strLd=strLd+str+" ";
			}
			strLd=strLd+"\r\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];
			str.Format("%9.2f",ND[i][j]);
			str.TrimLeft();
			strNd=strNd+str+" ";
		}
		strNd=strNd+"\r\n";
	}
	fNode.close();
	m_NodeNum=strNNum;
	m_LineNum=strLNum;
	m_Line=strLd;
	m_Node=strNd; 
	UpdateData(FALSE);
	//str1.Format("%f",anglec);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -