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

📄 end1000.c.txt

📁 用于计算潮流程序的可视化化软件 希望对大家有用
💻 TXT
📖 第 1 页 / 共 2 页
字号:
/** 																		      	*/
/*******************************形成不计接地电容,计入支路电阻的有功导纳阵*********************************/
	  for(i=1;i<=N;i++)
	 {
	      Yii[i].G=0;        /*初始化清零*/
	      Yii[i].B=0;
	      NYsum1[i]=0;
		}

    for(n=1;n<=Nb;n++)
		 {
						i=abs(Branch[n].i);
						j=abs(Branch[n].j);
						R=Branch[n].R;
						X=Branch[n].X;
						YK=Branch[n].YK;

						Zmag2=R*R+X*X;
						Gij=R/Zmag2;
						Bij=-X/Zmag2;               /*由阻抗计算导纳*/

		    /***************互导纳**************/
				if(Branch[n].i<0||Branch[n].j<0)/*判断是否为变压器支路*/
				      {
						Yij[n].G=-Gij/YK;
						Yij[n].B=-Bij/YK;
					   }
				else
				      {
					    Yij[n].G=-Gij;
						Yij[n].B=-Bij;
					   }
				 Yij[n].j=j;

			  /**************************自导纳******************************/
				if(Branch[n].i<0||Branch[n].j<0)/*再次判断是否为变压器支路*/
					   {
						Yii[i].G=Yii[i].G+Gij/YK;
						Yii[i].B=Yii[i].B+Bij/YK;
						Yii[j].G=Yii[j].G+Gij/YK;
						Yii[j].B=Yii[j].B+Bij/YK;   /*形成B'时用*/
						}
				 else
				       {
					    Yii[i].G=Yii[i].G+Gij;
						Yii[i].B=Yii[i].B+Bij;
						Yii[j].G=Yii[j].G+Gij;
						Yii[j].B=Yii[j].B+Bij;   /*形成B'时用*/					
					}

				  NYsum1[i]++;
			  }/*for的括号*/

		  NYseq1[1]=1;

			for(i=1;i<=N-1;i++)
			NYseq1[i+1]=NYseq1[i]+NYsum1[i];

	/********************************形成因子表1*****************************
	***一定用f4中未追加接地支路时的Yii,Yij数组的值,抛掉了与有功无关的接地***
	***支路,要及时形成!
	***追加接地支路的最完整的导纳阵暂时用不上,在求功率误差时才用到**********/ 
    for(i=1;i<=N-1;i++)
     {
     	   for(count=i+1;count<=N-1;count++)
     	   	 		B[count]=0;
				B[i]=Yii[i].B;      /*A框*/

			for(count=NYseq1[i];count<=NYseq1[i+1]-1;count++)
					{
						j=Yij[count].j;
						B[j]=Yij[count].B;/*B框*/              /*从有功导纳阵中取数*/
						}

	      n_u=1;                 /*D框*/
	      i_above=1;

			for(i_above=1;i_above<=i-1;i_above++)
					{
						for(count=1;count<=NUsum1[i_above];count++)
								{
									if(U1[n_u].j!=i)                  /*没初始化就用了U1,可能会有问题!!*/
											n_u++;
									else goto next1;
									}/*for's*/
						goto next2;
			next1:Btempt=U1[n_u].value/D1[i_above];

					  for(;count<=NUsum1[i_above];count++)/*count初值必须继承上面的,而不是1!*/
							{
     	   	 			  			j=U1[n_u].j;
     	   	 			  			B[j]=B[j]-Btempt*U1[n_u].value;
								n_u++;
     	   	 			  			}	
					   goto next2;
					 next2:;                   /*一条空语句!!!*/
						}/*for's*/
     	   	  
		   Btempt=1.0/B[i];
     	   	   D1[i]=Btempt;
     	   	   count=0;

     	   	   for(j=i+1;j<=N-1;j++)
     	   	   			{
     	   	   				if(B[j]!=0)
								{
									U1[n_u].value=B[j]*Btempt;
									U1[n_u].j=j;
     	   	   							count++;
									n_u++;
     	   	   							}	
						}
     	   	   NUsum1[i]=count;				
     	   	   
	}/*for's*/

/**************************************fb1结束****************************************/

/************************追加接地支路形成完整节点导纳阵开始***************************/
/***************************追加接地支路,只影响自导纳***************************/
	for(n=1;n<=Nb;n++)
		{
			i=Branch[n].i;
			j=Branch[n].j;
			YK=Branch[n].YK;   /*赋循环初值*/

			if(i<0||j<0)    /*判断有无变压器支路*/
				{
				if(i<0)
					{
					      i=abs(i);  /*书上印错!!!*/

					      Gij=Yij[n].G;
					      Bij=Yij[n].B;    /*B'*/

					      /*i节点侧*/
					      Yii[i].G=Yii[i].G+(1.0-1.0/YK)*Gij;
					      Yii[i].B=Yii[i].B+(1.0-1.0/YK)*Bij;	    /*B'*/

					      /*j节点侧*/
					      Yii[j].G=Yii[j].G+(1.0-YK)*Gij;
					      Yii[j].B=Yii[j].B+(1.0-YK)*Bij;	    /*B'*/
					  }/*if i<0*/
				else
				    {
					     j=abs(j);

					     Gij=Yij[n].G;
		  		         Bij=Yij[n].B;    /*B'*/

		  		         /*j节点侧*/
		  		         Yii[j].G=Yii[j].G+(1.0-1.0/YK)*Gij;
					 Yii[j].B=Yii[j].B+(1.0-1.0/YK)*Bij;	    /*B'*/
		  		   
		  		         /*i节点侧*/
		  		         Yii[i].G=Yii[i].G+(1.0-YK)*Gij;
					 Yii[i].B=Yii[i].B+(1.0-YK)*Bij;	    /*B'*/
				}/*else i<0*/
				 }/*if i<0,j<0*/
		  		 else   /*无变压器支路*/
				    {
		  		    	Bij=YK;
				       /*假设为集中参数电路,导纳均分给i,j两节点*/

		  		    	Yii[i].B=Yii[i].B+Bij;
					Yii[j].B=Yii[j].B+Bij;    /*B';i,j上分别加*/
		  		    	} /*else 无变压器*/
	  }/*for的*/
/************************追加接地支路形成完整节点导纳阵结束***************************/  	                  
  	                  
/***************************************f13开始******************************************/
/**																					*****/
/**	                              给节点电压赋初值 			       				  	*****/
/**																					*****/
for(i=1;i<=N-1;i++)
		{
		  NodeVoltage[i].V=V0;
		  NodeVoltage[i].theta=0.0;
		 }
for(n=1;n<=Npv;n++)
		{
		  i=PVNode[n].i;
		  NodeVoltage[i].V=PVNode[n].V;
		 }
NodeVoltage[N].V=V_Slack;
/***************************************f13结束******************************************/

/*******************************************************主循环开始******************************************************/
timer=0;
flag=1;
do
{

/*****************************************f12开始*****************************************/
/**                                    求各节点功率                                    ***/
/**                                    			                                       ***/
		for(i=1;i<=N;i++)
		 NodePower[i][flag]=0.0;/*初始化,P Q 全部清0*/

		for(i=1;i<=N;i++)
		{
			Vi=NodeVoltage[i].V;
						/*对角元素的影响*/
				if(flag==1)
					A=Yii[i].G;  /*p中 V平方*G,从完整导纳阵中取数*/
				else
					A=-Yii[i].B ; /*q中-V平方*B*/

				NodePower[i][flag]=NodePower[i][flag]+Vi*Vi*A;

				if(i!=N)                  /*与书上不同,改了!!!*/
				{
						for(n=NYseq1[i];n<=NYseq1[i+1]-1;n++)
						{
								if(flag==1)
								{
										A=Yij[n].G;
										C=Yij[n].B;
								 }
								else
								{
										A=-Yij[n].B;/*书上又因错了 */
										C=Yij[n].G;
								 }

								j=Yij[n].j;          /*取出G,B,j*/

								VV=Vi*NodeVoltage[j].V;      /*Vi*Vj*/
								theta=NodeVoltage[i].theta-NodeVoltage[j].theta;/*delta_theta*/
								A=A*VV*cos(theta);/*还好cos sin函数中的参数为弧度,不用转化为度*/
								C=C*VV*sin(theta);
								NodePower[i][flag]=NodePower[i][flag]+A+C;
								NodePower[j][flag]=NodePower[j][flag]+A-C;
						}
					}
				else break;             /*等于N时直接跳出循环。连接下面*/
		} /*for's*/

/*****************************************f12结束*****************************************/

/*****************************************f14开始*****************************************/
/**                                 求各节点功率偏差量                                 ***/
/**                                    求最大功率误差		                           ***/
		i=1;
		n_pv=1;
		i_pv=PVNode[1].i;
		MaxError=0.0;	    /*初始化*/
	for(i=1;i<=N;i++)
		{
			Vi=NodeVoltage[i].V;
			if(flag==1)
				  Wi=Node[i].P_G+Node[i].P_L-NodePower[i][1];
			else
				  Wi=Node[i].Q_G+Node[i].Q_L-NodePower[i][2];

			if(i==N)break;	                    /*此处的break跳出for循环!*/
			else
				{
					if(flag==2&&i==i_pv)
						{
							n_pv++;
							i_pv=PVNode[n_pv].i;
							DI[i]=0;
						}

					else
						{
							if((Wi>MaxError)||(-Wi>MaxError))
								MaxError=((Wi>-Wi)?Wi:-Wi);/*书上错了,没考虑abs函数返回为int*/

							DI[i]=Wi/Vi;
						}
				}

	    }/*for's*/
/*****************************************f14结束*****************************************/

if(flag==1)
{
/*****************************************用因子表1解方程开始*********************************/
		n_u=1;
		for(i=1;i<=N-1;i++)
			{
				DItemp=DI[i];
				for(count=1;count<=NUsum1[i];count++)
					{
						j=U1[n_u].j;
						DI[j]=DI[j]-DItemp*U1[n_u].value;
						n_u++;
					}
				DI[i]=DItemp*D1[i];
			}
		for(i=N-1;i>=1;i--)
			{
				DItemp=DI[i];
				for(count=1;count<=NUsum1[i];count++)
					{
						n_u--;
						j=U1[n_u].j;
						DItemp=DItemp-DI[j]*U1[n_u].value;
					}
					DI[i]=DItemp;
			}

/*************************************用因子表1解方程结束****************************************/
}
else
{
/*************************************用因子表2解方程开始****************************************/
		n_u=1;
			for(i=1;i<=N-1;i++)
			{
				DItemp=DI[i];
				for(count=1;count<=NUsum2[i];count++)
					{
						j=U2[n_u].j;
						DI[j]=DI[j]-DItemp*U2[n_u].value;
						n_u++;
					}
				DI[i]=DItemp*D2[i];
			}
		for(i=N-1;i>=1;i--)
			{
				DItemp=DI[i];
				for(count=1;count<=NUsum2[i];count++)
					{
						n_u--;
						j=U2[n_u].j;
						DItemp=DItemp-DI[j]*U2[n_u].value;
					}
					DI[i]=DItemp;
			}
/*************************************用因子表2解方程结束****************************************/
}

/***************************************f15开始*************************************/
/***************************统一进行修正(内含flag=1或2时)****************************/
/**                          平衡节点V&角 定死了,不参加修正                     *****/

		/*正式进行修正运算*/
			for(i=1;i<=N;i++)
				{
					if(flag==1)
					{
						Dtheta=DI[i]/V0;      /*重大疑惑:书上对PV节点修正时也除以1.0,并非除以1.05*/
						NodeVoltage[i].theta=NodeVoltage[i].theta-Dtheta;
						Theta[i]=NodeVoltage[i].theta/3.1415926*180;
					}
				    else
					{
						DV=DI[i];
						NodeVoltage[i].V=NodeVoltage[i].V-DV;
					}
				}

/***************************************f15结束*************************************/

/***************************************跳转控制************************************/
		if(flag==1)
	  {
		flag=2;

	   }
		else
			{
			    timer++;
			    flag=1;
			}
}while(MaxError>ERROR);
/**************************************do-while主循环结束*************************************************/

/*************************************节点结果输出显示*****************************************/
window(1,2,80,24);				/*简单的背景设置*/
textbackground(LIGHTCYAN);		/*这个颜色搭配不错*/
textcolor(BLACK);
clrscr();

gotoxy(1,2); 					
printf("After %d iterations the result of Bus is\n",timer);

printf("Voltage :\n");
for(i=1;i<=N;i++)
		printf("%f\t",NodeVoltage[i].V);

printf("Theta :\n");
for(i=1;i<=N;i++)
		printf("%f\t",Theta[i]);

printf("Active Power :\n");
for(i=1;i<=N;i++)
	printf("%f\t",NodePower[i][1]);

printf("Reactive Power :\n");
for(i=1;i<=N;i++)
	printf("%f\t",NodePower[i][2]);

/*******************************支路数据输出**********************************/
PLoss=0.0;
QLoss=0.0;  /*初始化清0*/

for(n=1;n<=Nb;n++)

      {
	i=abs(Branch[n].i);
	j=abs(Branch[n].j);
	R=Branch[n].R;
	X=Branch[n].X;
	YK=2*Branch[n].YK;

	Vi=NodeVoltage[i].V;
	theta=NodeVoltage[i].theta;
	Ei=Vi*cos(theta);
	Fi=Vi*sin(theta);

	Vj=NodeVoltage[j].V;
	theta=NodeVoltage[j].theta;
	Ej=Vj*cos(theta);
	Fj=Vj*sin(theta);

	if(Branch[n].i<0||Branch[n].j<0)
	      {
		if(Branch[n].i<0)
		    {
			Ei=2*Ei/YK;
			Fi=2*Fi/YK;
			}
		 else
		    {
			Ej=2*Ej/YK;
			Fj=2*Fj/YK;
		     }
		 YK=0.0;
	       }

		DE=Ei-Ej;
		DF=Fi-Fj;
		Zmag2=R*R+X*X;
		Ir=(DE*R+DF*X)/Zmag2;
		Ii=(DF*R-DE*X)/Zmag2;

		Pij=Ir*Ei+Ii*Fi;
		Qij=Ir*Fi-Ii*Ei;
		Pji=-Ir*Ej-Ii*Fj;
		Qji=-Ir*Fj+Ii*Ej;

		Qij=Qij-Vi*Vi*YK/2.0;
		Qji=Qji-Vj*Vj*YK/2.0;

		PLoss=PLoss+Pij+Pji;
		QLoss=QLoss+Qij+Qji;
			
		gotoxy(20,13+n);		
		printf("%f\t%f\t%f\t%f",Pij,Qij,Pji,Qji);
  }/*for's*/	

  	    gotoxy(1,12); 					
		printf("The Result of Line is");		

  	        gotoxy(1,13); 					
			for(i=0;i<6;i++)
			printf("%s",Line_menu1[i]);

			for(i=0;i<Nb;i++)				
				{
					gotoxy(4,14+i);
					printf("%d",Branch[i+1].i);
				}
				
			for(i=0;i<Nb;i++)				
				{
					gotoxy(12,14+i);
					printf("%d",Branch[i+1].j);
				}	
  	  	gotoxy(1,19);
		printf("The Total Active   SunHao is %f",PLoss);	
		gotoxy(1,20);
		printf("The Total Reactive SunHao is %f",QLoss);		
}/*if(key==C)的*/
			 
		 /*if(key==Key_H)
			 /*显示帮助文档*/
			/*cputs("hello flowH");*/
		 if(key==Key_Q)
			 exit(0); /*调用了退出函数*/
		 else
			 goto lebel;  /*goto语句*/
	 }/*while的*/
}/*main的*/


/*****************取键盘扫描码子函数*****************/
	int get_key()
	{   /*对BIOS调用,包含在<dos.h>文件中*/
		union REGS rg;
		rg.h.ah=0;
		int86(0x16,&rg,&rg); /*16号中断调用*/
		return rg.h.ah;		/*返回键盘码*/
	}
/******************取键盘码子函数结束********************/

⌨️ 快捷键说明

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