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

📄 end1000.c.txt

📁 用于计算潮流程序的可视化化软件 希望对大家有用
💻 TXT
📖 第 1 页 / 共 2 页
字号:
/***********************************************电力系统潮流计算程序*****************************************************/
/*                                       设计者:电气02**班 某人 200285***											***/
/*	                                            时间:2005末-2006初													***/
/*	                                                                                                              	***/
/*	                                                                                                              	***/
/*                                                     参考资料                  									***/
/*                   [1]王锡凡《现代电力系统分析》     北京:科学出版社,         2003 (总体方法及基本算例)       	 	***/
/*	                 [2]王士元《C高级实用程序设计》    北京:清华大学出版社,     1996  (界面设计)  						***/
/*                   [3]谭浩强《C程序设计》	           北京:清华大学出版社,     1999  (基础语言)    					***/
/*	                 [4]吴际舜《》                     上海:上海交通大学出版社, 199* (标准数据来源)     				***/
/*		   			                                                                                               	***/
/*                                  			编辑器:EmEditor 3.34     	           							   	***/
/*                                  			编译器:ToburC   3.0				                  			   		***/



/********************文件包含**********************/
#include<conio.h>
#include<stdio.h>
#include<dos.h>
#include<string.h>
#include<bios.h>
#include<math.h>	

/*********************宏定义*********************/

#define Key_I	  23
#define Key_C     46
#define Key_Q     16
#define Key_H     35		/*键盘扫描码16进制转为10进制*/
	
#define ERROR	  0.00001	/*收敛判别条件*/
#define V_Slack	  1.05		/*平衡节点电压*/
#define N		  5			/*5节点*/
#define Nb        5			/*5支路*/
#define Npv       1			/*1个PV节点*/


main()
{
/*******************************************界面部分变量**************************************************/
/************************************界面整体背景变量*************************************/
	int l,x;
	char *menu[]={"Input","Compute","Help","Quit"};
	char *red[]={"I","C","H","Q"};
	char *Hot_Key[]={"      I-Input    ","C-Compute    ","H-Help    ","Q-Quit    "};/*用空格分离方便*/
/************按键识别子函数变量****************/
	int key;
	int Node_Type;/*用数字给界点分类,0---PQ,1---PV,2---平衡*/
/************节点数据输入子过程变量**********/
	float Key_data;
	char *Bus_menu[]={"NO   ","Voltage    ","P_Gen     ","Q_Gen    ","P_Load    ","Q_Load    ","Type"};
	char *Line_menu1[]={"From bus ","To bus     ","P_ij            ","Q_ij            ","P_ji            ","Q_ji"};
/***********支路数据输入子过程变量***********/
	char *Line_menu[]={"NO   ","From bus  ","To bus         ","R        ","X      ","Y/Tap Ratio"};



/*******************************内核计算变量设置************************************/
/**********************因子表1变量**************************/
   struct Branch_Type
	 {
	   int i,j;
	   float R,X,YK;				/*YK双重作用---接地电纳Yor变比K*/
	  }Branch[Nb+1]; 			/*支路结构数组,可作为普通线路或变压器支路*/

    struct Yii_Type
	 {
	   float G,B;
	 }Yii[N+1],Yii1[N+1];         	/*存对角元素的结构数组*/

    struct Yij_Type
	 {
	   float G,B;
	   int j;
	 }Yij[Nb+1],Yij1[Nb+1];         /*存非对角元素的结构数组,带行向量的2元组表*/

    int    NYsum1[N+1],NYsum2[N+1]; /*统计每行非0非对角元素个数*/
    int    NYseq1[N+1],NYseq2[N+1]; /*行向量数组*/

    int
	     i,
	     j,
	     n_u,
	 i_above,
	 count,
	 n;                 		/*中间计数变量*/

    float
	   R,                  			/*电阻*/
	   X,                  			/*电感*/
	   YK,                 			/*接地电容或变压器非标准变比*/
	   Zmag2,              			/*阻抗模值的平方*/
	   Gij,                			/*导*/
	   Bij,                			/*纳*/
	   b_ij,              			/*为了求无功导纳阵的电纳*/
	   Btempt;             			/*临时变量*/

   struct U_Type
    {
     float value;
     int    j;
     }U1[2*N],U2[2*N];    /*存因子表上三角阵非对角非0元素,由经验分配内存空间大小*/

   /*不计第N行的平衡节点,只形成1---N-1行因子表*/
   float D1[N],D2[N];          	/*存因子表对角元素*/
   int    NUsum1[N],NUsum2[N];      /*存因子表格行非0元素个数*/  /*区分开两个表!!!*/
   float B[N];

/********************************fb2变量***************************************/
struct PVNode_Type
    {
     int    i;
     float V;
    }PVNode[Npv+1]={{0,0},{4,1.05}};

 int
      n_pv,
      i_pv;

/********************************f13变量开始**************************************/
float V0=1.0;
struct NodeVoltage_Type
{
	float V,theta;
}NodeVoltage[N+1];  /*主程序f13时才给此结构组赋初值*/


/***********************************主程序控制变量*************************************/
int
	timer,/*记录迭代次数*/
	flag; /*flag=1进行P-theta迭代,flag=2时进行Q-V迭代*/

/*********************f9的变量*************************/
	float
		DItemp;
/**********************f12的变量***********************/
	float
		A,
		C, /*暂存器*/
		Vi,/*存第i个节点的电压*/
		VV,/*存Vi*Vj*/
		theta;/*存Dtheta,即theta_i-theta_j*/
	float NodePower[N+1][3];/*存节点功率的2维数组,多开了一行一列,由flag选P,Q*/

/********************f14的变量*************************/
	 struct Node_Type
		{
			int    i;
			float
				V,
				P_G,
				Q_G,
				P_L,
				Q_L;
		 }Node[N+1];

	float
		Wi,
	    MaxError;



	float
		DI[N];/*delta_I 重要数组,计算结果存放在这里,*/

/*****************f15的变量***********************/
    float
	Dtheta,
	DV;

float  Theta[N+1];

/********************f17变量**********************/
float PLoss,QLoss,
       Vj,
       Ei,Ej,
       Fi,Fj,
       DE,DF,
       Pij,Qij,
       Pji,Qji,
       Ir,Ii;

/*******************************************变量结束-----------程序开始***********************************************/
/** 																												**/
/**																													**/
/**							            	      2006.2.18															**/
/**																													**/
/**																													**/
/*********************************************************************************************************************/

/******************************************前奏:整体界面背景开始********************************************/

	window(1,1,80,25);
	textbackground(BLUE);
	clrscr();                      /*整体一大窗*/

/*顶部一小窗,显示主操作名*/
	window(1,1,80,1);
	textbackground(LIGHTGRAY);
	textcolor(BLACK);
	clrscr();
	gotoxy(12,1);				   /*重新定位,使文字不在界面边缘*/

	for(i=0,l=0;i<4;i++)
		{
			x=wherex();
			cprintf("%s",menu[i]);
			l=strlen(menu[i]);
			gotoxy(x,1);
			textcolor(RED);
			cprintf("%s",red[i]);   /*首字母红色显示*/
			x=x+l+12;				/*下一操作名显示的位置*/
			gotoxy(x,1);
			textcolor(BLACK);
		}

	/*底部一小窗,显示快捷键*/
	window(1,25,80,25);
	textbackground(LIGHTGRAY);
	clrscr();

	for(i=0,l=0;i<4;i++)
		{
			cprintf("%s",Hot_Key[i]);
			textcolor(BLACK);  /*用空格  就2行了!好*/
		}
 /******************************************整体界面背景结束********************************************/


/**************************************************主干:按键选择开始***********************************************/
	 while(1)/********强制执行********/
	 {
		 key=0;
 lebel:	 while(bioskey(1)==0)    /*键盘操作函数,用<bios.h>头文件*/
			 ;             /*没有键按下的时候执行空语句,处于等待按键状态*/

		 key=get_key();
		/*******要防止过程冲突,执行Input操作时屏蔽Compute操作,但可以Quit操作*******/
		 if(key==Key_I)
		{
			/****************************************节点数据输入子过程开始**************************************/
			window(1,2,80,24);				/*简单的背景设置*/
			textbackground(LIGHTCYAN);		/*这个颜色搭配不错*/
			textcolor(BLACK);
			clrscr();

			gotoxy(28,2); 					/*居中显示标题*/
			printf("Please Input Bus Data");




			gotoxy(10,4); 					/*表头定位*/
			for(i=0;i<7;i++)
			printf("%s",Bus_menu[i]);

			for(i=0;i<N;i++)				/*自动输出表的第一列*/
				{
					gotoxy(10,5+i);
					printf("%d",i+1);
				}

			for(j=1;j<=N;j++)                /*垂直方向移动*/
				{
					Node[j].i=j;
					for(i=0;i<6;i++)         /*水平方向移动*/
						{
							gotoxy(15+10*i,j+4);
							scanf("%f",&Key_data);
							switch(i)
							{
								case 0:Node[j].V=Key_data;break;
								case 1:Node[j].P_G=Key_data;break;
								case 2:Node[j].Q_G=Key_data;break;
								case 3:Node[j].P_L=Key_data;break;
								case 4:Node[j].Q_L=Key_data;break;
								case 5:Node_Type=Key_data;
									   if(Node_Type==1)
									   {	
									   	   PVNode[j].i=j;
									   	   PVNode[j].V=Node[j].V;
									   }
									   	   
							}
						}
				}
			/**********************************节点数据输入子过程结束************************************/


			/**********************************支路数据输入子过程开始**********************************/
			window(1,2,80,24);				/*简单的背景设置*/
			textbackground(LIGHTCYAN);		/*这个颜色搭配不错*/
			textcolor(BLACK);
			clrscr();

			gotoxy(28,2); 					/*居中显示标题*/
			printf("Please Input Line Data");



			gotoxy(10,4); 					/*表头定位*/
			for(i=0;i<6;i++)
				printf("%s",Line_menu[i]);

			for(i=0;i<Nb;i++)				/*自动输出表的第一列*/
				{
					gotoxy(10,5+i);
					printf("%d",i+1);
				}

			for(j=1;j<=Nb;j++)                /*垂直方向移动*/
				{
					for(i=0;i<5;i++)         /*水平方向移动*/
						{
							gotoxy(17+10*i,j+4);
							scanf("%f",&Key_data);
							switch(i)
							{
								case 0:Branch[j].i =Key_data;break;/*界面输入向内核传递数据*/
								case 1:Branch[j].j =Key_data;break;
								case 2:Branch[j].R =Key_data;break;
								case 3:Branch[j].X =Key_data;break;
								case 4:Branch[j].YK=Key_data;
							}
						}
				}
		}/*if(key==Key_I)的*/
if(key==Key_C)
{
				/**************************************因子表2开始****************************************/
/**************先做因子表2,再做因子表1!如果不这样Yii[i]、Yij[i]会被覆盖************/
/*********************形成抛掉串联电阻,不计接地支路的中间过渡导纳阵******************/

	for(i=1;i<=N;i++)
	    {
	      Yii1[i].G=0;
	      Yii1[i].B=0;
	      NYsum2[i]=0;
		}

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

				b_ij=-1.0/X;

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

				else
				{
				Yij1[n].G=0.0;
				Yij1[n].B=-b_ij;
				 }

				Yij1[n].j=j;

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

			  NYsum2[i]++;

		}/*for的括号*/


			NYseq2[1]=1;

			for(i=1;i<=N-1;i++)
			NYseq2[i+1]=NYseq2[i]+NYsum2[i];


/***************************为形成无功导纳阵 追加接地支路,只影响自导纳***************************/

	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);  /*书上印错!!!*/
					      b_ij=Yij1[n].B;  
					      Yii1[i].B=Yii1[i].B+(1.0-1.0/YK)*b_ij;	/*i节点侧*/
					      Yii1[j].B=Yii1[j].B+(1.0-YK)*b_ij;	/*j节点侧*/
					 }/*if i<0*/
					else
				      {
					     j=abs(j);					     
					 b_ij=Yij1[n].B;  /*B''*/
		  		         Yii1[j].B=Yii1[j].B+(1.0-1.0/YK)*b_ij;	/*j节点侧*/		  		        		       
		  		         Yii1[i].B=Yii1[i].B+(1.0-YK)*b_ij;	/* i节点侧  */
						}/*else i<0*/
				 }/*if i<0,j<0*/

		  		 else   /*无变压器支路*/
		  		    {   
		  		    	b_ij=YK;      
					Yii1[i].B=Yii1[i].B+b_ij;
		  		        Yii1[j].B=Yii1[j].B+b_ij;	/*B''*/
					} /*else 无变压器*/
	      }/*for的*/


  /********************************形成因子表2*****************************/  
    n_pv=1;
    i_pv=PVNode[1].i;

for(i=1;i<=N-1;i++)
     {
     	if(i==i_pv)
	   {
     	   	 n_pv++;
		 i_pv=PVNode[n_pv].i;
     	   	 NUsum2[i]=0;
		 D2[i]=0;
	  }                     /*F框*/
	   	else
	  {
	  /*形成B"因子表时一定用Yii1,Yij1数组的值,把与无功有关的接地电容和变压器考虑进去*/
     	   	 for(count=i+1;count<=N-1;count++)
     	   	 			B[count]=0;
     	   	 		B[i]=Yii1[i].B;      /*A框*/ 
     	   	 		
			for(count=NYseq2[i];count<=NYseq2[i+1]-1;count++)
     	   	 			{
						j=Yij1[count].j;
						B[j]=Yij1[count].B;/*B框*/
						}

     	     			for(count=1;count<=Npv;count++)
						{
							j=PVNode[count].i;
     	     						B[j]=0;
     	     						}
     	     			               /*C框*/	 

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

     	   	 	for(i_above=1;i_above<=i-1;i_above++)	
					{
     	   	 				for(count=1;count<=NUsum2[i_above];count++)
     	   	 						{
									if(U2[n_u].j!=i)             /*为初始化就用了,不好!!*/
											n_u++;
									else goto there1;  /*这里写得不好,用了2次goto还有空语句*/
									}/*for's*/
								goto there2;
							there1:Btempt=U2[n_u].value/D2[i_above];

					 		 for(;count<=NUsum2[i_above];count++)/*改了count初值是,果真有问题!空语句才对!*/
							{
								j=U2[n_u].j;
								B[j]=B[j]-Btempt*U2[n_u].value;
								n_u++;
								}
							goto there2;
							there2: ;                   /*一条空语句!!!*/
				    	}/*for's*/

		   Btempt=1.0/B[i];
		   D2[i]=Btempt;
		   count=0;

		   for(j=i+1;j<=N-1;j++)
     	   	   			{
						if(B[j]!=0)
     	   	   						{
     	   	   							U2[n_u].value=B[j]*Btempt;
									U2[n_u].j=j;
									count++;
     	   	   							n_u++;
     	   	   							}	
     	   	   				}
     	   	   NUsum2[i]=count;				
	   }/*else's*/
     	}/*for's*/  
/***************************************fb2结束******************************************/

/*************************************fb1开始****************************************/
/**                                  2005.11.5                                     **/

⌨️ 快捷键说明

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