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

📄 nlf.cpp

📁 计算电力潮流
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	int i,sum=0,count;
	gene_yymatrix[1].addres=1;
	for(i=1;i<=N;i++)
	{
		if(i==NS)
		{
			gene_yymatrix[2*i].addres=gene_yymatrix[2*i-1].addres;
			gene_yymatrix[2*i+1].addres=gene_yymatrix[2*i].addres;
			continue;
		}
		int n,j,end,list;
		for(j=1;j<i;j++)//先求取某一节点p,q或v2对f和e的偏导形成的工作数组//考虑1---i节点
		{
			if(j==NS)continue;//排除平衡节点
			for(end=yy_matrix[j+1].addres-1,n=yy_matrix[j].addres;n<=end;n++)
			{
				if(y_matrix[n].number==i)
				{
					UP[2*j-1]+=y_matrix[n].Bij*voltage[i].e-y_matrix[n].Gij*voltage[i].f;//f排在前面,e排在后面
					UP[2*j]+=-(y_matrix[n].Gij*voltage[i].e+y_matrix[n].Bij*voltage[i].f);
					if(pv[i]!=1)
					{
						UQ[2*j-1]+=-UP[2*j];
						UQ[2*j]+=UP[2*j-1];
					}
				//	continue;考虑双回路
				}
			}
		}                                                 //考虑自身倒数
		UP[2*i-1]=-ab[i].bii+(yy_matrix[i].Bii*voltage[i].e-yy_matrix[i].Gii*voltage[i].f);//p对f的倒数
		UP[2*i]=-ab[i].aii-(yy_matrix[i].Gii*voltage[i].e+yy_matrix[i].Bii*voltage[i].f);//p对e的倒数
		if(pv[i]!=1)
		{
			UQ[2*i-1]=-ab[i].aii+(yy_matrix[i].Gii*voltage[i].e+yy_matrix[i].Bii*voltage[i].f);
			UQ[2*i]=ab[i].bii+(yy_matrix[i].Bii*voltage[i].e-yy_matrix[i].Gii*voltage[i].f);
		}
		for(end=yy_matrix[i+1].addres-1,n=yy_matrix[i].addres;n<=end;n++)//考虑i--N的倒数
		{
			list=y_matrix[n].number;
			if(list==NS)continue;//排除平衡节点
			UP[2*list-1]+=y_matrix[n].Bij*voltage[i].e-y_matrix[n].Gij*voltage[i].f;
			UP[2*list]+=-(y_matrix[n].Gij*voltage[i].e+y_matrix[n].Bij*voltage[i].f);
			if(pv[i]!=1)
			{
				UQ[2*list-1]+=-UP[2*list];
				UQ[2*list]+=UP[2*list-1];//考虑双回路
			}

		}
		if(pv[i]==1)//求pv节点的v2对f和e的偏导
		{
            UQ[2*i-1]=-2*voltage[i].f;
			UQ[2*i]=-2*voltage[i].e;
		}
		
		//再消去已生成的两行工作数组,再稀疏存储形成因子表,同时对dpqv右端向量进行前代处理
        for(j=1;j<=2*i-2;j++)//对p对f和e的偏导数消元
		{
			if(int((j+1)/2)==NS)continue;
			if(UP[j]!=0)
			{
				for(end=gene_yymatrix[j+1].addres-1,n=gene_yymatrix[j].addres;n<=end;n++)
				{
					list=gene_ymatrix[n].number;
					UP[list]-=UP[j]*gene_ymatrix[n].data;//消去工作数组
				}
				if(j%2==1)
					dpqv[i].dp-=UP[j]*dpqv[int(j+1)/2].dp;//消去右端向量
				else
					if(pv[int(j+1)/2]==1)
						dpqv[i].dp-=UP[j]*dpqv[int(j+1)/2].dv2;
					else
						dpqv[i].dp-=UP[j]*dpqv[int(j+1)/2].dq;
			}
		}
		//此行稀疏存储p对f和e的偏导数消元后的工作数组
		count=0;
		for(j=2*i;j<=2*N;j++)
		{
			if(int(j+1)/2==NS)continue;
			if(fabs(UP[j])>0)
			{
               count++;
			   sum++;
			   gene_ymatrix[sum].data=UP[j]/UP[2*i-1];//标准化
			   gene_ymatrix[sum].number=j;
			}
		}
		gene_yymatrix[2*i-1].data=UP[2*i-1];
		gene_yymatrix[2*i].addres=gene_yymatrix[2*i-1].addres+count;
		dpqv[i].dp=dpqv[i].dp/UP[2*i-1];//标准化右端向量


		for(j=1;j<=2*i-1;j++)//对q或v2对f和e的偏导数消元
		{
			if(int(j+1)/2==NS)continue;
            if(UQ[j]!=0)
			{
				for(end=gene_yymatrix[j+1].addres-1,n=gene_yymatrix[j].addres;n<=end;n++)
				{
					list=gene_ymatrix[n].number;
					UQ[list]-=gene_ymatrix[n].data*UQ[j];
				}

				if(pv[i]==1)
				{
					if(j%2==1)
						dpqv[i].dv2-=UQ[j]*dpqv[int(j+1)/2].dp;//消去右端向量
				    else
					    if(pv[int(j+1)/2]==1)
							dpqv[i].dv2-=UQ[j]*dpqv[int(j+1)/2].dv2;
				     	else
						    dpqv[i].dv2-=UQ[j]*dpqv[int(j+1)/2].dq;
				}		
				else
				{
					if(j%2==1)
						dpqv[i].dq-=UQ[j]*dpqv[int(j+1)/2].dp;//消去右端向量
				    else
					    if(pv[int(j+1)/2]==1)
							dpqv[i].dq-=UQ[j]*dpqv[int(j+1)/2].dv2;
				     	else
						    dpqv[i].dq-=UQ[j]*dpqv[int(j+1)/2].dq;
				}
                
			}
		}

		count=0;
		for(j=2*i+1;j<=2*N;j++)//稀疏存储dq或dv2对f和e偏导数消元后的工作数组
		{
			if(int(j+1)/2==NS)continue;
			if(fabs(UQ[j])>0)
			{
				count++;
				sum++;
				gene_ymatrix[sum].data=UQ[j]/UQ[2*i];//标准化
				gene_ymatrix[sum].number=j;
			}
		}
		gene_yymatrix[2*i].data=UQ[2*i];
		gene_yymatrix[2*i+1].addres=gene_yymatrix[2*i].addres+count;
    	if(pv[i]==1)
			dpqv[i].dv2=dpqv[i].dv2/UQ[2*i];//标准化右端向量
		else
			dpqv[i].dq=dpqv[i].dq/UQ[2*i];
        
		for(j=1;j<=2*N;j++)//工作数组清零
		{
			UP[j]=0;
			UQ[j]=0;
		}
   }
	free(UP);
	free(UQ);
}  
void nlf::back_solve()
{
	int j,n,end,list;
	for(j=N;j>=1;j--)
	{
		if(j==NS)continue;
		for(end=gene_yymatrix[2*j+1].addres-1,n=gene_yymatrix[2*j].addres;n<=end;n++)
		{
			if(pv[j]==1)
			{
				list=gene_ymatrix[n].number;
				if(list%2==1)
					dpqv[j].dv2-=gene_ymatrix[n].data*dpqv[int(list+1)/2].dp;
				else
					if(pv[int(list+1)/2]==1)
						dpqv[j].dv2-=gene_ymatrix[n].data*dpqv[int(list+1)/2].dv2;
				    else
						dpqv[j].dv2-=gene_ymatrix[n].data*dpqv[int(list+1)/2].dq;
	
			}
			else
			{
				list=gene_ymatrix[n].number;
                if(list%2==1)
					dpqv[j].dq-=gene_ymatrix[n].data*dpqv[int(list+1)/2].dp;
				else
					if(pv[int(list+1)/2]==1)
						dpqv[j].dq-=gene_ymatrix[n].data*dpqv[int(list+1)/2].dv2;
				    else
						dpqv[j].dq-=gene_ymatrix[n].data*dpqv[int(list+1)/2].dq;
			}
		}
		for(end=gene_yymatrix[2*j].addres-1,n=gene_yymatrix[2*j-1].addres;n<=end;n++)
		{
			list=gene_ymatrix[n].number;
			if(list%2==1)
				dpqv[j].dp-=gene_ymatrix[n].data*dpqv[int(list+1)/2].dp;
			else
				if(pv[int(list+1)/2]==1)
					dpqv[j].dp-=gene_ymatrix[n].data*dpqv[int(list+1)/2].dv2;
				else
					dpqv[j].dp-=gene_ymatrix[n].data*dpqv[int(list+1)/2].dq;
		}
	}
}

void nlf::amend_voltage()
{
	int i;
	for(i=1;i<=N;i++)
	{
		if(i==NS)continue;
		voltage[i].f-=dpqv[i].dp;
        if(pv[i]==1)
			voltage[i].e-=dpqv[i].dv2;
		else
			voltage[i].e-=dpqv[i].dq;
	}
}
                                         
void nlf::BeginPowerflow()
{

    fscanf(in,"%d %d %d %d",&N,&NS,&number_branch,&number_ground);
	branch=(BRANCH *)calloc((number_branch+1), sizeof(BRANCH));//原始数据存储申请
	if(!branch)EXIT;
    genrt=(GENRT *)calloc((N+1),sizeof(GENRT));
	if(!genrt)EXIT;
	load=(LOAD *)calloc((N+1),sizeof(LOAD));
	if(!load)EXIT;
	ground=(GROUND *)calloc((number_ground+1),sizeof(GROUND));
	if(!ground)EXIT;
    ppv=(int *)calloc((N+1),sizeof(int));
	if(!ppv)EXIT;
	node=(NODE *)calloc((N+1),sizeof(NODE));
	if(!node)EXIT;
	
	pv=(int *)calloc((N+1),sizeof(int));          //节点优化数据
	if(!pv)EXIT;
	o_n=(int *)calloc((N+1),sizeof(int));
	if(!o_n)EXIT;
	n_o=(int *)calloc((N+1),sizeof(int));
	if(!n_o)EXIT;

	y_matrix=(Y_MATRIX *)calloc((number_branch+1),sizeof(Y_MATRIX));//申请导纳阵存储空间
	if(!y_matrix)EXIT;
	yy_matrix=(YY_MATRIX *)calloc((N+2),sizeof(YY_MATRIX));
	if(!yy_matrix)EXIT;

	gene_ymatrix=(GENE_YMATRIX *)calloc((20*number_branch+1),sizeof(GENE_YMATRIX));//申请修正矩阵存储空间
	if(!gene_ymatrix)EXIT;
	gene_yymatrix=(GENE_YYMATRIX *)calloc((2*N+2),sizeof(GENE_YYMATRIX));
    if(!gene_yymatrix)EXIT;	

	dpqv=(PQV *)calloc((N+1),sizeof(PQV));//申请右端向量存储空间
	if(!dpqv)EXIT;
	voltage=(VOLTAGE *)calloc((N+1),sizeof(VOLTAGE));//申请电压存储空间
	if(!voltage)EXIT;
	ab=(AB*)calloc((N+1),sizeof(AB));//申请修正含量aii和bii所用存储空间
	if(!ab)EXIT;       
	
	readdata();
	node_order();
	re_order();
	branch_rank();

	form_ymatrix();
    initia_pqv();
}

void nlf::iterative()
{
	bool mark=true;
	int j;
	double big1,big2;
	iter_number=0;
	while(mark==true)
	{
		initia_dpqv();
        gene_matrix();
        back_solve();
        amend_voltage();
		iter_number++;

     
		if(pv[1]==1)
			big1=(dpqv[1].dp>dpqv[1].dv2)?dpqv[1].dp:dpqv[1].dv2;
		else
			big1=(dpqv[1].dp>dpqv[1].dq)?dpqv[1].dp:dpqv[1].dq;
		for(j=2;j<=N;j++)
		{
			if(pv[j]==1)
				big2=(dpqv[j].dp>dpqv[j].dv2)?dpqv[j].dp:dpqv[j].dv2;
			else
			    big2=(dpqv[j].dp>dpqv[j].dq)?dpqv[j].dp:dpqv[j].dq;
			if(big1<big2)
				big1=big2;
		}
		fprintf(out,"%-12s%-6d%-12s%-15.10lf\n","迭代次数:",iter_number,"最大修正值:",big1);
		if(big1>EPS&&iter_number<8)
			mark=true;
		else
			mark=false;
	}
}

void nlf::result()
{
	int i,new_node;
	PointData module, angle,loss=0.0;	
	fprintf(out,"\n%-12s%-6d%-12s%-15.10lf\n\n","迭代次数:",iter_number,"迭代精度:",EPS);

	fprintf(out,"%-12s%-20s%-21s%-22s%-20s\n\n","节点号","实部电压"," 虚部电压","幅值","角度");
	for(i=1;i<=N;i++)
	{
		new_node=o_n[i];
		module=sqrt(voltage[new_node].e*voltage[new_node].e+voltage[new_node].f*voltage[new_node].f);
		angle=atan(voltage[new_node].f/voltage[new_node].e)/3.1415926*180;
        fprintf(out,"%-10d%-20.6lf%-20.6lf%-20.6lf%-20.6lf\n",i,voltage[new_node].e,
			voltage[new_node].f,module,angle);
	}
    fprintf(out,"\n\n%-10s%-10s%-15s%-15s%-15s%-15s%-15s%-15s\n\n", "i","j","Pij","Qij","Pji","Qji","lossp","lossq");
	for(i=1;i<=number_branch;i++)
	{
		int inode,jnode;
		PointData Pij,Qij,Pji,Qji,LPij,LQij;
		if(branch[i].bk<0)
		{	
			inode=branch[i].i_node;
		    jnode=branch[i].j_node;
			if(inode<0)
			{
				inode=-inode;
				voltage[inode].e=-voltage[inode].e/branch[i].bk;
                voltage[inode].f=-voltage[inode].f/branch[i].bk;
			}
            if(jnode<0)
			{
				jnode=-jnode;
				voltage[jnode].e=-voltage[jnode].e/branch[i].bk;
                voltage[jnode].f=-voltage[jnode].f/branch[i].bk;
			}

	        Pij=voltage[inode].e*(y_matrix[i].Gij*voltage[jnode].e-y_matrix[i].Bij*voltage[jnode].f)
			+voltage[inode].f*(y_matrix[i].Gij*voltage[jnode].f+y_matrix[i].Bij*voltage[jnode].e)
			+(voltage[inode].e*voltage[inode].e+voltage[inode].f*voltage[inode].f)*
			(-y_matrix[i].Gij);
	    	Qij=voltage[inode].f*(y_matrix[i].Gij*voltage[jnode].e-y_matrix[i].Bij*voltage[jnode].f)
			-voltage[inode].e*(y_matrix[i].Gij*voltage[jnode].f+y_matrix[i].Bij*voltage[jnode].e)
			-(voltage[inode].e*voltage[inode].e+voltage[inode].f*voltage[inode].f)*
			(-y_matrix[i].Bij);

	    	inode=abs(branch[i].j_node);//交换节点
	    	jnode=abs(branch[i].i_node);
        	Pji=voltage[inode].e*(y_matrix[i].Gij*voltage[jnode].e-y_matrix[i].Bij*voltage[jnode].f)
			+voltage[inode].f*(y_matrix[i].Gij*voltage[jnode].f+y_matrix[i].Bij*voltage[jnode].e)
			+(voltage[inode].e*voltage[inode].e+voltage[inode].f*voltage[inode].f)*
			(-y_matrix[i].Gij);
		    Qji=voltage[inode].f*(y_matrix[i].Gij*voltage[jnode].e-y_matrix[i].Bij*voltage[jnode].f)
			-voltage[inode].e*(y_matrix[i].Gij*voltage[jnode].f+y_matrix[i].Bij*voltage[jnode].e)
			-(voltage[inode].e*voltage[inode].e+voltage[inode].f*voltage[inode].f)*
			(-y_matrix[i].Bij);
	    	LPij=Pij+Pji;
	     	LQij=Qij+Qji;

			inode=branch[i].i_node;
		    jnode=branch[i].j_node;
			if(inode<0)
			{
				inode=-inode;
				voltage[inode].e=-voltage[inode].e*branch[i].bk;
                voltage[inode].f=-voltage[inode].f*branch[i].bk;
			}
            if(jnode<0)
			{
				jnode=-jnode;
				voltage[jnode].e=-voltage[jnode].e*branch[i].bk;
                voltage[jnode].f=-voltage[jnode].f*branch[i].bk;
			}
		}
		else 
		{
	    	inode=branch[i].i_node;
	    	jnode=branch[i].j_node;
        	Pij=voltage[inode].e*(y_matrix[i].Gij*voltage[jnode].e-y_matrix[i].Bij*voltage[jnode].f)
			+voltage[inode].f*(y_matrix[i].Gij*voltage[jnode].f+y_matrix[i].Bij*voltage[jnode].e)
			+(voltage[inode].e*voltage[inode].e+voltage[inode].f*voltage[inode].f)*
			(-y_matrix[i].Gij);
	    	Qij=voltage[inode].f*(y_matrix[i].Gij*voltage[jnode].e-y_matrix[i].Bij*voltage[jnode].f)
			-voltage[inode].e*(y_matrix[i].Gij*voltage[jnode].f+y_matrix[i].Bij*voltage[jnode].e)
			-(voltage[inode].e*voltage[inode].e+voltage[inode].f*voltage[inode].f)*
			(-y_matrix[i].Bij+branch[i].bk);

	    	inode=branch[i].j_node;//交换节点
	    	jnode=branch[i].i_node;
        	Pji=voltage[inode].e*(y_matrix[i].Gij*voltage[jnode].e-y_matrix[i].Bij*voltage[jnode].f)
			+voltage[inode].f*(y_matrix[i].Gij*voltage[jnode].f+y_matrix[i].Bij*voltage[jnode].e)
			+(voltage[inode].e*voltage[inode].e+voltage[inode].f*voltage[inode].f)*
			(-y_matrix[i].Gij);
	    	Qji=voltage[inode].f*(y_matrix[i].Gij*voltage[jnode].e-y_matrix[i].Bij*voltage[jnode].f)
			-voltage[inode].e*(y_matrix[i].Gij*voltage[jnode].f+y_matrix[i].Bij*voltage[jnode].e)
			-(voltage[inode].e*voltage[inode].e+voltage[inode].f*voltage[inode].f)*
			(-y_matrix[i].Bij+branch[i].bk);
	    	LPij=Pij+Pji;
	    	LQij=Qij+Qji;
		}
		inode=abs(branch[i].i_node);
		jnode=abs(branch[i].j_node);
        fprintf(out,"%-10d%-10d%-15f%-15f%-15f%-15f%-15f%-15f\n",  n_o[inode],n_o[jnode],Pij,Qij,Pji,Qji,LPij,LQij);
		loss+=LPij;
	}
	 fprintf(out,"\n\n%10s%f\n","全网有功损耗",loss);
}
void nlf::free_point()
{
	free(pv);
	free(ppv);
	free(o_n);
	free(n_o);	
    free(branch);
    free(genrt);
    free(load); 
    free(ground);
    free(voltage); 
    free(dpqv); 
    free(y_matrix);  
    free(yy_matrix);  
    free(gene_ymatrix);  
    free(gene_yymatrix); 
    free(ab); 
}

⌨️ 快捷键说明

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