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

📄 text.cpp

📁 电力系统中
💻 CPP
字号:
/*
   潮流计算程序
*/
#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <complex>
#include <iomanip>

#include <time.h>    //ANSI标准库

using namespace std;


/*节点信息结构体*/
struct BUSDATA
{
 int    Number;
 string Name;
 int    Unknown;
 int    LoadFlowAreaNumber;
 int    LossZoneNumber;
 int    Type ;
               /*0 - Unregulated (load, PQ)
                 1 - Hold MVAR generation within voltage limits, (PQ)
                 2 - Hold voltage within VAR limits (gen, PV)
                 3 - Hold voltage and angle (swing, V-Theta) (must always have one)
               */
 double FinalVoltage;/* p.u. */
 double FinalAngle  ;/*degrees */
 float  LoadMW ;
 float  LoadMVAR ;
 float  GenerationMW ;
 float  GenerationMVAR;
 float  BaseKV;
 float  DesiredVolts ;
 float  MaximumLimit;/*MVAR or voltage*/
 float  MinimumLimit;/*MVAR or voltage*/ 
 float  ShuntG ;/*(per unit) */
 float  ShuntB ;/*(per unit) */
 int    RemoteControlledBusNumber;

};
/*支路信息结构体*/
struct BRANCHDATA
{
int TapBusNumber; /*
                 For transformers or phase shifters, the side of the model
                 the non-unity tap is on*/
int ZBusNumber ;/*
                 For transformers and phase shifters, the side of the model
                 the device impedance is on.*/
int LoadFlowArea ;
int LossZone ;
int Circuit ;
int Type ;  /*
                 0 - Transmission line
                 1 - Fixed tap
                 2 - Variable tap for voltage control (TCUL, LTC)
                 3 - Variable tap (turns ratio) for MVAR control
                 4 - Variable phase angle for MW control (phase shifter)
			  */
double BranchR;         /*per unit (F) */
double BranchX;         /*per unit (F) No zero impedance lines*/
double LineChargingB;   /*per unit (F) (total line charging, +B)*/
int LineMVAratingNo1 ;
int LineMVAratingNo2 ;
int LineMVAratingNo3 ;
int ControlBusNumber;
int Side;
               /*0 - Controlled bus is one of the terminals
                 1 - Controlled bus is near the tap side
                 2 - Controlled bus is near the impedance side (Z bus)
			    */
double TransformerFinalTurnsRatio;
double TransformerFinalAngle;/*(phase shifter) */
double MinimumShift;/*tap or phase */
double MaximumShift;/*tap or phase */
double StepSize;
double MinimumLimit ;/* voltage, MVAR or MW */
double MaximumLimit ;/* voltage, MVAR or MW */
};

ofstream outputfile("计算结果.txt");

vector< complex<double> >  BusVolts;           //母线电压向量
vector< double >  JacobianMatrix;     //雅克比矩阵
vector< complex<double> >  AdmittanceMatrix;   //导纳矩阵
                                               //	vector<complex<double>>  AdmittanceMatrix; 就不对,原因不详 
vector< double>  BusPQVDelta;  

int iBusNumber;                         //母线个数 
vector<struct BUSDATA>  BusData;        //母线数据向量

int iBranchNumber;                      //支路个数
vector<struct BRANCHDATA>  BranchData;  //支路数据向量

vector< double > deltaVolt;             //电压修正量


/*--------------------------------------------
             导纳矩阵生成函数
输入:cdf数据文件
输出:系统导纳矩阵 AdmittanceMatrix
返回值: 0-文件读取失败
         1-导纳矩阵生成成功
---------------------------------------------*/

int  MakeAdmittanceMatrix(string & filename)
{
    string Data,DataHead,DataTail,DataBlock;
	ifstream DataFile(filename.c_str());
	int startpos,endpos,i,j,k;
	float BaseMW=0;               //基准功率
	if(!DataFile)
	{   
		outputfile<<"文件 "<<filename<<" 打开失败!"<<endl;
		return 0;
	}
	getline(DataFile,Data,'!');  //分行符号指定为'!',其实质是读取整个文件

    DataBlock=Data.substr(31,6);
	stringstream tempstream;
	tempstream<<DataBlock;
	tempstream>>BaseMW;

	if(BaseMW<=0)
	{
		outputfile<<"基准功率未找到!"<<endl;
		return 0;
	}	
	
	outputfile<<" 基准功率 :"<<BaseMW<<endl;

   /*-------------读取母线信息-----------------*/	
	DataHead="BUS DATA FOLLOWS";
    DataTail="-999";
    startpos=Data.find(DataHead);
	if(startpos==string::npos)
	{
		outputfile<<"母线数据块头未找到!"<<endl;
		return 0;
	}
    endpos=Data.find(DataTail);
	if(endpos==string::npos)
	{
		outputfile<<"母线数据块尾未找到!"<<endl;
		return 0;
	}

    if(endpos>=startpos)
	{
	  DataBlock=Data.substr(startpos,endpos-startpos);
      Data.erase(0,endpos+5);
	}
	else
	{
	  outputfile<<"数据块标志不匹配!"<<endl;
	  return 0;
	}

	startpos=DataBlock.find("ITEMS");
    string number=DataBlock.substr(startpos-5,4);  //项目数可能多位,因此取4位,但这种做法不严谨
    
	stringstream strstream;
	strstream<<number;
	strstream>>iBusNumber;
   
    outputfile<<"该系统中共有 "<<iBusNumber<<" 条母线:"<<endl;

    startpos=DataBlock.find('\n');
	DataBlock=DataBlock.erase(0,startpos+1); //去掉数据头

    stringstream strstream1;
    strstream1<<DataBlock;

    for(i=0;i<iBusNumber;i++)
	{
	 string tempstr;
     getline(strstream1,tempstr);

     stringstream tempstrstream;
	 struct BUSDATA tempBusData;
     tempstrstream<<tempstr;

     tempstrstream>>tempBusData.Number;
     tempstrstream>>tempBusData.Name;
     tempstrstream>>tempBusData.Unknown;
     tempstrstream>>tempBusData.LoadFlowAreaNumber;
     tempstrstream>>tempBusData.LossZoneNumber;
     tempstrstream>>tempBusData.Type ;
     tempstrstream>>tempBusData.FinalVoltage;
     tempstrstream>>tempBusData.FinalAngle  ;
     tempstrstream>>tempBusData.LoadMW ;
     tempstrstream>>tempBusData.LoadMVAR ;
     tempstrstream>>tempBusData.GenerationMW ;
     tempstrstream>>tempBusData.GenerationMVAR;
     tempstrstream>>tempBusData.BaseKV;
     tempstrstream>>tempBusData.DesiredVolts ;
     tempstrstream>>tempBusData.MaximumLimit;
     tempstrstream>>tempBusData.MinimumLimit;
     tempstrstream>>tempBusData.ShuntG ;
     tempstrstream>>tempBusData.ShuntB ;
     tempstrstream>>tempBusData.RemoteControlledBusNumber;

     tempBusData.LoadMW         /= BaseMW;
     tempBusData.LoadMVAR       /= BaseMW;
     tempBusData.GenerationMW   /= BaseMW;
     tempBusData.GenerationMVAR /= BaseMW;

	 BusData.push_back(tempBusData);
     
	} 		
	outputfile<<"Number"<<"\t"
              <<"Name"<<"\t"
              <<"LoadFlowAreaNumber"<<"\t"
              <<"LossZoneNumber"<<"\t"
              <<"Type"<<"\t"
              <<"FinalVoltage"<<"\t"
              <<"FinalVngle"<<"\t"
              <<"LoadMW"<<"\t"
              <<"LoadMVAR"<<"\t"
              <<"GenerationMW"<<"\t" 
              <<"GenerationMVAR"<<endl;   
	for(i=0;i<iBusNumber;i++)
	 { 
		outputfile<<BusData[i].Number<<"\t"
                   <<BusData[i].Name<<"\t"
                   <<BusData[i].LoadFlowAreaNumber<<"\t"
                   <<BusData[i].LossZoneNumber<<"\t"
                   <<BusData[i].Type <<"\t"
                   <<BusData[i].FinalVoltage<<"\t"
                   <<BusData[i].FinalAngle  <<"\t"
                   <<BusData[i].LoadMW <<"\t"
                   <<BusData[i].LoadMVAR <<"\t"
                   <<BusData[i].GenerationMW<<"\t"
                   <<BusData[i].GenerationMVAR<<endl;
	}

	outputfile<<endl;

    /*-------------读取支路信息-----------------*/	
	DataHead="BRANCH DATA";
    DataTail="-999";
    startpos=Data.find(DataHead);
	if(startpos==string::npos)
	{
		cout<<"数据块头未找到!"<<endl;
		return 0;
	}
    endpos=Data.find(DataTail);endpos=Data.find(DataTail);
	if(endpos==string::npos)
	{
		cout<<"数据块尾未找到!"<<endl;
		return 0;
	}

    if(endpos>=startpos)
      DataBlock=Data.substr(startpos,endpos-startpos);
	else
	{
	  outputfile<<"数据块标志不匹配!"<<endl;
	  return 0;
	}
		
	startpos=DataBlock.find("ITEMS");
    string strBranchNumber=DataBlock.substr(startpos-5,4);

	stringstream strstream2;
	strstream2<<strBranchNumber;
	strstream2>>iBranchNumber;
    outputfile<<"该系统中共有 "<<iBranchNumber<<" 条支路:"<<endl;

    startpos=DataBlock.find('\n');
	DataBlock=DataBlock.erase(0,startpos+1);
    
    stringstream strstream3;
    strstream3<<DataBlock;

    for(i=0;i<iBranchNumber;i++)
	{
	 string tempstr;
     getline(strstream3,tempstr);
     stringstream tempstrstream;
	 struct BRANCHDATA tempBranchData;
     tempstrstream<<tempstr;

     tempstrstream>>tempBranchData.TapBusNumber; 
     tempstrstream>>tempBranchData.ZBusNumber ;
     tempstrstream>>tempBranchData.LoadFlowArea ;
     tempstrstream>>tempBranchData.LossZone ;
     tempstrstream>>tempBranchData.Circuit ;
     tempstrstream>>tempBranchData.Type ; 
     tempstrstream>>tempBranchData.BranchR;  	 	   
     tempstrstream>>tempBranchData.BranchX;         
     tempstrstream>>tempBranchData.LineChargingB;   
     tempstrstream>>tempBranchData.LineMVAratingNo1 ;
     tempstrstream>>tempBranchData.LineMVAratingNo2 ;
     tempstrstream>>tempBranchData.LineMVAratingNo3 ;
     tempstrstream>>tempBranchData.ControlBusNumber;
     tempstrstream>>tempBranchData.Side;
     tempstrstream>>tempBranchData.TransformerFinalTurnsRatio;
     tempstrstream>>tempBranchData.TransformerFinalAngle;
     tempstrstream>>tempBranchData.MinimumShift;
     tempstrstream>>tempBranchData.MaximumShift;
     tempstrstream>>tempBranchData.StepSize;
     tempstrstream>>tempBranchData.MaximumLimit ;

	 BranchData.push_back(tempBranchData);
     
	}  
	outputfile <<"TapBusNumber"<<"\t"
               <<"ZBusNumber"<<"\t"
               <<"Type"<<"\t"
               <<"BranchR"<<"\t"
               <<"BranchX"<<"\t"
               <<"LineChargingB"<<"\t"
               <<"TransformerFinalTurnsRatio"<<endl;
	for(i=0;i<iBranchNumber;i++)
	 { 
		outputfile <<BranchData[i].TapBusNumber<<"\t"
                   <<BranchData[i].ZBusNumber<<"\t"
                   <<BranchData[i].Type<<"\t"
                   <<BranchData[i].BranchR<<"\t"
                   <<BranchData[i].BranchX <<"\t"
                   <<BranchData[i].LineChargingB <<"\t"
                   <<BranchData[i].TransformerFinalTurnsRatio<<endl;
	}
	outputfile<<endl;

	/*-------------生成导纳矩阵-----------------*/	
    AdmittanceMatrix.resize(iBusNumber*iBusNumber);

      
     	complex<double> c(0,0);
     	for(i=0;i<iBusNumber*iBusNumber;i++)
          AdmittanceMatrix[i] = 0; //不初始化不能能使用吗?
	 
     
    for(i=0;i<iBusNumber;i++)
	  for(j=0;j<=i;j++)
	   {
	    if(i==j) //对角元素生成
		{		  
		 complex<double> ShuntGB(BusData[i].ShuntG, BusData[i].ShuntB);
         cout<<ShuntGB<<"   "<<endl;
         AdmittanceMatrix[i*iBusNumber+j] += ShuntGB;
		 for(k=0;k<iBranchNumber;k++)
			 if(BranchData[k].TapBusNumber==i+1||BranchData[k].ZBusNumber==i+1)					 
			 {   
				 //cout<<k+1<<"支路:"<<endl;
				 complex<double> tempcomplex(BranchData[k].BranchR, BranchData[k].BranchX);
			     //cout<<tempcomplex<<"   ";
                 tempcomplex=conj(tempcomplex)/norm(tempcomplex);  //取倒数,得支路导纳
				 //cout<<tempcomplex<<"   "<<endl;
				 complex<double> B(0,BranchData[k].LineChargingB/2);

                 if(BranchData[k].Type==0) //传输线支路 	
                   AdmittanceMatrix[i*iBusNumber+j] += tempcomplex+B;			 		 
			     if(BranchData[k].Type==2) //变压器支路
				 {
				   if(BranchData[k].TapBusNumber==i+1)
				    AdmittanceMatrix[i*iBusNumber+j] += tempcomplex/(BranchData[k].TransformerFinalTurnsRatio*BranchData[k].TransformerFinalTurnsRatio)+B;
			       else if(BranchData[k].ZBusNumber==i+1)
				    AdmittanceMatrix[i*iBusNumber+j] += tempcomplex+B;
				 }
			 }
		   
		} 
		else//非对角元素生成
		{
		 for(k=0;k<iBranchNumber;k++)
			if( (BranchData[k].TapBusNumber==i+1&&BranchData[k].ZBusNumber==j+1)
				||(BranchData[k].TapBusNumber==j+1&&BranchData[k].ZBusNumber==i+1))	
			{   
				 //cout<<k+1<<"支路:"<<endl;
				 complex<double> tempcomplex(BranchData[k].BranchR, BranchData[k].BranchX);
			     //cout<<tempcomplex<<"   ";
                 tempcomplex=conj(tempcomplex)/norm(tempcomplex);  //取倒数,得支路导纳
				 //cout<<tempcomplex<<"   "<<endl;
                 if(BranchData[k].Type==0) //传输线支路 	
                   AdmittanceMatrix[i*iBusNumber+j] = - tempcomplex;			 		 
			     if(BranchData[k].Type==2) //变压器支路
				   AdmittanceMatrix[i*iBusNumber+j] = - tempcomplex/BranchData[k].TransformerFinalTurnsRatio;
			     				 
			 }	
		    AdmittanceMatrix[j*iBusNumber+i]=AdmittanceMatrix[i*iBusNumber+j];
		}
	   }
   outputfile<<endl<<"生成导纳矩阵:"<<endl;
   for(i=0;i<iBusNumber;i++)
   {
	  for(j=0;j<iBusNumber;j++)
         outputfile<<AdmittanceMatrix[i*iBusNumber+j]<<"\t";
	  outputfile<<endl;
   }
 return 1;
}
void main()
{  
   clock_t start;
  
  string filename("005IEEE.dat");
  outputfile<<setprecision(6)<<fixed<<"计算结果:"<<endl<<endl;
  start=clock();
  if(!MakeAdmittanceMatrix(filename))
    return ;
}

⌨️ 快捷键说明

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