C语言潮流计算实现Word格式.docx
- 文档编号:17864061
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:36
- 大小:2.16MB
C语言潮流计算实现Word格式.docx
《C语言潮流计算实现Word格式.docx》由会员分享,可在线阅读,更多相关《C语言潮流计算实现Word格式.docx(36页珍藏版)》请在冰豆网上搜索。
doublevb;
doublep;
doubleq;
doublev;
doubleag;
}*pqv;
structY{
doubleG;
doubleB;
}**y;
structLZ
charname1[5];
doublevb1;
charname2[5];
doublevb2;
doubler;
doublex;
doubleb;
}*lz;
structTZ
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"
[8]上一个[2]下一个[5]查看[-]删除文件【0】退出\n\n"
list("
0,filename);
chose();
}
gotoopt;
}
)exit(0);
elsegotoopt;
opt1:
dataprepare();
init:
initial();
Yc();
printf("
输入允许误差量:
"
scanf("
%lf"
&
wucha);
选择模式:
a.详情;
b.简单:
redo:
fflush(stdin);
c=getchar();
if(c!
a'
&
c!
b'
A'
B'
{printf("
输入错误!
重新输入:
gotoredo;
}
)showy();
error=detpqc();
showdetpq();
while(error>
wucha&
error<
100)
if(c!
\t\t是否继续迭代<
空格:
是R/r:
重赋初值E/e:
退出潮流计算>
?
\n"
ifdie:
fflush(stdin);
ch=getch();
switch(ch)
{
case'
'
:
break;
R'
;
r'
gotoinit;
E'
e'
gotoopt;
default:
gotoifdie;
}
diedai++;
Jrc();
\n>
>
第%d次迭代<
<
diedai);
showj();
Gauss();
)showdetav();
for(temp1=0;
temp1<
pqnum+pvnum;
temp1++)/*修正电压*/
pqv[temp1].ag=pqv[temp1].ag-detav[temp1];
pqnum;
temp1++)
pqv[temp1].v=pqv[temp1].v-detav[temp1+pqnum+pvnum];
error=detpqc();
showdetpq();
if(error>
=300||error<
0)
\t\t迭代不收敛<
R/r:
what:
gotowhat;
showsolution();
ch=save2file();
if(ch=='
)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;
\n请输入潮流计算的数据文件\n--"
getf:
gets(fsource);
while((fp=fopen(fsource,"
r"
))==NULL)/*打开文件*/
\t\t不能打开文件!
!
\n\t\t重新输入请键入“Y”,其他任意键退出:
fflush(stdin);
ch=getchar();
if(ch=='
Y'
||ch=='
y'
printf("
\n\t\t潮流计算的数据文件:
gotogetf;
else
exit(0);
system("
cols=130lines=50&
color06"
while(!
feof(fp))/*计算各种节点数目*/
ch=fgetc(fp);
if(ch==10)
if(fgets(type,3,fp))
if(strcmp(type,"
pq"
)==0)pqnum++;
pv"
)==0)pvnum++;
lz"
)==0)lznum++;
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,"
)==0)
{
fscanf(fp,"
%s%lf%lf%lf"
pqv[temp1].name,&
pqv[temp1].vb,&
pqv[temp1].p,&
pqv[temp1].q);
temp1++;
}
%s%lf%lf\t%lf"
pqv[temp2+pqnum].name,&
pqv[temp2+pqnum].vb,&
pqv[temp2+pqnum].p,&
pqv[temp2+pqnum].v);
temp2++;
ph"
%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;
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++;
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("
***************************************************************************************************************************"
电力系统潮流计算"
从文件中获得的数据如下:
节点类型名称额定电压有功标幺无功标幺电压标幺相角弧度\n"
for(temp1=0;
=pqnum+pvnum;
{if(temp1<
pqnum)
PQ%s%9.3lf%9.3lf%9.3lf\n"
pqv[temp1].name,pqv[temp1].vb,pqv[temp1].p,pqv[temp1].q);
elseif(temp1<
pqnum+pvnum)
printf("
PV%s%9.3lf%9.3lf%9.3lf\n"
pqv[temp1].name,pqv[temp1].vb,pqv[temp1].p,pqv[temp1].v);
平衡%s%9.3lf%9.3lf%9.3lf\n"
pqv[temp1].name,pqv[temp1].vb,pqv[temp1].v,pqv[temp1].ag);
线路节点1额定电压节点2额定电压电阻电抗对地导纳\n"
lznum;
输电线路%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);
线路节点1额定电压节点2额定电压电抗值一次比二次\n"
tznum;
变压器%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:
if(temp1<
请输入第%d个节点%s(pq)的电压幅值:
temp1+1,pqv[temp1].name);
scanf("
pqv[temp1].v);
请输入第%d个节点%s(pq)的电压相角:
pqv[temp1].ag);
pqv[temp1].ag=pqv[temp1].ag/180*3.1415926;
if(temp1>
=pqnum)
请输入第%d个节点%s(pv)的电压相角:
\t\t\t按ESC重新赋值,其他任意键继续!
c=getch();
if(c==27)gotore_insert;
voidYc(void)
inti,j,temp,flag=0;
y=(structY**)malloc((pqnum+pvnum+1)*sizeof(structY*));
pqnum+pvnum+1;
y[temp1]=(structY*)malloc((pqnum+pvnum+1)*sizeof(structY));
for(i=0;
i<
i++)
for(j=0;
j<
=(pqnum+pvnum);
j++)
if(i!
=j)
flag=0;
for(temp=0;
temp<
temp++)/*当两节点间为线路时*/
if((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));
}
temp++)/*当两节点间为变压器*/
if((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两节点间出现多条支路,本程序暂不支持!
!
y[i][i].G=0,y[i][i].B=0;
for(temp=0;
temp++)/*当与另一节点间为线路时*/
if((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;
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)
导纳矩阵Y:
temp1++)
{
for(temp2=0;
temp2<
temp2++)
%9.6lf+j%9.6lf"
y[temp1][temp2].G,y[temp1][temp2].B);
}
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));
2*(pqnum+pvnum);
pqnum+pvnum)/*求P(pq,pv)误差量pqnum+pvnum个*/
{
Pi[temp1]=0;
for(temp2=0;
temp2++)
Pi[temp1]=Pi[temp1]+pqv[temp2].v*(y[temp1][temp2].G*cos(pqv[temp1].ag-pqv[temp2].ag)+y[temp1][temp2]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 潮流 计算 实现