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

📄 nflow_sub.cpp

📁 电力系统潮流程序adsfasdfasfd
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//	   netbus_->PLAST_LN2[j]=(1000.0/1.732)*sqrt(netbus_->W_LN2[j]*netbus_->W_LN2[j]+netbus_->R_LN2[j]*netbus_->R_LN2[j])/netbus_->KV_BS[netbus_->I$BS_ND[netparm_->I$ND_LN[i]-1]-1];
//	  }
//	 }
//	 if(netbus_->KV_BS[netbus_->I$BS_ND[netparm_->Z$ND_LN[i]-1]-1]>20.001){
//	  if(fabs(netbus_->W_LN2[k])>0.01||fabs(netbus_->R_LN2[k])>0.01){
//	   netbus_->PLAST_LN2[k]=(1000.0/1.732)*sqrt(netbus_->W_LN2[k]*netbus_->W_LN2[k]+netbus_->R_LN2[k]*netbus_->R_LN2[k])/netbus_->KV_BS[netbus_->I$BS_ND[netparm_->Z$ND_LN[i]-1]-1];
//	  }
//	 }
//	}
//	
//	for(i=0;i<netmom_->LV$XF;i++) {
//	 j=netparm_->I$XF2_XF[i]-1;
//	 k=netparm_->Z$XF2_XF[i]-1;
//	 netbus_->PLAST_XF2[j]=0.0;
//	 netbus_->PLAST_XF2[k]=0.0;
//	 if(netbus_->KV_BS[netbus_->I$BS_ND[netparm_->I$ND_XF[i]-1]-1]>2.001){
//	  if(fabs(netbus_->W_XF2[j])>0.01||fabs(netbus_->R_XF2[j])>0.01){
//	   netbus_->PLAST_XF2[j]=(1000.0/1.732)*sqrt(netbus_->W_XF2[j]*netbus_->W_XF2[j]+netbus_->R_XF2[j]*netbus_->R_XF2[j])/netbus_->KV_BS[netbus_->I$BS_ND[netparm_->I$ND_XF[i]-1]-1];
//	  }
//	 }
//	 if(netbus_->KV_BS[netbus_->I$BS_ND[netparm_->Z$ND_XF[i]-1]-1]>2.001){
//	  if(fabs(netbus_->W_XF2[k])>0.01||fabs(netbus_->R_XF2[k])>0.01){
//	   netbus_->PLAST_XF2[k]=(1000.0/1.732)*sqrt(netbus_->W_XF2[k]*netbus_->W_XF2[k]+netbus_->R_XF2[k]*netbus_->R_XF2[k])/netbus_->KV_BS[netbus_->I$BS_ND[netparm_->Z$ND_XF[i]-1]-1];
//	  }
//	 }
//	}
//	
	return RET_FA;
}

void pf_setdef()
{
	
	SBS=100.0;
	IT=0;//ITER_NUM
	

	eps_set=0.0005;//0.000005;//收敛偏差
	eps_max=5000.0;//发散计算偏差
	
	FLATSTRT=1;
	DYN_FLAG=1;//1;//动态潮流,0:静态潮流
	OPT_FLAG=0;
	SYS_DIM=2;
	NEWT_FLAG=1;
}

int pf_businjections(int NOWISLAND)
{
	pf_form_bsinjection(NOWISLAND);//BS注入,有名
	pf_form_businjection(NOWISLAND);//BUS注入,标幺
	pf_set_initvalue(NOWISLAND);//设置计算值初始值
	pf_form_busvolt(NOWISLAND);//根据调压设置的固定电压设置参考节点和PV节点的V的计算初始值

	return RET_OK;	
}

int pf_form_bsinjection(int NOWISLAND)//BS注入,有名
{
	int I;
	
//	printf("begin ps_form_bsinjection()\n");
//	printf("NOWISLAND=%d\n",NOWISLAND);
	
	for(I=0;I<lv_bs;I++)
	{
		if(map_bs[I].AC_island==NOWISLAND)
		{
			map_bs[I].p=0.0;
			map_bs[I].q=0.0;
		}
	}
//	print_debug_info(16);
//	print_debug_info(17);
	
	for(I=0;I<lv_map_ACun;I++)
	{
//	 	printf("map_ACun[%d]:ibs==%d,p==%f,q==%f\n",I,map_ACun[I].ibs,map_ACun[I].p,map_ACun[I].q);

	 if(map_ACun[I].ibs>0)
	 {
	 	
//	 	printf("map_ACun[%d].AC_island==%d\n",I,map_bs[map_ACun[I].ibs-1].AC_island);
	  if(map_bs[map_ACun[I].ibs-1].AC_island==NOWISLAND)
	  {
			map_bs[map_ACun[I].ibs-1].p=map_bs[map_ACun[I].ibs-1].p+map_ACun[I].p;//老程序为+CW_UN[i]??
			map_bs[map_ACun[I].ibs-1].q=map_bs[map_ACun[I].ibs-1].q+map_ACun[I].q;//
	  } 
	 }
	} 
	
//	printf("\n\n\n\n");
	for(I=0;I<lv_map_ACld;I++)
	{
//	 	printf("map_ACld[%d]:ibs==%d,p==%f,q==%f\n\n",I,map_ACun[I].ibs,map_ACld[I].p,map_ACld[I].q);
	 if(map_ACld[I].ibs>-1)
	 {
//	 	printf("map_ACld[%d].AC_island==%d\n",I,map_bs[map_ACld[I].ibs-1].AC_island);


	  if(map_bs[map_ACld[I].ibs-1].AC_island==NOWISLAND)
	  {
			map_bs[map_ACld[I].ibs-1].p=map_bs[map_ACld[I].ibs-1].p-map_ACld[I].p;
			map_bs[map_ACld[I].ibs-1].q=map_bs[map_ACld[I].ibs-1].q-map_ACld[I].q;
	  } 
	 } 
	} 
	
  //虚负荷XLD和电容RC

	return RET_OK;	
		
}

int pf_form_businjection(int NOWISLAND)//BUS注入,标幺
{
	int I;

  for(I=0;I<lv_bus;I++)
  {
  	map_bus[I].Pi=0.0;
  	map_bus[I].Qi=0.0;
  }
  
  for(I=0;I<lv_bs;I++)
  {
  	if(map_bs[I].AC_island==NOWISLAND)
  	{
  		map_bus[map_bs[I].ibus].Pi=map_bus[map_bs[I].ibus].Pi+map_bs[I].p/SBS;//为什么不是直接==?
  		map_bus[map_bs[I].ibus].Qi=map_bus[map_bs[I].ibus].Qi+map_bs[I].q/SBS;
  	}
  }

	return RET_OK;	
}

int pf_set_initvalue(int NOWISLAND)//设置计算值初始值
{
	
	int I;

	if(FLATSTRT==1) 
	{//平值启动,取初始值
	  for(I=0;I<lv_bus;I++)
	  {
	  	map_bus[I].v_pu=1.0;
	  	map_bus[I].a_pu=0.0;
	  }
//ADD BY DHW 07.07.05 BEGIN
		for(I=0;I<lv_map_ACun;I++)
		{
		 	printf("map_ACun[%d]:ibs==%d,p==%f,q==%f\n",I,map_ACun[I].ibs,map_ACun[I].p,map_ACun[I].q);
			if(map_ACun[I].vset>0.5&&map_ACun[I].vset<1.5)
			{			
				map_bus[map_bs[map_ACun[I].ibs-1].ibus].v_pu=map_ACun[I].vset;
				printf("v_set==%f\n",map_ACun[I].vset);
			}
		}
//ADD BY DHW 07.07 END 	  
	}
	else if(FLATSTRT==0) 
	{//取上次计算值,作为初始值开始计算,需要补充内容
		
	}	
	return RET_OK;	
		
}

int pf_form_busvolt(int NOWISLAND)//根据调压设置的固定电压设置参考节点和PV节点的V的计算初始值
{
//根据调压设置的固定电压设置参考节点和PV节点的V的计算初始值
	int I;
	

	//平衡节点,以后调试
//	printf("slack node: map_ACun[%d].vset==%f, vt_no==%d,  vbase==%f \n\n",ref_bs_un,map_ACun[ref_bs_un].vset,map_ACun[ref_bs_un].vt_no,map_vt[map_ACun[ref_bs_un].vt_no-1].vbase);
	
//	if(map_vt[map_ACun[ref_bs_un].vt_no-1].vbase>0.00001)
//	{
//		map_bus[lv_bus-1].v_pu=map_ACun[ref_bs_un].vset/map_vt[map_ACun[ref_bs_un].vt_no-1].vbase;
//		printf("111:\n");
//	}
	
	if(map_bus[lv_bus-1].v_pu<0.9||map_bus[lv_bus-1].v_pu>1.1)
	{
		map_bus[lv_bus].v_pu=1.0;
	}		


	//PV,对于此处,以后还要调试!!!
	for(I=0;I<NOV;I++)
	{
//		if(lv_pv_rel_un[I]>0&&map_vt[map_ACun[pv_rel_un[I][0]].vt_no-1].vbase>0.00001)
//		{
//			map_bus[map_bs[REGS[I]].ibus].v_pu=map_ACun[pv_rel_un[I][0]].vset/map_vt[map_ACun[pv_rel_un[I][0]].vt_no-1].vbase;
//			printf("22222222222222222,map_bus[%d].v_pu==%f,,vbase==%f,\n",map_bs[REGS[I]].ibus,map_bus[map_bs[REGS[I]].ibus].v_pu,map_vt[map_ACun[pv_rel_un[I][0]].vt_no-1].vbase);
//		}
//		
		if(map_bus[map_bs[REGS[I]].ibus].v_pu<0.9||map_bus[map_bs[REGS[I]].ibus].v_pu>1.1)
		{
			map_bus[map_bs[REGS[I]].ibus].v_pu=1.0;
		}		
	}
	return RET_OK;	
		
}

void pf_clear_iter(int NOWISLAND)
{
	int I;

	IT=0;

	for(I=0;I<MAX_ITER;I++)
	{
		MXP_ITER[I]=0.0;//有功
		MXQ_ITER[I]=0.0;//无功
		MXPBUS_ITER[I]=0;
		MXQBUS_ITER[I]=0;
	}
}

int	cjpq_newton(int NOWISLAND)
{
//基本原理见电力系统计算P542	
//C[]:功率偏差,dPi和dQi	
  int I,J,JSQ;
  float EI,VI,A8,B8,VJ,AN,C8,D8,AI,BI,CI,DI;

  for(I=0;I<lv_bus;I++)
  {
	  C[2*I]=0.0;
	  C[2*I+1]=0.0;
	  B9[2*I]=0.0;
	  B9[2*I+1]=0.0;
  }	

//PQ==>PV==>VO顺序排列节点
  for(I=0;I<lv_bus;I++)
  {
//		printf("*********BUS_NO==%d**********************\n",I);
	  EI=map_bus[I].v_pu;//vi
	  VI=EI*EI;//vi*vi
	  A8=Ym[I].g.val*VI;//A8=Gii*vi*vi
	  B8=Ym[I].b.val*VI;//B8=Bii*vi*vi
//		printf("G%d,%d==%f,B%d,%d==%f\n",I,I,Ym[I].g.val,I,I,Ym[I].b.val);
//		printf("A8:Gii*vi*vi==%f,	B8:Bii*vi*vi==%f\n\n",A8,B8);


	 	C[2*I]=C[2*I]+A8;//对角元产生的Pi:Gii*vi*vi,节点功率
	  C[2*I+1]=C[2*I+1]-B8;//对角元产生的Qi:-Bii*vi*vi
//  	printf("C[%d]=%f,  C[%d]==%f \n",2*I,C[2*I],2*I+1,C[2*I+1]);
	  
	  matrix_jacb_newton[I].DJ_CJPQ[0]=B8;//Bii*vi*vi,DJ_CJPQ:放对角元值
		matrix_jacb_newton[I].DJ_CJPQ[1]=B8;//Bii*vi*vi
		matrix_jacb_newton[I].DJF_CJPQ[0]=-A8;//-Gii*vi*vi,DJF_CJPQ:放对角元值
		matrix_jacb_newton[I].DJF_CJPQ[1]=A8;//Gii*vi*vi
		
//		printf("matrix_jacb_newton[%d].DJ_CJPQ[0]==%f, 	matrix_jacb_newton[%d].DJ_CJPQ[1]=%f\n",I,matrix_jacb_newton[I].DJ_CJPQ[0],I,matrix_jacb_newton[I].DJ_CJPQ[1]);
//		printf("matrix_jacb_newton[%d].DJF_CJPQ[0]==%f, matrix_jacb_newton[%d].DJF_CJPQ[1]=%f\n",I,matrix_jacb_newton[I].DJF_CJPQ[0],I,matrix_jacb_newton[I].DJF_CJPQ[1]);

	  for(JSQ=0;JSQ<Ym[I].lv_nz;JSQ++)
	  {

			J=Ym[I].nz[JSQ].j;//列指

//	  	printf("I==%d,J==%d\n",I,J);
//	 	 	printf("G%d,%d=%f,  B%d,%d=%f \n",I,J,Ym[I].nz[JSQ].g.val,I,J,Ym[I].nz[JSQ].b.val);

	    VJ=EI*map_bus[J].v_pu;//VJ=vi*vj
	    AN=map_bus[I].a_pu-map_bus[J].a_pu;//节点i和j的角度差: Oij

	    C8=VJ*Ym[I].nz[JSQ].g.val;//C8=vi*vj*Gij,    
	    D8=VJ*Ym[I].nz[JSQ].b.val;//D8=vi*vj*Bij
	    A8=AN*(1.0-AN*AN/6.0);//sinOij
	    B8=1.0-AN*AN*(1.0-AN*AN/12.0)/2.0;//cosOij
			
	    AI=B8*C8;//AI=cosOij*(vi*vj*Gij)
	    BI=A8*D8;//BI=sinOij*(vi*vj*Bij)
	    CI=A8*C8;//CI=sinOij*(vi*vj*Gij)
	    DI=B8*D8;//DI=cosOij*(vi*vj*Bij)
//			printf("AI=cosOij*(vi*vj*Gij)==%f,  BI=sinOij*(vi*vj*Bij)==%f,  CI=sinOij*(vi*vj*Gij)==%f,  cosOij*(vi*vj*Bij)==%f \n",AI,BI,CI,DI);		
	
//	  	printf("C[%d]=%f,  C[%d]==%f, C[%d]==%f,  C[%d]==%f \n",2*I,C[2*I],2*I+1,C[2*I+1],2*J,C[2*J],2*J+1,C[2*J+1]);
	  	C[2*I]=C[2*I]+AI+BI;//Pi,本端节点有功:Oij
	  	C[2*I+1]=C[2*I+1]+CI-DI;//Qi,本端节点无功:Oij
	  	C[2*J]=C[2*J]+AI-BI;//Pj,对端节点有功:Oij=-Oji
	  	C[2*J+1]=C[2*J+1]-CI-DI;//Qj,对端节点无功:Oij=-Oji
	
//	  	printf("C[%d]=%f,  C[%d]==%f, C[%d]==%f,  C[%d]==%f \n",2*I,C[2*I],2*I+1,C[2*I+1],2*J,C[2*J],2*J+1,C[2*J+1]);
			
	    matrix_jacb_newton[I].EJU_CJPQ[JSQ*2]=-CI+DI;//Hij, -sinOij*(vi*vj*Gij)+cosOij*(vi*vj*Bij),有了Hij可以推导出Lij
	    matrix_jacb_newton[I].EJU_CJPQ[JSQ*2+1]=-AI-BI;//Nij, dQi/dVj,-cosOij*(vi*vj*Gij)-sinOij*(vi*vj*Bij),有了Nij可以得到Jij
//			printf("H%d,%d=-sinOij*(vi*vj*Gij)+cosOij*(vi*vj*Bij)==%f,    N%d,%d=-cosOij*(vi*vj*Gij)-sinOij*(vi*vj*Bij)==%f\n",I,J,matrix_jacb_newton[I].EJU_CJPQ[JSQ*2],I,J,matrix_jacb_newton[I].EJU_CJPQ[JSQ*2+1]);

	    matrix_jacb_newton[I].EJL_CJPQ[JSQ*2]=CI+DI;//Hji,取-Oij,表示对角转置的值(下三角),sinOij*(vi*vj*Gij)+cosOij*(vi*vj*Bij)=-(sinOji*(vi*vj*Gij))+cosOji*(vi*vj*Bij)
	    matrix_jacb_newton[I].EJL_CJPQ[JSQ*2+1]=AI-BI;//Jji,取-Oij,表示对角转置的值(下三角),cosOij*(vi*vj*Gij)-sinOij*(vi*vj*Bij)=cosOji*(vi*vj*Gij)+sinOji*(vi*vj*Bij)
//			printf("H%d,%d=sinOij*(vi*vj*Gij)+cosOij*(vi*vj*Bij)==%f,    J%d,%d=cosOij*(vi*vj*Gij)-sinOij*(vi*vj*Bij)==%f\n",J,I,matrix_jacb_newton[I].EJL_CJPQ[JSQ*2],J,I,matrix_jacb_newton[I].EJL_CJPQ[JSQ*2+1]);
			
		}

//		printf("C[%d]=%f, C[%d]=%f\n",2*I,C[2*I],2*I+1,C[2*I+1]);

	  matrix_jacb_newton[I].DJ_CJPQ[0]=matrix_jacb_newton[I].DJ_CJPQ[0]+C[2*I+1];//Hii,Bii*vi*vi+Qi
	  matrix_jacb_newton[I].DJ_CJPQ[1]=matrix_jacb_newton[I].DJ_CJPQ[1]-C[2*I+1];//Lii,Bii*vi*vi-Qi
	  matrix_jacb_newton[I].DJF_CJPQ[0]=matrix_jacb_newton[I].DJF_CJPQ[0]-C[2*I];//Nii,-Gii*vi*vi-Pi
	  matrix_jacb_newton[I].DJF_CJPQ[1]=matrix_jacb_newton[I].DJF_CJPQ[1]-C[2*I];//Jii,Gii*vi*vi-Pi
//		printf("matrix_jacb_newton[%d].DJ_CJPQ[0]==%f, matrix_jacb_newton[%d].DJ_CJPQ[1]=%f\n",I,matrix_jacb_newton[I].DJ_CJPQ[0],I,matrix_jacb_newton[I].DJ_CJPQ[1]);
//		printf("matrix_jacb_newton[%d].DJF_CJPQ[0]==%f, matrix_jacb_newton[%d].DJF_CJPQ[1]=%f\n",I,matrix_jacb_newton[I].DJF_CJPQ[0],I,matrix_jacb_newton[I].DJF_CJPQ[1]);

//		printf("*******************************\n\n");
	}


	for(I=0;I<lv_bus;I++)
	{
		B9[2*I]=C[2*I];//Pi,节点结算功率
		B9[2*I+1]=C[2*I+1];//Qi,节点计算功率

//		printf("map_bus[%d].Pi=%f, P%d=%f\n",I,map_bus[I].Pi,I,C[2*I]);
//		printf("map_bus[%d].Qi=%f, Q%d=%f\n",I,map_bus[I].Qi,I,C[2*I+1]);

  	C[2*I]=map_bus[I].Pi-C[2*I];//功率偏差,DPi
  	C[2*I+1]=map_bus[I].Qi-C[2*I+1];//功率偏差,DQi
//DEBUG
//		if(fabs(B9[2*I])>0.00001&&fabs(B9[2*I+1])>0.00001&&(C[2*I]/B9[2*I]>1||C[2*I+1]/B9[2*I+1]>1))
//		{	
//			printf("111:node_dp[%d]=%f, node_dq[%d]=%f\n",I,C[2*I]/B9[2*I],I,C[2*I+1]/B9[2*I+1]);
//			printf("111:dp[%d]=%f, dq[%d]=%f\n",I,C[2*I],I,C[2*I+1]);
//			printf("\n");
//		}
//DEBUG
	
//		printf("\n");
  
  }
	find_eps_max(NOWISLAND);
  
	return RET_OK;	
}

int	find_eps_max(int NOWISLAND)
{
	int I;
//	printf("找最大功率偏差节点!\n");
	if(DYN_FLAG==0)
	{//非动态潮流
		MXP_ITER[IT]=0.0;
	
			
    for(I=0;I<lv_bus-1;I++)
    {//PQ和PV节点计算P偏差,不考虑平衡节点
			if(fabs(C[2*I])>fabs(MXP_ITER[IT]))
			{
				MXP_ITER[IT]=C[2*I];//MXW_ITER:计算的最大有功偏差
				MXPBUS_ITER[IT]=I+1;//最大有功偏差的节点
			}
		}
		
//		printf("max_dp==%f,bus_no==%d\n",MXP_ITER[IT],MXPBUS_ITER[IT]);
		MXQ_ITER[IT]=0.0;
		for(I=0;I<lv_bus-NOV-1;I++)
		{//PQ节点考虑Q偏差,只考虑PQ节点,而PV和VO节点不计算dq
			if(fabs(C[2*I+1])>fabs(MXQ_ITER[IT]))
			{
				MXQ_ITER[IT]=C[2*I+1];//MXW_ITER:最大Q偏差
				MXQBUS_ITER[IT]=I+1;
			}
		}
//		printf("max_dq==%f,bus_no==%d\n",MXQ_ITER[IT],MXQBUS_ITER[IT]);
	}
	return RET_OK;	

}

int fact_newton(int NOWISLAN)
{
  int i,MX,MA,J,K,I,JSQ,J1;
  int flag;
  float AI,BI;
	float B1[2000],B2[2000];

  for(I=0;I<2*lv_bus;I++)
  {
  	matrix_fact_newton[I].UD_FACT=0.0;
  	matrix_fact_newton[I].lv_nz=0;	
//DEBUG 
  	for(J=0;J<2*lv_bus;J++)
  	{
  		matrix_fact_newton[I].nz[J].j=-1;
  		matrix_fact_newton[I].nz[J].UU_FACT=0.0;
   		matrix_fact_newton[I].nz[J].UL_FACT=0.0;	
  	}
//DEBUG  	
  }
  
  
//节点号由小到大:按PQ==>PV==>VO排序
//MA:初始设置MA=1

  MA=1;//P/Q计算标志
//  MX=0;//表示节点号(行)

	for(K=0;K<2*lv_bus;K++)
	{//循环整个雅可比矩阵
		flag=0;
//		printf("\n\n");
//		printf("****************K=%d************\n",K);
		MX=K/2;   
  	if((fabs(Ym[MX].g.val)>0.00001)||(fabs(Ym[MX].b.val)>0.00001))
  	{ 
      if(MX==lv_bus-1)
      {	//平衡VO节点
      	if(MA==1)
      	{//P	
      		MA=0;
				}
        else if(MA!=1)
        {//Q
//    			if(typ_bs[map_bus[MX].ibs]!=BS_TYPE_PQ)
    			if(map_bs[map_bus[MX].ibs].bs_type!=BS_TYPE_PQ)
    			{
//		        MX=MX+1;
		        MA=1;
					}
					else
					{
    				MA=1;
    				flag=1;
        	}
    		}
    	}
      else if(MX!=lv_bus-1)
      {
      	//非平衡VO节点
      	flag=1;

⌨️ 快捷键说明

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