C语言潮流计算实现.docx
《C语言潮流计算实现.docx》由会员分享,可在线阅读,更多相关《C语言潮流计算实现.docx(36页珍藏版)》请在冰豆网上搜索。
C语言潮流计算实现
C语言程序设计
潮流计算
学院自动化学院
专业班级
学号
姓名
联系方式
本程序潮流计算部分采用牛顿拉夫逊极坐标法进行计算,求解一次多元方程采用高斯列主元分解法进行求解。
根据工程实际,在存储文件实时记录产生文件时间。
此外本程序特意增加了文件查看功能,方便文件的查看。
程序代码:
#include
#include
#include
#include
#include
#include
#include
voiddataprepare(void);
voidinitial(void);
voidYc(void);
voidshowy(void);
doubledetpqc(void);
voidshowdetav(void);
voidJrc(void);
voidshowdetpq(void);
voidGauss(void);
voidshowj(void);
voidshowsolution(void);
charsave2file(void);
charoption(void);
intchose(void);
intlist(charfilename[],inti,chardstn[]);
structPQV
{
charname[5];
doublevb;
doublep;
doubleq;
doublev;
doubleag;
}*pqv;
structY{
doubleG;
doubleB;
}**y;
structLZ
{
charname1[5];
doublevb1;
charname2[5];
doublevb2;
doubler;
doublex;
doubleb;
}*lz;
structTZ
{
charname1[5];
doublevb1;
charname2[5];
doublevb2;
doublex;
doublek1;
doublek2;
}*tz;
charfsource[20];
intpqnum=0,pvnum=0,lznum=0,tznum=0;
inttemp1=0,temp2=0,temp3=0,temp4=0;
intdiedai=0;
intnumw=1,numofw=0;
double*detpq,*detav,*Pi,*Qi,error,wucha,**J;/*detpq节点功率的误差量,detav修正量,Pi节点的有功功率*/
charc,ch,dstname[20],filename[20];
intmain()
{
opt:
c=option();
if(c=='1')gotoopt1;
elseif(c=='2')
{
list("1.bin",1,filename);
system("modecon:
cols=100lines=30&color07");
while(c!
='0')
{
system("cls");
printf("################################计算结果文件查看################################\n");
printf("[8]上一个[2]下一个[5]查看[-]删除文件【0】退出\n\n");
list("1.bin",0,filename);
chose();
}
gotoopt;
}
elseif(c=='0')exit(0);
elsegotoopt;
opt1:
dataprepare();
init:
initial();
Yc();
printf("输入允许误差量:
");
scanf("%lf",&wucha);
printf("选择模式:
a.详情;b.简单:
");
redo:
fflush(stdin);
c=getchar();
if(c!
='a'&&c!
='b'&&c!
='A'&&c!
='B')
{printf("输入错误!
重新输入:
");gotoredo;}
if(c!
='B'&&c!
='b')showy();
error=detpqc();
showdetpq();
while(error>wucha&&error<100)
{
if(c!
='B'&&c!
='b')
{
printf("\t\t是否继续迭代<空格:
是R/r:
重赋初值E/e:
退出潮流计算>?
\n");
ifdie:
fflush(stdin);
ch=getch();
switch(ch)
{
case'':
break;
case'R':
;
case'r':
gotoinit;break;
case'E':
;
case'e':
gotoopt;break;
default:
gotoifdie;
}
}
diedai++;
Jrc();
if(c!
='B'&&c!
='b')
{
printf("\n>>>>>>>>>>>>>>>>>>>第%d次迭代<<<<<<<<<<<<<<<<<<<<<\n",diedai);
showj();
}
Gauss();
if(c!
='B'&&c!
='b')showdetav();
for(temp1=0;temp1pqv[temp1].ag=pqv[temp1].ag-detav[temp1];
for(temp1=0;temp1pqv[temp1].v=pqv[temp1].v-detav[temp1+pqnum+pvnum];
error=detpqc();
if(c!
='B'&&c!
='b')
showdetpq();
}
if(error>=300||error<0)
{
printf("\t\t迭代不收敛重赋初值E/e:
退出潮流计算>?
\n");
what:
fflush(stdin);
ch=getch();
switch(ch)
{
case'R':
;
case'r':
gotoinit;break;
case'E':
;
case'e':
gotoopt;break;
default:
gotowhat;
}
}
showsolution();
ch=save2file();
if(ch=='1')gotoopt;
else
gotoinit;
}
voiddataprepare(void)
{
FILE*fp;
charch,type[4];
pqnum=0,pvnum=0,lznum=0,tznum=0,temp1=0,temp2=0,temp3=0,temp4=0;
printf("\n请输入潮流计算的数据文件\n--");
getf:
fflush(stdin);
gets(fsource);
while((fp=fopen(fsource,"r"))==NULL)/*打开文件*/
{
printf("\t\t不能打开文件!
!
\n\t\t重新输入请键入“Y”,其他任意键退出:
");
fflush(stdin);
ch=getchar();
if(ch=='Y'||ch=='y')
{
printf("\n\t\t潮流计算的数据文件:
");
gotogetf;
}
else
exit(0);
}
system("modecon:
cols=130lines=50&color06");
while(!
feof(fp))/*计算各种节点数目*/
{
ch=fgetc(fp);
if(ch==10)
{
if(fgets(type,3,fp))
{
if(strcmp(type,"pq")==0)pqnum++;
if(strcmp(type,"pv")==0)pvnum++;
if(strcmp(type,"lz")==0)lznum++;
if(strcmp(type,"tz")==0)tznum++;
}
}
}
pqv=(structPQV*)malloc((pqnum+pvnum+1)*sizeof(structPQV));/*根据节点数目开辟各节点储存空间*/
lz=(structLZ*)malloc((lznum)*sizeof(structLZ));
tz=(structTZ*)malloc((tznum)*sizeof(structTZ));
rewind(fp);
while(!
feof(fp))/*读取和输入各节点数据*/
{
ch=fgetc(fp);
if(ch==10)
{
if(!
fgets(type,3,fp))break;
if(strcmp(type,"pq")==0)
{
fscanf(fp,"%s%lf%lf%lf",pqv[temp1].name,&pqv[temp1].vb,&pqv[temp1].p,&pqv[temp1].q);
temp1++;
}
if(strcmp(type,"pv")==0)
{
fscanf(fp,"%s%lf%lf\t%lf",pqv[temp2+pqnum].name,&pqv[temp2+pqnum].vb,&pqv[temp2+pqnum].p,&pqv[temp2+pqnum].v);
temp2++;
}
if(strcmp(type,"ph")==0)
{
fscanf(fp,"%s%lf\t\t%lf%lf",pqv[pqnum+pvnum].name,&pqv[pqnum+pvnum].vb,&pqv[pqnum+pvnum].v,&(pqv[pqnum+pvnum].ag));
pqv[pqnum+pvnum].ag=pqv[pqnum+pvnum].ag/180*3.1415926;
}
if(strcmp(type,"lz")==0)
{
fscanf(fp,"%s%lf%s%lf%lf%lf%lf",lz[temp3].name1,&lz[temp3].vb1,lz[temp3].name2,&lz[temp3].vb2,&lz[temp3].r,&lz[temp3].x,&lz[temp3].b);
temp3++;
}
if(strcmp(type,"tz")==0)
{
fscanf(fp,"%s%lf%s%lf%lf%lf%lf",tz[temp4].name1,&tz[temp4].vb1,tz[temp4].name2,&tz[temp4].vb2,&tz[temp4].x,&tz[temp4].k1,&tz[temp4].k2);
temp4++;
}
}
}
fclose(fp);
puts("***************************************************************************************************************************");
puts("电力系统潮流计算");
puts("***************************************************************************************************************************");
printf("从文件中获得的数据如下:
\n");
printf("节点类型名称额定电压有功标幺无功标幺电压标幺相角弧度\n");
for(temp1=0;temp1<=pqnum+pvnum;temp1++)
{if(temp1printf("PQ%s%9.3lf%9.3lf%9.3lf\n",pqv[temp1].name,pqv[temp1].vb,pqv[temp1].p,pqv[temp1].q);
elseif(temp1printf("PV%s%9.3lf%9.3lf%9.3lf\n",pqv[temp1].name,pqv[temp1].vb,pqv[temp1].p,pqv[temp1].v);
else
printf("平衡%s%9.3lf%9.3lf%9.3lf\n",pqv[temp1].name,pqv[temp1].vb,pqv[temp1].v,pqv[temp1].ag);
}
printf("\n");
printf("线路节点1额定电压节点2额定电压电阻电抗对地导纳\n");
for(temp1=0;temp1printf("输电线路%s%9.3lf%s%9.3lf%9.3lf%9.3lf%9.5lf\n",lz[temp1].name1,lz[temp1].vb1,lz[temp1].name2,lz[temp1].vb2,lz[temp1].r,lz[temp1].x,lz[temp1].b);
printf("\n");
printf("线路节点1额定电压节点2额定电压电抗值一次比二次\n");
for(temp1=0;temp1printf("变压器%s%9.3lf%s%9.3lf%9.3lf%9.3lf:
%9.3lf\n",tz[temp1].name1,tz[temp1].vb1,tz[temp1].name2,tz[temp1].vb2,tz[temp1].x,tz[temp1].k1,tz[temp1].k2);
}
voidinitial(void)
{
charc;
re_insert:
for(temp1=0;temp1{
if(temp1{
printf("请输入第%d个节点%s(pq)的电压幅值:
",temp1+1,pqv[temp1].name);
fflush(stdin);
scanf("%lf",&pqv[temp1].v);
printf("请输入第%d个节点%s(pq)的电压相角:
",temp1+1,pqv[temp1].name);
fflush(stdin);
scanf("%lf",&pqv[temp1].ag);
pqv[temp1].ag=pqv[temp1].ag/180*3.1415926;
}
if(temp1>=pqnum)
{
printf("请输入第%d个节点%s(pv)的电压相角:
",temp1+1,pqv[temp1].name);
fflush(stdin);
scanf("%lf",&pqv[temp1].ag);
}
}
printf("\t\t\t按ESC重新赋值,其他任意键继续!
\n");
c=getch();
if(c==27)gotore_insert;
}
voidYc(void)
{
inti,j,temp,flag=0;
y=(structY**)malloc((pqnum+pvnum+1)*sizeof(structY*));
for(temp1=0;temp1y[temp1]=(structY*)malloc((pqnum+pvnum+1)*sizeof(structY));
for(i=0;i<=pqnum+pvnum;i++)
{
for(j=0;j<=(pqnum+pvnum);j++)
{
if(i!
=j)
{
flag=0;
for(temp=0;tempif((strcmp(pqv[i].name,lz[temp].name1)==0&&strcmp(pqv[j].name,lz[temp].name2)==0)||(strcmp(pqv[i].name,lz[temp].name2)==0&&strcmp(pqv[j].name,lz[temp].name1)==0))
{flag++;
y[i][j].G=-lz[temp].r/(pow(lz[temp].r,2)+pow(lz[temp].x,2));
y[i][j].B=lz[temp].x/(pow(lz[temp].r,2)+pow(lz[temp].x,2));
}
for(temp=0;tempif((strcmp(pqv[i].name,tz[temp].name1)==0&&strcmp(pqv[j].name,tz[temp].name2)==0)||(strcmp(pqv[i].name,tz[temp].name2)==0&&strcmp(pqv[j].name,tz[temp].name1)==0))
{flag++;
y[i][j].G=0;
y[i][j].B=1/tz[temp].x*tz[temp].k1/tz[temp].k2;
}
if(flag==0){y[i][j].G=0;y[i][j].B=0;}
if(flag>1)printf("\n两节点间出现多条支路,本程序暂不支持!
!
\n");
}
}
}
for(i=0;i<=pqnum+pvnum;i++)
{
y[i][i].G=0,y[i][i].B=0;
for(temp=0;tempif((strcmp(pqv[i].name,lz[temp].name1)==0)||(strcmp(pqv[i].name,lz[temp].name2)==0))
{
y[i][i].G+=lz[temp].r/(pow(lz[temp].r,2)+pow(lz[temp].x,2));
y[i][i].B+=-lz[temp].x/(pow(lz[temp].r,2)+pow(lz[temp].x,2))+lz[temp].b/2;
}
for(temp=0;temp{
if(strcmp(pqv[i].name,tz[temp].name1)==0)
{
y[i][i].B+=-(1/tz[temp].x*tz[temp].k1/tz[temp].k2+1/tz[temp].x*(tz[temp].k2-tz[temp].k1)/tz[temp].k2);
}
if(strcmp(pqv[i].name,tz[temp].name2)==0)
{
y[i][i].B+=-(1/tz[temp].x*tz[temp].k1/tz[temp].k2+1/tz[temp].x*(tz[temp].k1-tz[temp].k2)*tz[temp].k1/pow(tz[temp].k2,2));
}
}
}
}
voidshowy(void)
{
printf("\n");
printf("导纳矩阵Y:
\n");
for(temp1=0;temp1<=pqnum+pvnum;temp1++)
{
for(temp2=0;temp2<=pqnum+pvnum;temp2++)
printf("%9.6lf+j%9.6lf",y[temp1][temp2].G,y[temp1][temp2].B);
printf("\n");
}
printf("\n");
}
doubledetpqc(void)
{
doublemax=0;
detpq=(double*)malloc((2*pqnum+pvnum)*sizeof(double));/*为detpq误差量*/
detav=(double*)malloc((2*pqnum+pvnum)*sizeof(double));/*修正量*/
Pi=(double*)malloc((pqnum+pvnum)*sizeof(double));/**/
Qi=(double*)malloc((pqnum+pvnum)*sizeof(double));
for(temp1=0;temp1<2*(pqnum+pvnum);temp1++)
{
if(temp1{
Pi[temp1]=0;
for(temp2=0;temp2<=(pqnum+pvnum);temp2++)
Pi[temp1]=Pi[temp1]+pqv[temp2].v*(y[temp1][temp2].G*cos(pqv[temp1].ag-pqv[temp2].ag)+y[temp1][temp2]