牛顿-拉夫逊迭代法极坐标潮流计算C语言程序
- 格式:doc
- 大小:90.50 KB
- 文档页数:17
. ;. /*利用牛顿-拉夫逊迭代法(极坐标形式),计算复杂电力系统潮流,具有收敛性好,收敛速度快等优点。所有参数应归算至标幺值下。 /*可计算最大节点数为100,可计算PQ,PV,平衡节点*/ /*可计算非标准变比和平行支路*/ #include #include #include #define M 100 /*最大矩阵阶数*/ #define Nl 100 /*迭代次数*/
int i,j,k,a,b,c; /*循环控制变量*/ int t,l; double P,Q,H,J; /*中间变量*/ int n, /*节点数*/ m, /*支路数*/ pq, /*PQ节点数*/ pv; /*PV节点数*/ double eps; /*迭代精度*/ double aa[M],bb[M],cc[M],dd[M],max, rr,tt; /*中间变量*/ double mo,c1,d1,c2,d2; /*复数运算函数的返回值*/ double G[M][M],B[M][M],Y[M][M]; /*节点导纳矩阵中的实部、虚部及其模方值*/ double ykb[M][M],D[M],d[M],dU[M]; /*雅克比矩阵、不平衡量矩阵*/
struct jd /*节点结构体*/ { int num,ty; /* num为节点号,ty为节点类型*/ double p,q,S,U,zkj,dp,dq,du,dj; /*节点有功、无功功率,功率模值,电压模值,阻抗角 牛顿--拉夫逊中功率不平衡量、电压修正量*/ } jd[M];
struct zl /*支路结构体*/ { int numb; /*numb为支路号*/ int p1,p2; /*支路的两个节点*/ double kx; /*非标准变比*/ double r,x; /*支路的电阻与电抗*/ } zl[M]; FILE *fp1,*fp2; void data() /* 读取数据 */ { int h,number; fp1=fopen("input.txt","r"); fscanf(fp1,"%d,%d,%d,%d,%lf\n",&n,&m,&pq,&pv,&eps); /*输入节点数,支路数,PQ. ;. 节点数,PV节点数和迭代精度*/ for(i=1;i<=n;i++) /*输入节点编号、类型、输入功率和电压初值*/ { fscanf(fp1,"%d,%d",&number,&h); if(h==1) /*类型h=1是PQ节点*/ { fscanf(fp1,"%lf,%lf,%lf,%lf\n",&jd[i].p,&jd[i].q,&jd[i].U,&jd[i].zkj); jd[i].num=number; jd[i].ty=h; } if(h==2) /*类型h=2是pv节点*/ { fscanf(fp1,",%lf,%lf,%lf\n",&jd[i].p,&jd[i].U,&jd[i].zkj); jd[i].num=number; jd[i].ty=h; jd[i].q=-1.567; } if(h==3) /*类型h=3是平衡节点*/ { fscanf(fp1,",%lf,%lf\n",&jd[i].U,&jd[i].zkj); jd[i].num=number; jd[i].ty=h; } } for(i=1;i<=m;i++) /*输入支路阻抗*/
fscanf(fp1,"%d,%lf,%d,%d,%lf,%lf\n",&zl[i].numb,&zl[i].kx,&zl[i].p1,&zl[i].p2,&zl[i].r,&zl[i].x); fclose(fp1); if((fp2=fopen("output.txt","w"))==NULL) { printf(" can not open file!\n"); exit(0); }
fprintf(fp2," 电力系统潮流计算\n "); fprintf(fp2," ********** 原始数据 *********\n"); . ;. fprintf(fp2,"================================================================================\n"); fprintf(fp2," 节点数:%d 支路数:%d PQ节点数:%d PV节点数:%d 精度:%f\n", n,m,pq,pv,eps); fprintf(fp2," ------------------------------------------------------------------------------\n"); for(i=1;i<=pq;i++) fprintf(fp2," PQ节点: 节点%d P[%d]=%f Q[%d]=%f\n", jd[i].num,jd[i].num,jd[i].p,jd[i].num,jd[i].q); for(i=pq+1;i<=pq+pv;i++) fprintf(fp2," PV节点: 节点%d P[%d]=%f U[%d]=%f 初值Q[%d]=%f\n", jd[i].num,jd[i].num,jd[i].p,jd[i].num,jd[i].U,jd[i].num,jd[i].q); fprintf(fp2," 平衡节点: 节点%d e[%d]=%f f[%d]=%f\n", jd[n].num,jd[n].num,jd[n].U,jd[n].num,jd[n].zkj); fprintf(fp2," -------------------------------------------------------------------------------\n"); for(i=1;i<=m;i++) fprintf(fp2," 支路%d: 相关节点:%d,%d 非标准变比:kx=%f R=%f X=%f \n", i,zl[i].p1,zl[i].p2,zl[i].kx,zl[i].r,zl[i].x); fprintf(fp2," ==============================================================================\n"); }
/*------------------------------------复数运算函数--------------------------------------*/ double mozhi(double a0,double b0) /*复数求模值函数*/ { mo=sqrt(a0*a0+b0*b0); return mo; } double ji(double a1,double b1,double a2,double b2) /*复数求积函数 a1为电压模值,a2为阻抗角,a3为导纳实部,a4为导纳虚部*/ { a1=a1*cos(b1); b1=a1*tan(b1); c1=a1*a2-b1*b2; d1=a1*b2+a2*b1; return c1; return d1; } double shang(double a3,double b3,double a4,double b4) /*复数除法求商函数*/ { c2=(a3*a4+b3*b4)/(a4*a4+b4*b4); d2=(a4*b3-a3*b4)/(a4*a4+b4*b4); return c2; return d2; } . ;. /*--------------------------------计算节点导纳矩阵----------------------------------*/ void Form_Y() { for(i=1;i<=n;i++) /*节点导纳矩阵元素附初值*/ for(j=1;j<=n;j++) G[i][j]=B[i][j]=0;
for(i=1;i<=n;i++) /*节点导纳矩阵的主对角线上的元素,非对地导纳加入相应的主对角线元素中(考虑非标准变比)*/ for(j=1;j<=m;j++) if(zl[j].p1==i) { if(zl[j].kx==1) { mozhi(zl[j].r,zl[j].x); if(mo==0) continue; shang(1,0,zl[j].r,zl[j].x); G[i][i]+=c2; B[i][i]+=d2; } else { mozhi(zl[j].r,zl[j].x); if(mo==0) continue; shang(1,0,zl[j].r,zl[j].x); G[i][i]+=c2/zl[j].kx+c2*(1-zl[j].kx)/(zl[j].kx*zl[j].kx); B[i][i]+=d2/zl[j].kx+d2*(1-zl[j].kx)/(zl[j].kx*zl[j].kx); }
} else if(zl[j].p2==i) { if(zl[j].kx==1) { mozhi(zl[j].r,zl[j].x); if(mo==0) continue; shang(1,0,zl[j].r,zl[j].x); G[i][i]+=c2; B[i][i]+=d2; } else