牛顿-拉夫逊迭代法极坐标潮流计算C语言程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*利用牛顿-拉夫逊迭代法(极坐标形式),计算复杂电力系统潮流,具有收敛性好,收敛速度快等优点。所有参数应归算至标幺值下。
/*可计算最大节点数为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;