C语言潮流计算牛顿拉夫逊法直角坐标资料下载.pdf
- 文档编号:5983539
- 上传时间:2023-05-05
- 格式:PDF
- 页数:27
- 大小:1.07MB
C语言潮流计算牛顿拉夫逊法直角坐标资料下载.pdf
《C语言潮流计算牛顿拉夫逊法直角坐标资料下载.pdf》由会员分享,可在线阅读,更多相关《C语言潮流计算牛顿拉夫逊法直角坐标资料下载.pdf(27页珍藏版)》请在冰点文库上搜索。
i);
scanf(%s,filename);
charch=;
/读取数据,以它们之间的空格做分隔标志if(fp=fopen(filename,rb)=NULL)printf(t打开文件失败.ntt请重新输入.nt);
elseprintf(nt呵呵,读取文件信息成功.nn);
while(ch!
=EOF)/当读入的字符不是结束标志时进行循环ch=fgetc(fp);
if(ch=10)/当输入的字符时换行符时ch=fgetc(fp);
if(ch=1)/读取PQPV平衡节点参数/fscanf()读入ASCII字符的形式fscanf(fp,%d%d%lf%lf%lf%lf,&
poini.lei,&
poini.jie,&
poini.P,&
poini.Q,&
poini.y1,&
poini.y2);
i+;
if(ch=2)/读取线路参数(若为变压器,则左节点为“低”压侧(换算成型等值电路),变压器的阻抗在“低”压侧)fscanf(fp,%d%d%lf%lf%lf%lf,&
linej.jiedian0,&
linej.jiedian1,&
linej.R,&
linej.X,&
linej.K,&
linej.B0);
j+;
4/20if(ch=3)/节点数point支路数roadfscanf(fp,%d%d,&
point,&
road);
fclose(fp);
voidprint()/定义“打印数据信息”inti,j;
pqpv();
printf(nt节点参数表(PQ节点PV节点平衡节点):
nnt类型节点有功功率P无功功率Q电压et电压fn);
i线路参数表(变压器换算成型等值电路,左节点为“低”压侧):
nnt节点1节点2阻抗R感抗X变压器变比k对地电容Bn);
for(j=0;
j节点数%d,支路数%dnntPQ节点%d个,PV节点%d个.nn,point,road,p1,p2);
voidjiedian(inti)/节点参数intg3;
charc;
printf(nt节点类型(1.PQ2.PV3.平衡节点):
nt);
a1:
g3);
/g3=c-48;
if(g33)5/20printf(nt错误,请重新输入.nt);
gotoa1;
poini.lei=g3;
if(poini.lei!
=3)printf(t有功功率P:
scanf(%lf,&
poini.P);
=2)printf(t无功功率Q:
poini.Q);
elsepoini.Q=0;
elsepoini.P=poini.Q=0;
=1)printf(t电压e:
poini.y1);
printf(t电压f:
elsepoini.y1=poini.y2=0;
voidxianlu(intj)/线路参数charg2;
printf(nt线路若含有变压器,则换算成型等值电路,左节点为“低”压侧nt是否含变压器.(y/n);
g2=getch();
if(g2!
=y&
g2!
=n)printf(nnt错误,请重新输入.nt);
printf(nnt左节点:
linej.jiedian0);
printf(t右节点:
linej.jiedian1);
printf(t阻抗R:
linej.R);
printf(t感抗X:
linej.X);
if(g2=y)linej.B0=0;
6/20printf(t变压器变比k:
linej.K);
elselinej.K=1;
printf(t对地电容B:
voidporo()/输入节点数和支路数printf(nt节点数:
);
point);
printf(t支路数:
voidgai()/修改数据charg;
intm,n;
system(cls);
printf(nt*修改数据模式*n);
print();
printf(t修改类别如下:
nta:
节点数&
支路数,b:
节点参数,c:
线路参数.(q退出)nt);
g=getch();
switch(g)casea:
poro();
break;
caseb:
printf(nt请输入修改的节点编号:
m);
poinm-1.jie=m;
m-;
jiedian(m);
casec:
printf(nt请输入修改线路序号:
n);
n-;
7/20xianlu(n);
caseq:
;
default:
printf(nt错误,请重新输入.nt);
if(g!
=q)gotoa;
voidgetdata(inti,intj)/生成数据表charg1;
while
(1)a1:
printf(na:
支路数,b:
线路参数,d:
修改数据,e:
数据清零.(q退出)nt);
g1=getch();
if(g1=a)poro();
elseif(g1=b)while
(1)printf(nt节点编号:
poini.jie);
jiedian(i);
printf(nt按任意键继续.(q退出)nt);
if(getch()=q)break;
elseif(g1=c)while
(1)xianlu(j);
elseif(g1=e)/每次生成数据,清零point=road=0;
8/20i=j=0;
printf(nt数据清零成功.);
elseif(g1=d)gai();
elseif(g1=q)break;
elseprintf(nt错误,请重新输入.nt);
voidputfile2()/将数据存入文件FILE*fp;
inti,j;
charfilename20,beizhu60;
printf(nt请输入要存入计算数据的文件名.nt);
printf(nt备注信息:
scanf(%s,&
beizhu);
if(fp=fopen(filename,w)=NULL)printf(t存入文件失败.ntt请重试.nt);
elseprintf(nt恭喜你,成功存入文件%s.nn,filename);
fprintf(fp,tttt潮流计算数据表n-n节点参数
(1)n);
i=point-1;
i+)fprintf(fp,1%d%d%11.7lf%11.7lf%11.7lf%11.7lfn,poini.lei,poini.jie,poini.P,poini.Q,poini.y1,poini.y2);
fprintf(fp,-n线路参数
(2)n);
j备注信息:
%s,beizhu);
9/20voidreadormake()/开始界面模式intm,n;
m=n=0;
/每次重新生成数据,清零charg1,g2;
a2:
printf(nnt请选择模式.(a.生成数据文件b.读取数据文件)nt);
if(g1=a)system(modecon:
cols=85lines=40);
system(color07);
a3:
getdata(m,n);
printf(t*nnttt欢迎使用潮流计算软件nnt*nt);
printf(nt是否存入文件.(y/n)输入r返回.nt);
if(g2=y)putfile2();
if(g2=r)gotoa3;
system(colorf0);
system(modecon:
cols=60lines=20);
/调整屏幕大小printf(t*nntt欢迎使用潮流计算软件nnt*nt);
gotoa2;
elseif(g1=b)readfile();
chargescreen();
elseif(g1=q)exit(0);
voiddaona(doubleG30,doubleB30)/定义求导纳函数inti,j;
10/20intm,n;
doublehu30;
/互导纳的分母for(i=0;
i+)/初始化BGfor(j=0;
j=point-1;
j+)Bij=Gij=0;
i+)/节点数for(j=0;
j=road-1;
j+)/支路数huj=linej.R*linej.R+linej.X*linej.X;
/互导纳的分母if(linej.K=1)if(i+1=linej.jiedian0|i+1=linej.jiedian1)Bii+=linej.B0+(-1*(linej.X/huj);
/对角线的导纳Gii+=linej.R/huj;
/对角线的导纳if(linej.K!
=1)if(i+1=linej.jiedian0)/变压器低压侧Bii+=-1*(linej.X/huj);
/对角线的导纳if(i+1=linej.jiedian1)/变压器高压侧Bii+=(-1*linej.X)/(linej.K*linej.K*huj);
/对角线的导纳Gii+=linej.R/(linej.K*linej.K*huj);
/对角线的导纳for(j=0;
/互导纳的分母m=linej.jiedian0-1;
n=linej.jiedian1-1;
if(linej.K=1)Bmn=Bnm=linej.X/(linej.K*huj);
/非对角的互导纳Gmn=Gnm=(-1*linej.R)/(linej.K*huj);
/非对角的互导纳elseBmn=Bnm=linej.X/(linej.K*huj);
/非对角的互导纳Gmn=Gnm=-1*linej.R/(linej.K*huj);
/非对角的互导纳11/20/*voidcharge(doubleB30,doubleG30)/定义导纳调序函数inti,j;
doubleb3030,g3030;
i+)for(j=0;
j+)bij=Bpoini.jie-1j;
gij=Gpoini.jie-1j;
j+)Bij=bij;
Gij=gij;
*/voidimbalance(doubleG30,doubleB30,doublee30,doublef30,doubleW58,doubleya130,doubleya230)/求各类节点的不平衡量inti,j,k;
doubletemp1,temp2;
i=2*point;
i+)Wi=0;
/以下计算PQ节点的PQfor(i=0,j=0;
j=p1-1;
i=i+2,j+)temp1=0,temp2=0;
for(k=0;
k=point-1;
k+)temp1+=Gjk*ek-Bjk*fk;
temp2+=Gjk*fk+Bjk*ek;
Wi=poinj.P-ej*temp1-fj*temp2;
Wi+1=poinj.Q-fj*temp1+ej*temp2;
/以下计算PV节点的PV*Vfor(;
j=(p1+p2)-1;
k+)12/20temp1+=Gjk*ek-Bjk*fk;
Wi+1=(ya1j*ya1j+ya2j*ya2j)-(ej*ej+fj*fj);
doublemaxone(doubleW58)/声明“求最大值函数”和打印各项最大值doubletemp1,temp2,temp3;
/temp1是绝对值最大的P,temp2是绝对值最大的Q,temp3是绝对值最大的Vdoubletemp;
/存放最大值inti;
temp1=W0;
temp2=W1;
temp3=W2*(p1+1)-1;
ifabs(temp1)temp1=Wi;
if(fabs(Wi+1)fabs(temp2)temp2=Wi+1;
for(;
if(fabs(Wi+1)fabs(temp3)temp3=Wi;
temp=fabs(temp1);
if(tempfabs(temp2)temp=fabs(temp2);
if(temp0)system(cls);
printf(nt*第%d次迭代*nnt以下为各类节点的不平衡13/20量n,count);
if(p10)printf(ntPQ节点的PQnt);
/不平衡量for(i=0,j=1;
i0)printf(ntPV节点的PV*Vnt);
/不平衡量for(;
i=1)/迭代1次后的才出现的电压efprintf(ntt【雅克比矩阵J】nn);
i=2*(point-1)-1;
i+)printf(t);
j=2*(point-1)-1;
j+)printf(%12.7lf,jakeij);
printf(n);
printf(nt解修正方程得电压修正量(e,f):
i=i+2)/电压修正量printf(t(%10.7lf,%10.7lf)n,Vi,Vi+1);
printf(nt修正后的节点电压(e,f):
i=point-1-1;
i+)/修正后的电压printf(t(%10.7lf,%10.7lf)n,ei,fi);
voidjakebi(doubleG30,doubleB30,doublee30,doublef30,doubleJ5858,doublejake5858)/定义“求雅克比矩阵”inti,j,k,m,n;
/以下求PQ节点非对角线上的元素for(i=0,m=0;
i=2*p1-1-1;
i=i+2,m+)for(j=0,n=0;
j=2*(p1+p2)-1-1;
j=j+2,n+)Jij=-(Gmn*em+Bmn*fm);
/PJi+1j+1=-1*Jij;
/QJij+1=Ji+1j=Bmn*em-Gmn*fm;
/PQ14/20/以下求PV节点非对角线上的元素for(;
i=2*(p1+p2)-1-1;
/PJij+1=Bmn*em-Gmn*fm;
/PJi+1j=Ji+1j+1=0;
/V/以下求PQ节点对角线上的元素for(i=0,j=0;
Jii=-temp1-Gjj*ej-Bjj*fj;
/PJii+1=-temp2+Bjj*ej-Gjj*fj;
/PJi+1i=temp2+Bjj*ej-Gjj*fj;
/QJi+1i+1=-temp1+Gjj*ej+Bjj*fj;
/Q/以下求PV节点对角线上的元素for(;
/PJi+1i=-2*ej;
/VJi+1i+1=-2*fj;
/Vfor(i=0;
i+)/存放到新数组,方便打印出来for(j=0;
j+)jakeij=Jij;
voidliezhuyuan(intre,doubleW58,doubleJ5858)/定义“列主元”绝对值的大小排序inti,time;
doublea,temp;
15/20doubleb58;
a=Jre-1re-1;
for(i=re-1;
i+)/选出“列主元”的绝对值最大的行号:
timeif(fabs(a)=fabs(Jire-1)a=Jire-1;
time=i;
i=0;
i-)temp=0;
for(j=i+1;
j=n-1;
j+)temp+=-1*Jij*Vj;
Vi=-1*(Wi-temp)/Jii;
voidFINDPQ(doubleG30,doubleB30,doublee30,doublef30,doublePQ40)/平衡节点功率intk;
/以下计算节点的P+jQfor(i=0,j=0;
i+,j=j+2)/从PQ0PQ1开始存放节点功率P和Qtemp1=0,temp2=0;
k+)temp1+=Gik*ek-Bik*fk;
16/20temp2+=Gik*fk+Bik*ek;
PQj=ei*temp1+fi*temp2;
PQj+1=fi*temp1-ei*temp2;
printf(ntt平衡节点功率:
P%d+jQ%d=%.7fl+j%.7lfn,point,point,PQ2*(point-1),PQ2*(point-1)+1);
voidpowerme(doubleG30,doubleB30,doublee30,doublef30,doublePQ40)/线路功率doubletemp1,temp2,temp3,temp5;
doubletemp;
intk,m;
for(k=0,m=19;
k=road-1;
k+,m=m+4)/从PQ19PQ20开始存放线路功率的P和Qif(linek.K=1)i=linek.jiedian0-1;
j=linek.jiedian1-1;
temp=ei*ei+fi*fi;
temp1=temp-(ei*ej+fi*fj);
/某实部temp2=fi*(ei-ej)-ei*(fi-fj);
/某虚部PQm=-1*(Gij*temp1+Bij*temp2);
/好实部PQm+1=-1*temp*linek.B0-Gij*temp2+Bij*temp1;
/好虚部j=linek.jiedian0-1;
i=linek.jiedian1-1;
/某虚部PQm+2=-1*(Gij*temp1+Bij*temp2);
/好实部PQm+3=-1*temp*linek.B0-Gij*temp2+Bij*temp1;
/好虚部elsetemp3=linek.K-1/linek.K;
temp5=linek.R*linek.R+linek.X*linek.X;
i=linek.jiedian0-1;
/某虚部PQm=temp*temp3*linek.R/temp5-1*(Gij*temp1+Bij*temp2);
/变压器低压侧功率实部PQm+1=temp*temp3*linek.X/temp5+Bij*temp1-Gij*temp2;
/变压器低压侧功率虚部17/20temp3=1-linek.K/linek.K*linek.K;
j=linek.jiedian0-1;
/某虚部PQm+2=temp*temp3*linek.R/temp5-1*(Gij*temp1+Bij*temp2);
/变压器高压侧功率实部PQm+3=temp*temp3*linek.X/temp5+Bij*te
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 潮流 计算 牛顿 拉夫逊法 直角坐标