📄 end1000.c.txt
字号:
/***********************************************电力系统潮流计算程序*****************************************************/
/* 设计者:电气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 + -