电力系统潮流计算完整c语言程序(含网损计算的最终版)
潮流计算代码c
《电力系统潮流上机》课程设计报告院系:电气与电子工程学院班级:电气1405学号: **********学生姓名:指导教师:***设计周数:两周成绩:日期:2017年7月5日一、课程设计的目的与要求培养学生的电力系统潮流计算机编程能力,掌握计算机潮流计算的相关知识二、设计正文1.掌握计算机潮流计算的原理:a)复习电力系统分析基础中潮流的计算机算法一章,重点掌握节点分类、潮流算法介绍b)详细阅读牛拉法部分,掌握潮流方程(极坐标、直角坐标)的写法,掌握雅可比矩阵的公式及排列顺序和潮流方程、变量顺序的关系,掌握迭代法收敛条件及迭代法的基本原理c)设计程序框图,划分功能模块、并对每个模块的输入输出量进行细化。
2.编写计算机潮流计算程序a)学习了解IEEE标准格式数据,学习掌握C/C++读取数据的方法b)设计计算机数据存储母线、支路数据的结构,并将所读取的数据存放于所设计的结构当中c)学习节点排序、节点导纳阵计算方法,编写节点导纳阵生成模块d)编写潮流方程不平衡量计算模块e)编写雅可比矩阵生成子模块f)利用给定的pfMatrix类,编写修正量计算模块g)实现潮流计算主程序,并利用IEEE标准节点数据进行校验,要求能够输出计算结果、支路潮流等必要信息3.思考题1.潮流计算的方法有哪些?各有何特点?答:潮流计算分为简单电力网络的手算和复杂电力网络的机算两大类,其中机算又有高斯-赛德尔法、牛顿-拉夫逊法和P-Q分解法。
各方法特点如下所示:手算求解潮流一般只用于简单的网络中,计算量大,对于多节点的网络用手算一般难以解决问题。
但是通过手算可以对物理概念的理解,还可以在运用计算机计算前由手算的形式求取某些原始数据。
2.如果交给你一个任务,请你用已有的潮流计算软件计算北京城市电网的潮流,你应该做哪些工作?(收集哪些数据,如何整理,计算结果如何分析)答:①.所需要收集的数据:A.电网中所有节点的数据:a.各节点的类型,包括平衡节点、PV 节点、PQ 节点b. 对于平衡节点要了解节点的电压大小相位、及节点所能提供的最大最小有功无功功率c. PV节点要知道节点电压大小注入有功功率及节点所能提供的最大和最小无功功.率d. PQ节点要知道节点的注入有功和无功功率B.电网中所有支路的数据:a.各支路类型,即是否含有变压器b.各支路的电阻、电感、电纳c.各变压器的变比。
电力系统潮流计算C语言程序及说明
程序的稳定性分析
程序在不同计算机上的运行 结果是否一致。
程序运行过程中,输入数据 的变化对输出结果的影响程 度。
程序在长时间运行过程中, 输出结果是否保持稳定。
程序在处理异常情况时的表 现和稳定性。
程序的扩展性分析
代码可读性:C语言程序应具备良好的可读性,方便后续维护和修改 算法效率:C语言程序应采用高效的算法,提高计算速度 内存占用:C语言程序应合理利用内存,避免内存泄漏和不必要的内存占用 扩展性:C语言程序应具备良好的扩展性,方便添加新功能和优化性能
THANK YOU
汇报人:XX
程序的异常处理说明
异常类型:输入 错误、计算错误、 内存不足等
异常处理方式: 使用try-catch 语句进行异常捕 获和处理
异常处理流程: 当异常发生时, 程序会输出错误 信息并终止运行
异常处理结果: 确保程序在遇到 异常时能够正确 处理并给出相应 的提示信息
C语言程序应用示例
示例程序的输入数据格式
添加标题
添加标题
添加标题Βιβλιοθήκη 输入输出函数:用于数据的输入和 输出
函数:可重复使用的代码块,具有 特定的功能
C语言程序中电力系统模型的建立
定义节点和支路:根 据电力系统网络结构, 定义节点和支路,为 潮流计算做准备。
建立数学模型:根据 电力系统的物理特性 和元件参数,建立数 学模型,包括节点电 压、支路电流等。
实际运行时 间测试
程序的内存占用性能分析
内存占用情况:分 析程序运行过程中 内存的占用情况, 包括堆内存和栈内 存。
内存泄漏检测:检 查程序是否存在内 存泄漏,即程序运 行结束后未正确释 放的内存。
内存使用优化:根 据内存占用情况, 优化程序中的数据 结构或算法,降低 内存占用。
电力系统潮流计算
3.2.1 节点电压方程与节点导纳矩阵和阻抗矩阵
将节点电压法应用于电力系统潮流计算,变量为节点电压与节
点注入电流。通常以大地作为电压幅值的参考(U0 = 0),以
系统中某一指定母线的电压角度作为电压相角的参考,以支路
导纳作为电力网的参数进行计算。节点注入电流规定为流向网
络为正,流出为负。
Pmax P
表征年有功负荷曲线特点的两个指标
0
年最大负荷利用小时数 Tmax
t Tmax 8760
根据年负荷曲线,可求得全年所需电能:
8760
A 0
Pdt MWh
定义年最大负荷(最大值 Pmax)利用小时: Tmax
A Pmax
h
Tmax 越大,负荷曲线越平坦
负荷曲线为一水平线时, Tmax 达到最大值8760 (h)
2
1 ZT1
2
Zl
T2
34
3
ZT2 4
YT3
Yl /2
YT2
已知末端功率和电压, 计算网上潮流分布。
1 ZT1 2 Zl
3 ZT2 4
已知始端功率和电压, 计算网上潮流分布。
Y20
Y30
已知末端功率和始端电 压,计算网上的潮流。
不管哪种情况,先作等值电路
3.1.3 辐射形网络的分析计算
1)已知末端功率、电压 利用前面的方法,从末端逐级 往上推算,直至求得各要求的量。
Pm(t)
损耗称年电能损耗,是电网运行经
济性的指标。
Pmi
1)年电能损耗的准确计算方法
已知各负荷的年有功和无功负荷曲线 时,理论上可准确计算年电能损耗。
8760小时分为 n 段,第 i 时段时间为 Dti (h),全网功率损耗为DPi (MW),则 全网年电能损耗为
潮流计算源程序
潮流计算源程序/***********************************************************文件名称:潮流计算程序.cpp作者:版本:v1.0说明:修改记录:***********************************************************/#include<stdio.h>#include<math.h>#include<stdlib.h>/******************macro definition************************/#define M 100 /*矩阵阶数*/#define N 100 /*迭代次数*//*******************global variables***********************/int i,j,k,a,b,c; /*循环控制变量*/int t,l,g; /*中间变量*/int n, /* 节点数*/m, /* 支路数*/pq, /* PQ节点数*/pv, /* PV节点数*/duidi; /*对地支路数*/double eps; /* 精度*/double aa[M],bb[M],cc[M],dd[M],max,temp, rr,tt; /*中间变量*/double mo,c1,d1,c2,d2,fushuqiujiao; /*复数运算函数的返回值*/ double G[M][M],B[M][M],Y[M][M]; /*节点导纳矩阵中的实部、虚部及其模方值*/double ykb[M][M],D[M],dU[M]; /*雅克比矩阵、不平衡量矩阵*/struct jd /* 节点结构体*/ { int num,s; /* num为节点号,s为节点类型*/double p,q,S,e,f,U,zkj,dp,dq,du,de,df; /*节点有功、无功功率,功率模值,电压纵、横分量,电压模值,阻抗角,牛顿--拉夫逊中功率不平衡量、电压不平衡量*/} jd[M];struct zhl /* 支路结构体*/{ int numb; /*numb为支路号*/ int p1,p2; /*支路的两个节点*/double r,x; /*支路的电阻与电抗*/ } zhl[M];FILE *fp1,*fp2;/***********************************************************函数名称:void ReadData()函数功能:读取数据入口参数:出口参数:备注:***********************************************************/void ReadData(){int h,number;fp1=fopen("input.txt","r");if(fp1==NULL) /*如果输入为空则跳出*/{printf(" can not open file !\n");exit(0);}fscanf(fp1,"%d,%d,%d,%d,%d,%lf\n",&n,&m,&pq,&pv,&duidi,&eps); /*输入节点数,支路数,PQ节点数,PV节点数对地支路数和精度*/j=1;k=pq+1;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[j].p,&jd[j].q,&jd[j].e,&jd[j].f);jd[j].num=number;jd[j].s=h;j++;}if(h==2) /*类型h=2是pv节点*/{fscanf(fp1,",%lf,%lf\n",&jd[k].p,&jd[k].U);jd[k].num=number;jd[k].s=h;jd[k].q=0;k++;}if(h==3) /*类型h=3是平衡节点*/{fscanf(fp1,",%lf,%lf\n",&jd[n].e,&jd[n].f);jd[n].num=number;jd[n].s=h;}}for(i=1;i<=m;i++) /*输入支路阻抗*/fscanf(fp1,"%d,%d,%d,%lf,%lf\n",&zhl[i].numb,&zhl[i].p1,&zhl[i].p2,&zhl[i].r,&zhl[i].x);fclose(fp1);if((fp2=fopen("output.txt","w"))==NULL){printf(" can not open file!\n");exit(0);}fprintf(fp2,"\n 潮流上机实习华北电力大学电气化0807 段春姝200801000705\n");fprintf(fp2,"\n ********** 原始数据*********\n");fprintf(fp2,"====================================================================== ========\n");fprintf(fp2," 节点数:%d 支路数:%d PQ节点数:%d PV节点数:%d 对地支路数:%d 精度:%f\n",n,m,pq,pv,duidi,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].e,jd[n].num,jd[n].f);fprintf(fp2," -------------------------------------------------------------------------------\n");for(i=1;i<=m;i++)fprintf(fp2," 支路%d: 相关节点:%d,%d R=%f X=%f\n",i,zhl[i].p1,zhl[i].p2,zhl[i].r,zhl[i].x);fprintf(fp2,"====================================================================== ========\n");}/***********************************************************函数名称:double fushuqiumo(double a0,double b0)函数功能:复数运算函数入口参数:double a0,double b0出口参数:double备注:***********************************************************/double fushuqiumo(double a0,double b0) /*复数求模值函数*/ { mo=sqrt(a0*a0+b0*b0);return mo;}double fushuqiuji(double a1,double b1,double a2,double b2) /*复数求积函数*/{ c1=a1*a2-b1*b2;d1=a1*b2+a2*b1;return c1;return d1;}double fushuqiushang(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;}double fushuqiufushufujiao(double a5,double b5) /*复数求幅角函数*/{ if(a5>0)fushuqiujiao=atan(b5/a5);if(a5<0&&b5>=0)fushuqiujiao=3.1415926+atan(b5/a5);if(a5<0&&b5<0)fushuqiujiao=atan(b5/a5)-3.1415926;if(a5==0&&b5>0)fushuqiujiao=3.1415926/2;if(a5==0&&b5<0)fushuqiujiao=-3.1415926/2;if(a5==0&&b5==0)fushuqiujiao=0;return fushuqiujiao;}/***********************************************************函数名称:void Form_Y()函数功能:计算节点导纳矩阵入口参数:出口参数:备注:***********************************************************/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<=m;i++) /*将对地导纳加入相应的主对角线元素中*/{if((zhl[i].p1==0)||(zhl[i].p2==0)){fushuqiumo(zhl[i].r,zhl[i].x);if(mo==0){G[zhl[i].p1][zhl[i].p2]=B[zhl[i].p1][zhl[i].p2]=G[zhl[i].p2][zhl[i].p1]=B[zhl[i].p2][zhl[i].p1] =0;continue;}fushuqiushang(1,0,zhl[i].r,zhl[i].x);if(zhl[i].p1==0){G[zhl[i].p2][zhl[i].p2]+=c2;B[zhl[i].p2][zhl[i].p2]+=d2;}if(zhl[i].p2==0){G[zhl[i].p1][zhl[i].p1]+=c2;B[zhl[i].p1][zhl[i].p1]+=d2;}}}for(i=1;i<=n;i++) /*非对地导纳加入相应的主对角线元素中*/for(j=1;j<=m;j++)if(zhl[j].p1==i||zhl[j].p2==i){fushuqiumo(zhl[j].r,zhl[j].x);if(mo==0) continue;fushuqiushang(1,0,zhl[j].r,zhl[j].x);G[i][i]+=c2;B[i][i]+=d2;}for(k=1;k<=m;k++) /*节点导纳矩阵非主对角线上的元素*/{i=zhl[k].p1;j=zhl[k].p2;fushuqiumo(zhl[k].r,zhl[k].x);if(mo==0) continue;fushuqiushang(1,0,zhl[k].r,zhl[k].x);G[i][j]-=c2;B[i][j]-=d2;G[j][i]=G[i][j];B[j][i]=B[i][j];}/*--------------------------输出节点导纳矩阵------------------------------*/fprintf(fp2,"\n\n ********* 潮流计算过程*********\n"); fprintf(fp2,"\n====================================================================== ========\n");fprintf(fp2,"\n 节点导纳矩阵为:");for(i=1;i<=n;i++){fprintf(fp2,"\n ");for(k=1;k<=n;k++){fprintf(fp2,"%f",G[i][k]);if(B[i][k]>=0){fprintf(fp2,"+j");fprintf(fp2,"%f ",B[i][k]);}else{B[i][k]=-B[i][k];fprintf(fp2,"-j");fprintf(fp2,"%f ",B[i][k]);B[i][k]=-B[i][k];}}}fprintf(fp2,"\n ------------------------------------------------------------------------------\n");}/***********************************************************函数名称:void fuchuzhi()函数功能:赋初值入口参数:出口参数:备注:***********************************************************/void fuchuzhi(){for(i=1;i<=pq;i++) /* e、f赋初值*/{jd[i].e=1; jd[i].f=0;}for(i=pq+1;i<n;i++){jd[i].e=jd[i].U; jd[i].f=0;}}/***********************************************************函数名称:void Calculate_Unbalanced_Value()函数功能:计算不平衡功率和电压入口参数:出口参数:备注:***********************************************************/void Calculate_Unbalanced_Value(){for(i=1;i<=n;i++){if(jd[i].s==1) /*计算PQ节点不平衡量*/{t=jd[i].num;cc[t]=dd[t]=0;for(j=1;j<=n;j++){for(a=1;a<=n;a++){if(jd[a].num==j)break;}fushuqiuji(G[t][j],-B[t][j],jd[a].e,-jd[a].f);cc[t]+=c1;dd[t]+=d1;}fushuqiuji(jd[i].e,jd[i].f,cc[t],dd[t]);jd[i].dp=jd[i].p-c1;jd[i].dq=jd[i].q-d1;}if(jd[i].s==2) /*计算PV节点不平衡量*/ {t=jd[i].num;cc[t]=dd[t]=0;for(j=1;j<=n;j++){for(a=1;a<=n;a++){if(jd[a].num==j)break;}fushuqiuji(G[t][j],-B[t][j],jd[a].e,-jd[a].f);cc[t]+=c1;dd[t]+=d1;}fushuqiuji(jd[i].e,jd[i].f,cc[t],dd[t]);jd[i].dp=jd[i].p-c1;jd[i].q=d1;jd[i].du=jd[i].U*jd[i].U-(jd[i].e*jd[i].e+jd[i].f*jd[i].f);}}for(i=1;i<=pq;i++) /*形成不平衡量矩阵D[M]*/ {D[2*i-1]=jd[i].dp;D[2*i]=jd[i].dq;}for(i=pq+1;i<=g;i++){D[2*i-1]=jd[i].dp;D[2*i]=jd[i].du;}fprintf(fp2,"\n 不平衡量为:");for(i=1;i<=pq;i++){t=jd[i].num;fprintf(fp2,"\n dp[%d]=%f",i,D[2*t-1]);fprintf(fp2,"\n dq[%d]=%f",i,D[2*t]);}for(i=pq+1;i<=g;i++){t=jd[i].num;fprintf(fp2,"\n dp[%d]=%f",i,D[2*t-1]);fprintf(fp2,"\n du[%d]=%f",i,D[2*t]);}}/***********************************************************函数名称:void Form_Jacobi_Matric()函数功能:形成雅克比矩阵入口参数:出口参数:备注:***********************************************************/void Form_Jacobi_Matric(){for(i=1;i<=pq;i++) /*形成pq节点子阵*/for(j=1;j<n;j++){int i1=jd[i].num;int j1=jd[j].num;double ei=jd[i].e;double ej=jd[j].e;double fi=jd[i].f;double fj=jd[j].f;if(i!=j) /*求i!=j时的H、N、J、L*/{ykb[2*i-1][2*j-1]=-B[i1][j1]*ei+G[i1][j1]*fi; /* H */ykb[2*i-1][2*j]=G[i1][j1]*ei+B[i1][j1]*fi; /* N */ykb[2*i][2*j-1]=-G[i1][j1]*ei-B[i1][j1]*fi; /* J */ykb[2*i][2*j]=-B[i1][j1]*ei+G[i1][j1]*fi; /* L */}else /*求i=j时的H、N、J、L*/{aa[i]=0;bb[i]=0;for(k=1;k<=n;k++){int k1=jd[k].num;fushuqiuji(G[i1][k1],B[i1][k1],jd[k].e,jd[k].f);aa[i]=aa[i]+c1;bb[i]=bb[i]+d1;}ykb[2*i-1][2*j-1]=-B[i1][i1]*ei+G[i1][i1]*fi+bb[i]; /*H*/ykb[2*i-1][2*j]=G[i1][i1]*ei+B[i1][i1]*fi+aa[i]; /*N*/ykb[2*i][2*j-1]=-G[i1][i1]*ei-B[i1][i1]*fi+aa[i]; /*J*/ykb[2*i][2*j]=-B[i1][i1]*ei+G[i1][i1]*fi-bb[i]; /*L*/}}for(i=pq+1;i<=g;i++) /*形成pv节点子阵*/ for(j=1;j<n;j++){int i1=jd[i].num;int j1=jd[j].num;double ei=jd[i].e;double ej=jd[j].e;double fi=jd[i].f;double fj=jd[j].f;if(i!=j) /*求i!=j时的H、N*/{ykb[2*i-1][2*j-1]=-B[i1][j1]*ei+G[i1][j1]*fi; /*H*/ykb[2*i-1][2*j]=G[i1][j1]*ei+B[i1][j1]*fi; /*N*/ykb[2*i][2*j-1]=ykb[2*i][2*j]=0; /*R、S*/}else /*求i=j时的H、N、R、S*/{aa[i]=0;bb[i]=0;for(k=1;k<=n;k++){int k1=jd[k].num;fushuqiuji(G[i1][k1],B[i1][k1],jd[k].e,jd[k].f);aa[i]=aa[i]+c1;bb[i]=bb[i]+d1;}ykb[2*i-1][2*j-1]=-B[i1][i1]*ei+G[i1][i1]*fi+bb[i]; /*H*/ykb[2*i-1][2*j]=G[i1][i1]*ei+B[i1][i1]*fi+aa[i]; /*N*/ykb[2*i][2*j-1]=2*fi; /*R*/ykb[2*i][2*j]=2*ei; /*S*/ }}/*------------------------------输出雅克比矩阵--------------------------------*/fprintf(fp2,"\n\n 雅克比矩阵为: ");for(i=1;i<=2*g;i++){fprintf(fp2,"\n");for(j=1;j<=2*g;j++){fprintf(fp2," %f",ykb[i][j]);}}}/***********************************************************函数名称:void Solve_Equations()函数功能:求解修正方程组入口参数:出口参数:备注:用列主元消取法***********************************************************/void Solve_Equations(){for(i=1;i<=2*g;i++) /*把函数参量矩阵编入修正方程*/ ykb[i][2*g+1]=D[i];k=1;do{rr=ykb[k][k];l=k;i=k+1;do{if(fabs(ykb[i][k])>fabs(rr)) /*列选主元*/{rr=ykb[i][k];l=i;}i++;} while(i<=2*g);if(l!=k){for(j=k;j<=2*g+1;j++){tt=ykb[l][j];ykb[l][j]=ykb[k][j];ykb[k][j]=t;}}for(j=k+1;j<=2*g+1;j++) /*消元*/ykb[k][j]/=ykb[k][k];for(i=k+1;i<=2*g;i++)for(j=k+1;j<=2*g+1;j++)ykb[i][j]-=ykb[i][k]*ykb[k][j];k++;} while(k<=2*g);if(k!=1){for(i=2*g;i>=1;i--) /*回代*/{tt=0;for(j=i+1;j<=2*g;j++)tt+=ykb[i][j]*D[j];D[i]=ykb[i][2*g+1]-tt;}}for(i=1;i<=g;i++){jd[i].e+=D[2*i];jd[i].f+=D[2*i-1];}max=fabs(D[1]);for(i=1;i<=2*(pq+pv);i++)if(fabs(D[i])>max)max=fabs(D[i]);}/***********************************************************函数名称:void Niudun_Lafuxun()函数功能:牛顿--拉夫逊入口参数:出口参数:备注:***********************************************************/void Niudun_Lafuxun(){int z=1;fprintf(fp2,"\n --------------牛顿--拉夫逊迭代次数及结果:--------------\n");g=pq+pv;do{ max=1;if((z<N)&&(max>=eps)){fprintf(fp2,"\n 迭代次数: %d\n",z);}Calculate_Unbalanced_Value();Form_Jacobi_Matric();Solve_Equations();fprintf(fp2,"\n\n 输出df,de: ");for(c=1;c<=n;c++){for(a=1;a<=n;a++){if(jd[a].num==c)break;}fprintf(fp2,"\n");fprintf(fp2," 节点为%2d df=%8.5f de=%8.5f",c,D[2*a-1],D[2*a]);}fprintf(fp2,"\n\n 输出迭代过程中的电压值: ");for(c=1;c<=n;c++){for(a=1;a<=n;a++){if(jd[a].num==c)break;}fprintf(fp2,"\n U[%d]=%f",c,jd[a].e);if(jd[a].f>=0)fprintf(fp2,"+j%f",jd[a].f);elsefprintf(fp2,"-j%f",-jd[a].f);}fprintf(fp2,"\n\n ------------------------------------------------------------------------------");z++;} while((z<N)&&(max>=eps));}/***********************************************************函数名称:void Powerflow_Result()函数功能:输出潮流计算结果入口参数:出口参数:备注:***********************************************************/void Powerflow_Result(){int n1=jd[n].num;fprintf(fp2,"\n\n====================================================================== ========\n\n");fprintf(fp2," ******潮流计算结果******");fprintf(fp2,"\n\n====================================================================== ========\n\n");fprintf(fp2,"\n 各节点电压值: ");for(c=1;c<=n;c++){for(a=1;a<=n;a++){if(jd[a].num==c)break;}fprintf(fp2,"\n U[%d]=%f",c,jd[a].e);if(jd[a].f>=0)fprintf(fp2,"+j%f",jd[a].f);elsefprintf(fp2,"-j%f",-jd[a].f);}rr=tt=0;for(i=1;i<=n;i++){int i1=jd[i].num;fushuqiuji(G[n1][i1],-B[n1][i1],jd[i].e,-jd[i].f);rr+=c1;tt+=d1;}fushuqiuji(jd[n].e,jd[n].f,rr,tt);fprintf(fp2,"\n\n 各节点注入功率:\n");for(i=1;i<=pq;i++){int i1=jd[i].num;fprintf(fp2," PQ节点: 节点%d S[%d]=%f", i1,i1,jd[i].p);if(jd[i].q>=0)fprintf(fp2,"+j%f\n",jd[i].q);elsefprintf(fp2,"-j%f\n",-jd[i].q);}for(i=pq+1;i<=g;i++){int i1=jd[i].num;fprintf(fp2," PV节点: 节点%d S[%d]=%f", i1,i1,jd[i].p);if(jd[i].q>=0)fprintf(fp2,"+j%f\n",jd[i].q);elsefprintf(fp2,"-j%f\n",-jd[i].q);}fprintf(fp2," 平衡节点: 节点%d",jd[n].num,jd[n].num);fprintf(fp2," S[%d]=%f",n1,c1);if(d1>=0)fprintf(fp2,"+j%f",d1);elsefprintf(fp2,"-j%f",-d1);fprintf(fp2,"\n\n 线路功率:\n");rr=tt=0;for(i=1;i<=m;i++){int i1=zhl[i].p1;int j1=zhl[i].p2;aa[i]=bb[i]=0;for(a=1;a<=n;a++){if(jd[a].num==i1)break;}for(b=1;b<=n;b++){if(jd[b].num==j1)break;}fushuqiumo(zhl[i].r,zhl[i].x);if(mo==0)continue;fushuqiushang(1,0,zhl[i].r,zhl[i].x);fushuqiuji(jd[a].e-jd[b].e,-jd[a].f+jd[b].f,c2,-d2);fushuqiuji(jd[a].e,jd[a].f,c1,d1);fprintf(fp2," 支路%d: 线路%d--%d 的功率为: %f",i,i1,j1,c1);if(d1>=0)fprintf(fp2,"+j%f\n",d1);elsefprintf(fp2,"-j%f\n",-d1);aa[i]+=c1;bb[i]+=d1;fushuqiuji(jd[b].e-jd[a].e,-jd[b].f+jd[a].f,c2,-d2);fushuqiuji(jd[b].e,jd[b].f,c1,d1);fprintf(fp2," 支路%d: 线路%d--%d 的功率为: %f",i,j1,i1,c1);if(d1>=0)fprintf(fp2,"+j%f\n",d1);elsefprintf(fp2,"-j%f\n",-d1);aa[i]+=c1;bb[i]+=d1;rr+=aa[i];tt+=bb[i];}fprintf(fp2,"\n\n 线路损耗功率:\n");for(i=1;i<=m;i++){int i1=zhl[i].p1;int j1=zhl[i].p2;fprintf(fp2," 支路%d: 线路%d--%d 损耗的功率为: %f",i,i1,j1,aa[i]);if(bb[i]>=0)fprintf(fp2,"+j%f\n",bb[i]);elsefprintf(fp2,"-j%f\n",-bb[i]);}fprintf(fp2,"\n\n 网络总损耗功率为: %f",rr);if(tt>=0)fprintf(fp2,"+j%f\n",tt);elsefprintf(fp2,"-j%f\n",-tt);fprintf(fp2,"\n====================================================================== ========\n");fprintf(fp2,"\n\n ********* 潮流计算结束*********");}/***********************************************************函数名称:void main()函数功能:主函数入口参数:出口参数:备注:***********************************************************/void main(){ReadData(); /*读取数据*/Form_Y(); /*形成节点导纳矩阵*/fuchuzhi(); /*赋初值*/Niudun_Lafuxun(); /*牛顿--拉夫逊迭代*/Powerflow_Result();printf("!!******计算结果存放于output.txt文件中******!!\n");}潮流计算输入文件3,2,2,0,0,0.000101,1,-0.8,0.6,1,02,1,-0.8,0.6,1,03,3,1,01,1,3,0.049,0.22,2,3,0.01,0.02给定题目题号:1183个节点两条支路无对地支路节点个数支路条数PQ节点数PV节点数对地支路数精度要求(PQ节点)节点编号节点类型(1)输入有功输入无功电压实部初值电压虚部初值(PV节点)节点编号节点类型(2)输入有功电压实部初值(平衡节点)节点编号节点类型(3)输入有功电压实部初值(依次列写)支路号支路所连节点(两个)支路电阻支路电抗(依次列写)潮流计算输出程序文件潮流上机实习华北电力大学电气化0807 段春姝200801000705********** 原始数据*********====================================================================== ========节点数:3 支路数:2 PQ节点数:2 PV节点数:0 对地支路数:0 精度:0.000100------------------------------------------------------------------------------PQ节点: 节点1 P[1]=-0.800000 Q[1]=0.600000PQ节点: 节点2 P[2]=-0.800000 Q[2]=0.600000平衡节点: 节点3 e[3]=1.000000 f[3]=0.000000-------------------------------------------------------------------------------支路1: 相关节点:1,3 R=0.049000 X=0.200000支路2: 相关节点:2,3 R=0.010000 X=0.020000====================================================================== ========********* 潮流计算过程*********====================================================================== ========节点导纳矩阵为:1.155633-j4.716870 0.000000+j0.000000 -1.155633+j4.7168700.000000+j0.000000 20.000000-j40.000000 -20.000000+j40.000000-1.155633+j4.716870 -20.000000+j40.000000 21.155633-j44.716870--------------------------------------------------------------------------------------------牛顿--拉夫逊迭代次数及结果:--------------迭代次数: 1不平衡量为:dp[1]=-0.800000dq[1]=0.600000dp[2]=-0.800000dq[2]=0.600000雅克比矩阵为:4.716870 1.155633 0.000000 0.000000-1.155633 4.716870 0.000000 0.0000000.000000 0.000000 40.000000 20.0000000.000000 0.000000 -20.000000 40.000000输出df,de:节点为 1 df=-0.18940 de= 0.08080节点为 2 df=-0.02200 de= 0.00400节点为 3 df= 0.00000 de= 0.00000输出迭代过程中的电压值:U[1]=1.080800-j0.189400U[2]=1.004000-j0.022000U[3]=1.000000+j0.000000------------------------------------------------------------------------------ 迭代次数: 2不平衡量为:dp[1]=-0.049000dq[1]=-0.200000dp[2]=-0.010000dq[2]=-0.020000雅克比矩阵为:4.279116 1.342383 0.000000 0.000000-2.942383 5.479116 0.000000 0.0000000.000000 0.000000 39.120000 20.1600000.000000 0.000000 -21.760000 40.320000输出df,de:节点为 1 df=-0.00000 de=-0.03650节点为 2 df=-0.00000 de=-0.00050节点为 3 df= 0.00000 de= 0.00000输出迭代过程中的电压值:U[1]=1.044298-j0.189400U[2]=1.003504-j0.022000U[3]=1.000000+j0.000000------------------------------------------------------------------------------ 迭代次数: 3不平衡量为:dp[1]=-0.001540dq[1]=-0.006285dp[2]=-0.000005dq[2]=-0.000010雅克比矩阵为:4.279116 1.258017 0.000000 0.000000-2.942383 5.134763 0.000000 0.0000000.000000 0.000000 39.120000 20.1401590.000000 0.000000 -21.760000 40.280317输出df,de:节点为 1 df= 0.00000 de=-0.00122节点为 2 df= 0.00000 de=-0.00000节点为 3 df= 0.00000 de= 0.00000输出迭代过程中的电压值:U[1]=1.043074-j0.189400U[2]=1.003504-j0.022000U[3]=1.000000+j0.000000------------------------------------------------------------------------------ 迭代次数: 4不平衡量为:dp[1]=-0.000002dq[1]=-0.000007dp[2]=-0.000000dq[2]=-0.000000雅克比矩阵为:4.279116 1.255188 0.000000 0.000000-2.942383 5.123217 0.000000 0.0000000.000000 0.000000 39.120000 20.1401490.000000 0.000000 -21.760000 40.280298输出df,de:节点为 1 df=-0.00000 de=-0.00000节点为 2 df=-0.00000 de=-0.00000节点为 3 df= 0.00000 de= 0.00000输出迭代过程中的电压值:U[1]=1.043072-j0.189400U[2]=1.003504-j0.022000U[3]=1.000000+j0.000000------------------------------------------------------------------------------====================================================================== ========******潮流计算结果******====================================================================== ========各节点电压值:U[1]=1.043072-j0.189400U[2]=1.003504-j0.022000U[3]=1.000000+j0.000000各节点注入功率:PQ节点: 节点1 S[1]=-0.800000+j0.600000PQ节点: 节点2 S[2]=-0.800000+j0.600000平衡节点: 节点3 S[3]=1.653525-j1.002193线路功率:支路1: 线路1--3 的功率为: -0.800000+j0.600000支路1: 线路3--1 的功率为: 0.843599-j0.422044支路2: 线路2--3 的功率为: -0.800000+j0.600000支路2: 线路3--2 的功率为: 0.809926-j0.580149线路损耗功率:支路1: 线路1--3 损耗的功率为: 0.043599+j0.177956支路2: 线路2--3 损耗的功率为: 0.009926+j0.019851网络总损耗功率为: 0.053525+j0.197807====================================================================== ========********* 潮流计算结束*********。
电力系统潮流及短路电流计算程序
班级:姓名:学号:一、作业要求编写程序计算图1所示算例系统的潮流及三相短路电流..潮流计算:方法不限;计算系统的节点电压和相角..短路电流:4号母线发生金属性三相短路时z f=0;分别按照精确算法和近似算法计算短路电流、系统中各节点电压以及网络中各支路的电流分布;并对两种情况下的计算结果进行比较..二、电路图及参数图1 3机9节点系统表1 9节点系统支路参数表2 9节点系统发电机参数表3 9节点系统负荷参数三、计算步骤(1) 进行系统正常运行状态的潮流计算;求得(0)i U (2) 形成不含发电机和负荷的节点导纳矩阵Y N ;(3) 将发电机表示为电流源i I /i diE jx ''=和导纳i y 1/di jx '=的并联组合;节点负荷用恒阻抗的接地支路表示;形成包括所有发电机支路和负荷支路的节点导纳矩阵Y;即在Y N 中的发电机节点和负荷节点的自导纳上分别增加发电机导纳i y 和负荷导纳,LD i y *,,22LD i LDi LDiLD i i i S P jQ y V V -==; (4) 利用1Z Y-=;计算节点阻抗矩阵;从而得到阻抗矩阵中的第f 列;(5) 利用公式6-7或6-10计算短路电流;(6)利用公式6-8或6-11计算系统中各节点电压;(7)利用公式6-9计算变压器支路的电流;对输电线路利用П型等值电路计算支路电流..四、计算结果节点导纳矩阵Yn:Columns 1 through 50 -17.3611i 0 0 0 +17.3611i 00 0 -16.0000i 0 0 00 0 0 -17.0648i 0 00 +17.3611i 0 0 3.3074 -39.3089i -1.3652 +11.6041i0 0 0 -1.3652 +11.6041i 2.5528 -17.3382i0 0 0 -1.9422 +10.5107i 00 0 +16.0000i 0 0 -1.1876 + 5.9751i0 0 0 0 00 0 0 +17.0648i 0 0 Columns 6 through 90 0 0 00 0 +16.0000i 0 00 0 0 0 +17.0648i-1.9422 +10.5107i 0 0 00 -1.1876 + 5.9751i 0 03.2242 -15.8409i 0 0 -1.2820 + 5.5882i0 2.8047 -35.4456i -1.6171 +13.6980i 00 -1.6171 +13.6980i 2.7722 -23.3032i -1.1551 + 9.7843i-1.2820 + 5.5882i 0 -1.1551 + 9.7843i 2.4371 -32.1539i电压幅值:1.0400 1.0250 1.0250 1.0258 0.9956 1.0127 1.0258 1.0159 1.0324电压相角:0 0.1620 0.0814 -0.0387 -0.0696 -0.0644 0.0649 0.0127 0.0343节点有功:0.7164 1.6300 0.8500 0.0000 -1.2500 -0.9000 -0.0000 -1.0000 -0.0000节点无功:0.2705 0.0665 -0.1086 0.0000 -0.5000 -0.3000 -0.0000 -0.3500 -0.0000修正后的节点导纳矩阵Y:Columns 1 through 50 -20.6944i 0 0 0 +17.3611i 00 0 -19.3333i 0 0 00 0 0 -20.3982i 0 00 +17.3611i 0 0 3.3074 -39.3089i -1.3652 +11.6041i0 0 0 -1.3652 +11.6041i 3.8716 -17.6627i0 0 0 -1.9422 +10.5107i 00 0 +16.0000i 0 0 -1.1876 + 5.9751i0 0 0 0 00 0 0 +17.0648i 0 0 Columns 6 through 90 0 0 00 0 +16.0000i 0 00 0 0 0 +17.0648i-1.9422 +10.5107i 0 0 00 -1.1876 + 5.9751i 0 04.1321 -16.0184i 0 0 -1.2820 +5.5882i0 2.8047 -35.4456i -1.6171 +13.6980i 00 -1.6171 +13.6980i 3.7323 -23.6669i -1.1551 + 9.7843i-1.2820 + 5.5882i 0 -1.1551 + 9.7843i 2.4371 -32.1539i节点阻抗矩阵Z的第4列:0.0463 + 0.1252i0.0329 + 0.0693i0.0316 + 0.0707i0.0552 + 0.1493i0.0589 + 0.1204i0.0562 + 0.1226i0.0397 + 0.0838i0.0416 + 0.0814i0.0378 + 0.0845i精确计算结果:短路电流:模值:6.4459相角:-71.9365节点电压模值:0.1831 0.5687 0.5427 0.0000 0.1466 0.1506 0.4537 0.4463 0.4495支路电流:i j Iij1 4 0.5779-3.1264i2 7 1.3702-1.4433i3 9 0.64294-1.4808i4 5 -0.77968+1.5248i4 6 -0.6411+1.477i5 7 -0.89528+1.6436i6 9 -0.73353+1.5487i7 8 0.50734+0.10234i8 9 0.062766+0.056451i近似计算结果:短路电流:模值:6.2838相角:-69.7198节点电压模值:0.1611 0.5214 0.5157 0.0000 0.1827 0.1675 0.4227 0.4348 0.4217五、程序流程图六、程序及输入文件input_data.xls 文件:powerflow_cal.m 文件:l=9;%支路数n=9;%节点数m=6;%PQ节点数Yn=zerosn;%初始化节点导纳矩阵Y DATA1=xlsread'input_data.xls';1; %计算节点导纳矩阵Yfor k=1:li=DATA1k;1;j=DATA1k;2;R=DATA1k;3;X=DATA1k;4;B2=DATA1k;5;Yni;i=Yni;i+1i*B2+1/R+1i*X; Ynj;j=Ynj;j+1i*B2+1/R+1i*X; Yni;j=Yni;j-1/R+1i*X;Ynj;i=Ynj;i-1/R+1i*X;enddisp'节点导纳矩阵Yn:';dispYn;G=realYn;B=imagYn;DATA2=xlsread'input_data.xls';2;P=zeros1;n;Q=zeros1;n;U=ones1;n;P2:n=DATA22:n;3;Q4:n=DATA24:n;4;U1:3=DATA21:3;5;%设置节点电压初值e1=DATA21;5;e2:n=1.0;f1:n=0.0;%设置迭代次数t=0;tmax=10;while t<=tmax%计算fxa1:n=0.0;c1:n=0.0;for i=2:nfor j=1:nai=ai+Gi;j*ej-Bi;j*fj;ci=ci+Gi;j*fj+Bi;j*ej;endendfor i=2:ndeltaPi=Pi-ei*ai-fi*ci;endfor j=4:ndeltaQj=Qj-fj*aj+ej*cj;endfor k=2:3deltaU2k=Uk*Uk-ek*ek-fk*fk;endfx=deltaP2:n deltaQ4:n deltaU22:3';%计算雅克比矩阵Jfor i=2:nfor j=2:nif i~=jHi;j=-Gi;j*ei+Bi;j*fi;Ni;j=Bi;j*ei-Gi;j*fi;elseHi;j=-ai-Gi;i*ei+Bi;i*fi;Ni;j=-ci+Bi;i*ei-Gi;i*fi;endendendfor i=4:nfor j=2:nif i~=jMi;j=Bi;j*ei-Gi;j*fi;Li;j=Gi;j*ei+Bi;j*fi;elseMi;j=ci+Bi;i*ei-Gi;i*fi;Li;j=-ai+Gi;i*ei+Bi;i*fi;endendendfor i=2:3for j=2:nif i~=jRi;j=0;Si;j=0;elseRi;j=-2*ei;Si;j=-2*fi;endendendJ=H2:n;2:n N2:n;2:n;M4:n;2:n L4:n;2:n;R2:3;2:n S2:3;2:n;if maxabsfx<0.0001%输出结果break;else%求解修正方程获得dxdx=-J^-1*fx;dx=dx';e2:n=e2:n+dx1:n-1;f2:n=f2:n+dxn:2*n-1;t=t+1;endendif t>tmaxstr='潮流计算不收敛';dispstr;elsea1:n=0.0;c1:n=0.0;for i=1:nfor j=1:nai=ai+Gi;j*ej-Bi;j*fj; ci=ci+Gi;j*fj+Bi;j*ej;endendfor i=1:nUi=ei+1i*fi;ampi=absUi;argi=angleUi;Pi=ei*ai+fi*ci;Qi=fi*ai-ei*ci;enddisp'电压幅值:';dispamp;disp'电压相角:';disparg;disp'节点有功:';dispP;disp'节点无功:';dispQ;end%计算短路电流f=4;zf=0.0;%修正节点导纳矩阵Xd=DATA21:3;6;E=DATA21:3;7;for i=1:3Iii=Ei/1i*Xdi;endY=Yn;for i=1:3Yi;i=Yi;i+1/1i*Xdi;endfor j=4:nYj;j=Yj;j+-Pj+1i*Qj/Uj*Uj;enddisp'修正后的节点导纳矩阵Y:';Z=Y^-1;disp'节点阻抗矩阵Z的第4列:';dispZ:;4;%精确计算disp'精确计算结果:';U0=U;If=U0f/Zf;f+zf;amp=absIf;arg=atandimagIf/realIf;disp'短路电流:';disp'模值:';dispamp;disp'相角:';disparg;for i=1:nUi=U0i-Zi;f*If;amp=absU;enddisp'节点电压模值:';dispamp;disp'支路电流: ';str='i ''j '' Iij';dispstr;for k=1:li=DATA1k;1;j=DATA1k;2;r=DATA1k;3;x=DATA1k;4;z=r+1i*x;I=Ui-Uj/z;str=num2stri ' ' num2strj ' ' num2strI; dispstr;end%近似计算disp'近似计算结果:';U01:n=1.0;If=U0f/Zf;f+zf;amp=absIf;arg=atandimagIf/realIf;disp'短路电流:';disp'模值:';dispamp;disp'相角:';for i=1:nUi=U0i-Zi;f*If; amp=absU;enddisp'节点电压模值:'; dispamp;。
(最新整理)C语言进行潮流计算
(完整)C语言进行潮流计算编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)C语言进行潮流计算)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)C语言进行潮流计算的全部内容。
电力系统课程设计C语言潮流计算学院:电气工程班级:电092班学号:0912002020学生姓名: 闵凯2013.3.7电力系统的潮流计算是对电力系统分析的最基本步骤也是最重要的步骤,是指在一定的系统结构和运行条件下,确定系统运行状态的计算,也即是对各母线(节点)电压,各元件(支路)传输电线或功率的计算。
通过计算出的节点电压和功率分布用以检查系统各元件是否过负荷,各点电压是否合理,以及功率损耗等。
即使对于一个简单的电力系统,潮流计算也不是一件简单就可以完成的事,其运算量很大,因此如果对于一个大的、复杂的电网来说的话,由于其节点多,分支杂,其计算量可想而知,人工对其计算也更是难上加难了。
特别是在现实生活中,遇到一个电力系统不会像我们期望的那样可以知道它的首端电压和首端功率或者是末端电压和末端功率,而是只知道它的首端电压和末端功率,更是使计算变的头疼万分。
为了使计算变的简单,我们就可以利用计算机,用C 语言编程来实现牛顿—拉夫逊(Newton —Raphson )迭代法,最终实现对电力系统潮流的计算。
一.用牛顿—拉夫逊迭代法进行电力系统潮流计算的相关概念1.节点导纳矩阵如图所示的电力网络,将节点i 和j 的电压用•U i 和•.U j 表示,它们之间的支路导纳表示为y ij ,那么有基尔霍夫电流定律可知注入接点I 的电流•.I i (设流入节点的电流为正)等于离开节点I 的电流之和,因此有•i I)(.00••≠=≠=••-==∑∑j i nij ijnij iji U U II y (1-1)∴ •≠=≠=••∑∑-=U y y U I nij ij n ij ij i 00 (1-2)如令ii nij ij Y y =∑≠=0 ij ij Y y =-则可将(1-2)改写为:∑≠=••=nij ij ij i U Y I 1 I=1,2,…,n. (1-3)上式也可以写为: I =YU (1-4)其中Y 为节点导纳矩阵,也称为稀疏的对称矩阵,它是n ×n 阶方阵。
C语言计算潮流程序
节点数:3 支路数:3 计算精度:0.00010支路1:0.0300+j0.09001┠—————□—————┨2支路2:0.0200+j0.09002┠—————□—————┨3支路3:0.0300+j0.09003┠—————□—————┨1节点1:PQ节点,S(1)=-0.5000-j0.2000节点2:PQ节点,S(2)=-0.6000-j0.2500节点3:平衡节点,U(3)=1.0000∠0.0000n=5;nl=5;isb=1;pr=0.00001;B1=[1 2 0.03i 0 1.05 0;2 3 0.08+0.3i 0.5i 1 0;2 4 0.1+0.35i 0 1 0;3 4 0.04+0.25i 0.5i 1 0;3 5 0.015i 0 1.05 1];B2=[0 0 1.05 1.05 0 1;0 3.7+1.3i 1.05 0 0 2;0 2+1i 1.05 0 0 2;0 1.6+0.8i 1.05 0 0 2;5 0 1.05 1.05 0 3];X=[1 0;2 0;3 0;4 0;5 0];na=3;Y=zeros(n);YI=zeros(n);e=zeros(1,n);f=zeros(1,n);V=zeros(1,n);O=zeros(1,n); for i=1:nif X(i,2)~=0;p=X(i,1);Y(p,p)=1./X(i,2);endendfor i=1:nlif B1(i,6)==0p=B1(i,1);q=B1(i,2);else p=B1(i,2);q=B1(i,1);endY(p,q)=Y(p,q)-1./(B1(i,3)*B1(i,5));YI(p,q)=YI(p,q)-1./B1(i,3);Y(q,p)=Y(p,q);YI(q,p)=YI(p,q);Y(q,q)=Y(q,q)+1./(B1(i,3)*B1(i,5)^2)+B1(i,4)./2;YI(q,q)=YI(q,q)+1./B1(i,3);Y(p,p)=Y(p,p)+1./B1(i,3)+B1(i,4)./2;YI(p,p)=YI(p,p)+1./B1(i,3);endG=real(Y);B=imag(YI);BI=imag(Y);for i=1:nS(i)=B2(i,1)-B2(i,2);BI(i,i)=BI(i,i)+B2(i,5);endP=real(S);Q=imag(S);for i=1:ne(i)=real(B2(i,3));f(i)=imag(B2(i,3));V(i)=B2(i,4);endfor i=1:nif B2(i,6)==2V(i)=sqrt(e(i)^2+f(i)^2);O(i)=atan(f(i)./e(i));endendfor i=2:nif i==nB(i,i)=1./B(i,i);else IC1=i+1;for j1=IC1:nB(i,j1)=B(i,j1)./B(i,i);endB(i,i)=1./B(i,i);for k=i+1:nfor j1=i+1:nB(k,j1)=B(k,j1)-B(k,i)*B(i,j1);endendendendp=0;q=0;for i=1:nif B2(i,6)==2p=p+1;k=0;for j1=1:nif B2(j1,6)==2k=k+1;A(p,k)=BI(i,j1);endendendendfor i=1:naif i==naA(i,i)=1./A(i,i);else k=i+1;for j1=k:naA(i,j1)=A(i,j1)./A(i,i);endA(i,i)=1./A(i,i);for k=i+1:nafor j1=i+1:naA(k,j1)=A(k,j1)-A(k,i)*A(i,j1);endendendendICT2=1;ICT1=0;kp=1;kq=1;K=1;DET=0;ICT3=1;while ICT2~=0|ICT3~=0ICT2=0;ICT3=0;for i=1:nif i~=isbC(i)=0;for k=1:nC(i)=C(i)+V(k)*(G(i,k)*cos(O(i)-O(k))+BI(i,k)*sin(O(i)-O(k)));endDP1(i)=P(i)-V(i)*C(i);DP(i)=DP1(i)./V(i);DET=abs(DP1(i));if DET>=prICT2=ICT2+1;endendendNp(K)=ICT2;if ICT2~=0for i=2:nDP(i)=B(i,i)*DP(i);if i~=nIC1=i+1;for k=IC1:nDP(k)=DP(k)-B(k,i)*DP(i);endelsefor LZ=3:iL=i+3-LZ;IC4=L-1;for MZ=2:IC4I=IC4+2-MZ;DP(I)=DP(I)-B(I,L)*DP(L);endendendendfor i=2:nO(i)=O(i)-DP(i);endkq=1;L=0;for i=1:nif B2(i,6)==2C(i)=0;L=L+1;for k=1:nC(i)=C(i)+V(k)*(G(i,k)*sin(O(i)-O(k))-BI(i,k)*cos(O(i)-O(k)));endDQ1(i)=Q(i)-V(i)*C(i);DQ(L)=DQ1(i)./V(i);DET=abs(DQ1(i));if DET>=prICT3=ICT3+1;endendendelse kp=0;if kq~=0;L=0;for i=1:nif B2(i,6)==2C(i)=0;L=L+1;for k=1:nC(i)=C(i)+V(k)*(G(i,k)*sin(O(i)-O(k))-BI(i,k)*cos(O(i)-O(k)));endDQ1(i)=Q(i)-V(i)*C(i);DQ(L)=DQ1(i)./V(i);DET=abs(DQ1(i));endendendendNq(K)=ICT3;if ICT3~=0L=0;for i=1:naDQ(i)=A(i,i)*DQ(i);if i==nafor LZ=2:iL=i+2-LZ;IC4=L-1;for MZ=1:IC4I=IC4+1-MZ;DQ(I)=DQ(I)-A(I,L)*DQ(L);endendelseIC1=i+1;for k=IC1:naDQ(k)=DQ(k)-A(k,i)*DQ(i);endendendL=0;for i=1:nif B2(i,6)==2L=L+1;V(i)=V(i)-DQ(L);endendkp=1;K=K+1;elsekq=0;if kp~=0K=K+1;endendfor i=1:nDy(K-1,i)=V(i);endenddisp('迭代次数')disp(K);disp('每次没有达到精度要求的有功功率个数为'); disp(Np);disp('每次没有达到精度要求的无功功率个数为'); disp(Nq);for k=1:nE(k)=V(k)*cos(O(k))+V(k)*sin(O(k))*j;O(k)=O(k)*180./pi;enddisp('各节点的电压标么值E为');disp(E);disp('各节点的电压V大小');disp(V);disp('各节点的电压相角O');disp(O);for p=1:nC(p)=0;for q=1:nC(p)=C(p)+conj(Y(p,q))*conj(E(q));endS(p)=E(p)*C(p);enddisp('各节点的功率为');disp(S);disp('各条支路的首端功率为');for i=1:nlif B1(i,6)==0p=B1(i,1);q=B1(i,2);else p=B1(i,2);q=B1(i,1);endSi(p,q)=E(p)*(conj(E(p))*conj(B1(i,4)./2)+(conj(E(p)*B1(i,5))-conj(E(q)))*conj(1. /(B1(i,3)*B1(i,5))));disp(Si(p,q));enddisp('各条支路的末端功率为');for i=1:nlif B1(i,6)==0p=B1(i,1);q=B1(i,2);else p=B1(i,2);q=B1(i,1);endSj(q,p)=E(q)*(conj(E(q))*conj(B1(i,4)./2)+(conj(E(q)./B1(i,5))-conj(E(p)))*conj(1 ./(B1(i,3)*B1(i,5))));disp(Sj(q,p));enddisp('各条支路的功率损耗为');for i=1:nlif B1(i,6)==0p=B1(i,1);q=B1(i,2);else p=B1(i,2);q=B1(i,1);endDS(i)=Si(p,q)+Sj(q,p);disp(DS(i));endfor i=1:KCs(i)=i;for j=1:nDy(K,j)=Dy(K-1,j);endenddisp('每次迭代后各节点的电压值如图所示'); plot(Cs,Dy)xlabel('迭代次数')ylabel('电压')title('电压迭代次数曲线');题号:2节点数:4 支路数:4 计算精度:0.00010支路1:0.0200+j0.08001┠—————□—————┨3支路2:0.0400+j0.12001┠—————□—————┨4支路3:0.0500+j0.14002┠—————□—————┨4支路4:0.0400+j0.12003┠—————□—————┨4节点1:PQ节点,S(1)=-0.6000-j0.2500节点2:PQ节点,S(2)=-0.8000-j0.3500节点3:PV节点,P(3)=0.4000 V(3)=0.9500节点4:平衡节点,U(4)=1.0000∠0.0000#include "stdio.h"#include "math.h"#define M 20 /*节点数、支路数极限值*/#define N 5 /*迭代次数极限值*/int n,m,dd=0,pq=0,pv=0,tt,qy;float eps; /*节点数、支路数、对地支路数、pq节点数、pv节点数、控制打印、互联网数、精度*/struct jiedian /*节点数据结构体*/{int s; /*节点类型:1-PQ节点;2-PV节点;3-平衡节点*/ float p,q,e,f,v; /*节点的有功、无功、电压实部、虚部、电压辐值*/}jiedian[M]; /*如引用节点1的无功,则为jiedian[1].q */struct zhilu /*支路数据结构体*/{int p1,p2,s; /*支路两端节点号,支路类型:1-普通支路;2-变压器支路;3-对地支路*/float r,x,b,kt; /*支路的电阻、电抗、导纳、变压器非标准变比*/}zhilu[M];struct hulianwang /*互联网结构体*/{int num,pv; /*互联区域号,指定的pv节点号*/float p,eps2; /*规定的有功功率及其允许误差*/int count; /*每个互联区域包括的节点数*/int a[M]; /*包括的节点*/} hulianwang[M];static float G[M][M],B[M][M],G1[M][M],B1[M][M]; /*节点导纳阵矩阵*/static float ykb[2*M][2*M]; /*节点导纳阵矩阵*/static float yinzi[2*M][2*M]; /*因子表*/static float P[M][M],Q[M][M]; /*潮流计算结果*/FILE *fp1,*fp2; /*文件输入、输出指针*/void input() /*从文件in.txt 输入线路基本参数、节点数据、支路数据*/{int i,j,h; /*循环变量、节点(支路)类型*//**********************************打开电网参数文件**********************/fp1=fopen("in.txt","r");if (fp1==NULL){printf("Can not open file in.txt !\n");exit(0);}/***********读取节点数,支路数,互联网数,PQ节点数PV节点数和精度***********/fscanf(fp1,"%d,%d,%d,%f\n",&n,&m,&qy,&eps);/************************读取节点信息*************************************/for(i=1;i<=n;i++){fscanf(fp1,"%d",&h);if(h==1) /*类型h=1是PQ节点*/{pq++;fscanf(fp1,",%f,%f,%f,%f\n",&jiedian[i].p,&jiedian[i].q,&jiedian[i].e,&jiedian[i].f);jiedian[i].s=1;jiedian[i].v=sqrt(jiedian[i].e*jiedian[i].e+jiedian[i].f*jiedian[i].f);}else if(h==2) /*类型h=2是pv节点*/{pv++;fscanf(fp1,",%f,%f,%f,%f\n",&jiedian[i].p,&jiedian[i].v,&jiedian[i].e,&jiedian[i].f);jiedian[i].s=2;jiedian[i].q=0;}else /*类型h=3是平衡节点*/{jiedian[i].p=0;jiedian[i].q=0;jiedian[i].e=1;jiedian[i].f=0;jiedian[i].v=1;jiedian[i].s=3;}}/*******************************读取支路信息*************************************/for(i=1;i<=m;i++){fscanf(fp1,"%d",&h);if(h==1) /*类型h=1是普通支路*/{fscanf(fp1,",%d,%d,%f,%f,%f\n",&zhilu[i].p1,&zhilu[i].p2,&zhilu[i].r,&zhilu[i].x,& zhilu[i].b);zhilu[i].kt=1;zhilu[i].s=1;}if(h==2) /*类型h=2是变压器支路*/{fscanf(fp1,",%d,%d,%f,%f,%f\n",&zhilu[i].p1,&zhilu[i].p2,&zhilu[i].r,&zhilu[i].x,& zhilu[i].kt);zhilu[i].s=2;}if(h==3) /*类型h=3是接地支路*/{fscanf(fp1,",%d,%d,%f,%f,%f\n",&zhilu[i].p1,&zhilu[i].p2,&zhilu[i].r,&zhilu[i].x,& zhilu[i].b);zhilu[i].kt=1;zhilu[i].s=3;dd++;}}/*******************************读互联网信息*************************************/if(qy!=0)for(i=1;i<=qy;i++) /*输入互联网状况*/{fscanf(fp1,"%d,%d,%f,%f,%d",&hulianwang[i].num,&hulianwang[i].pv,&hulian wang[i].p,&hulianwang[i].eps2,&hulianwang[i].count);for(j=1;j<=hulianwang[i].count;j++)fscanf(fp1,",%d",&(hulianwang[i].a[j]));}fclose(fp1);/**********************************打开输出结果文件********************************/fp2=fopen("out.txt","w");if(fp2==NULL){printf("Can not open file!\n");exit(0);}fprintf(fp2,"\n**************************** 原始数据如下***********************************\n\n ");fprintf(fp2," 节点数:%2d 支路数:%2d 对地支路数:%2d PQ节点数:%2d PV节点数:%2d 精度1:%f \n",n,m,dd,pq,pv,eps);fprintf(fp2,"\n------------------------------------------------------------------------------\n\n ");for(i=1;i<=pq;i++)fprintf(fp2," 节点%2d PQ节点P[%d]=%fQ[%d]=%f\n",i,i,jiedian[i].p,i,jiedian[i].q);for(i=pq+1;i<=pq+pv;i++)fprintf(fp2," 节点%2d PV节点P[%d]=%fV[%d]=%f\n",i,i,jiedian[i].p,i,jiedian[i].v);fprintf(fp2," 节点%2d 平衡节点\n",i);fprintf(fp2,"\n-------------------------------------------------------------------------------\n\n ");for(i=1;i<=m;i++){if(zhilu[i].s==1)fprintf(fp2," 支路%2d:普通支路相关节点:%2d,%2d R=%f X=%f B=%f\n",i,zhilu[i].p1,zhilu[i].p2,zhilu[i].r,zhilu[i].x,zhilu[i].b);else if(zhilu[i].s==2)fprintf(fp2," 支路%2d:变压器支路相关节点:%2d,%2dR=%f X=%f Kt=%f\n",i,zhilu[i].p1,zhilu[i].p2,zhilu[i].r,zhilu[i].x,zhilu[i].kt);elsefprintf(fp2," 支路%2d:对地支路相关节点:%2dR=%f X=%f B=%f\n",i,zhilu[i].p1,zhilu[i].r,zhilu[i].x,zhilu[i].b);}for(i=1;i<=qy;i++){fprintf(fp2," 互联网区域:%2d 指定pv节点:%2d 规定有功功率:%8.5f 允许误差:%8.5f 包括的节点:",hulianwang[i].num,hulianwang[i].pv,hulianwang[i].p,hulianwang[i].eps2);for (j=1;j<=hulianwang[i].count;j++)fprintf(fp2,"%2d ",hulianwang[i].a[j]);fprintf(fp2,"\n");}}void youhua() /*利用节点数据、支路数据形成新编号*/ {int i,k,j,jd[N]; /*jd[N]记录节点*/struct jiedian tem; /*中间临时节点所连支路数*/for(i=1;i<=n;i++) /*对节点连接支路数赋0*/{jd[i]=0;}for(i=1;i<=n;i++) /*考虑每个节点*/{for(j=1;j<=m;j++) /*考虑每条支路*/{if((zhilu[j].p1==i||zhilu[j].p2==i)&&(zhilu[j].s!=3)) /*如果是这条支路的节点且不是接地支路*/jd[i]++;}}for(i=1;i<pq;i++) /*对pq节点按所连支路的个数进行重新编号*/{for(j=i+1;j<=pq;j++) /*从小到大排序算法*/{if(jd[i]>jd[j]){tem=jiedian[i];jiedian[i]=jiedian[j];jiedian[j]=tem;for(k=1;k<=m;k++) /*更新支路信息*/{if(zhilu[k].p1==j)zhilu[k].p1=i;else if(zhilu[k].p2==j)zhilu[k].p2=i;else if(zhilu[k].p1==i)zhilu[k].p1=j;else if(zhilu[k].p2==i)zhilu[k].p2=j;}}}}for(i=pq+1;i<pq+pv;i++) /*对pv节点按所连支路的个数进行重新编号*/{for(j=i+1;j<=pq+pv;j++) /*从小到大排序算法*/{if(jd[i]>jd[j]){tem=jiedian[i];jiedian[i]=jiedian[j];jiedian[j]=tem;for(k=1;k<=m;k++) /*更新支路信息*/{if(zhilu[k].p1==j)zhilu[k].p1=i;else if(zhilu[k].p2==j)zhilu[k].p2=i;else if(zhilu[k].p1==i)zhilu[k].p1=j;else if(zhilu[k].p2==i)zhilu[k].p2=j;}}}}fprintf(fp2,"\n**************************** 节点优化结果如下*********************************\n\n ");for(i=1;i<=n;i++){if(jiedian[i].s==1)fprintf(fp2," 节点%2d PQ节点P[%d]=%fQ[%d]=%f \n",i,i,jiedian[i].p,i,jiedian[i].q);if(jiedian[i].s==2)fprintf(fp2," 节点%2d PV节点P[%d]=%fV[%d]=%f \n",i,i,jiedian[i].p,i,jiedian[i].v);if(jiedian[i].s==3)fprintf(fp2," 节点%2d 平衡节点\n",i);}}void form_y() /*利用支路数据形成Y,注意对地支路*/ {int i,j,k;float S;for(i=1;i<=n;i++)for(j=1;j<=n;j++)G[i][j]=B[i][j]=0;for(i=1;i<=m;i++) /*节点导纳矩阵的主对角线上的导纳*/ for(j=1;j<=n;j++)if(zhilu[i].p1==j||zhilu[i].p2==j){S=zhilu[i].r*zhilu[i].r+zhilu[i].x*zhilu[i].x;if(S==0) continue;G[j][j]+=zhilu[i].r/S;B[j][j]+=-zhilu[i].x/S;if(zhilu[i].s==1) /*如果是普通支路*/{B[j][j]+=zhilu[i].b/2;}else if(zhilu[i].s==2) /*如果是普通变压器支路*/{if(zhilu[i].p1==j){G[j][j]+=(zhilu[i].r/S*(1-zhilu[i].kt))/(zhilu[i].kt*zhilu[i].kt);B[j][j]+=(-zhilu[i].x/S*(1-zhilu[i].kt))/(zhilu[i].kt*zhilu[i].kt);}else if(zhilu[i].p2==j){G[j][j]+=(zhilu[i].r/S*(zhilu[i].kt-1))/zhilu[i].kt;B[j][j]+=(-zhilu[i].x/S*(zhilu[i].kt-1))/zhilu[i].kt;}}else if(zhilu[i].s==3) /*如果是对地支路*/{B[j][j]+=zhilu[i].b;}}for(k=1;k<=m;k++) /*节点导纳矩阵非主对角线上的导纳*/ {i=zhilu[k].p1;j=zhilu[k].p2;S=zhilu[k].r*zhilu[k].r+zhilu[k].x*zhilu[k].x;if(S==0) continue;G[i][j]+=-zhilu[k].r/S;B[i][j]+=zhilu[k].x/S;if(zhilu[k].kt!=1.0){G[i][j]/=zhilu[k].kt;B[i][j]/=zhilu[k].kt;}G[j][i]=G[i][j];B[j][i]=B[i][j];}fprintf(fp2,"\n\n****************************** 节点导纳矩阵为**********************************\n");for(i=1;i<=n;i++){fprintf(fp2,"\n ");for(j=1;j<=n;j++)fprintf(fp2,"%8.5f+j%8.5f ",G[i][j],B[i][j]);}}void form_j() /*利用节点数据和Y形成J*/{float ei,fi,a=0,b=0;int i1,j1,k1,i,j,k;for(i=1;i<=2*(pq+pv)+1;i++)for(j=1;j<=2*(pq+pv)+1;j++)ykb[i][j]=0;for(i=1;i<=pq;i++)for(j=1;j<n;j++){ i1=i;j1=j;ei=jiedian[i].e;fi=jiedian[i].f;if(i!=j) /*求i!=j时的H、N、J、L*/ { ykb[2*i-1][2*j-1]=G[i1][j1]*ei+B[i1][j1]*fi; /* H */ykb[2*i-1][2*j]=-B[i1][j1]*ei+G[i1][j1]*fi; /* N */ykb[2*i][2*j-1]=-B[i1][j1]*ei+G[i1][j1]*fi; /* J */ykb[2*i][2*j]=-G[i1][j1]*ei-B[i1][j1]*fi; /* L */}else /*求i=j时的H、N、J、K*/ { a=0;b=0;for(k=1;k<=n;k++)if(k!=i){ k1=k;a=a+G[i1][k1]*jiedian[k].e-B[i1][k1]*jiedian[k].f;b=b+G[i1][k1]*jiedian[k].f+B[i1][k1]*jiedian[k].e;}ykb[2*i-1][2*j-1]=2*G[i1][i1]*jiedian[i].e+a; /*H*/ykb[2*i][2*j]=-2*B[i1][i1]*jiedian[i].f+a; /*L*/ykb[2*i-1][2*j]= 2*G[i1][i1]*jiedian[i].f+b; /*N*/ykb[2*i][2*j-1]=-2*B[i1][i1]*jiedian[i].e-b; /*J*/}}for(i=pq+1;i<=pq+pv;i++) /*形成pv节点子阵*/for(j=1;j<n;j++){ i1=i;j1=j;ei=jiedian[i].e;fi=jiedian[i].f;if(i!=j) /*求i!=j时的H、N*/ {ykb[2*i-1][2*j-1]=G[i1][j1]*ei+B[i1][j1]*fi; /*H*/ykb[2*i-1][2*j]=-B[i1][j1]*ei+G[i1][j1]*fi; /*N*/}else /*求i=j时的H、N、R、S*/{ a=0;b=0;for(k=1;k<=n;k++)if(k!=i){ k1=k;a+=G[i1][k1]*jiedian[k].e-B[i1][k1]*jiedian[k].f;b+=G[i1][k1]*jiedian[k].f+B[i1][k1]*jiedian[k].e;}ykb[2*i-1][2*j-1]=2*G[i1][i1]*jiedian[i].e+a; /*H*/ykb[2*i-1][2*i]=2*G[i1][i1]*jiedian[i].f+b; /*N*/ykb[2*i][2*j-1]=2*ei; /*R*/ykb[2*i][2*j]=2*fi; /*S*/}}fprintf(fp2,"\n\n\n******************************* 雅可比矩阵*************************************** \n");for(i=1;i<=2*(pq+pv);i++){fprintf(fp2,"\n ");for(j=1;j<=2*(pq+pv);j++)fprintf(fp2,"%8.5f ",ykb[i][j]);}}void form_yz() /*利用J形成因子表*/{int i,j,k;float a[2*M][2*M],L[2*M][2*M],R[2*M][2*M];float x,y,z;for(i=1;i<=2*(pq+pv);i++)for(j=1;j<=2*(pq+pv);j++){ a[i][j]=0;R[i][j]=0; L[i][j]=0;}for(i=1;i<=2*(pq+pv);i++)for(j=1;j<=2*(pq+pv);j++)a[i][j]=ykb[i][j];for(i=1;i<=2*(pq+pv);i++){for(j=1;j<=2*(pq+pv);j++){if(i>j){R[i][j]=0;x=0;for(k=1;k<=j-1;k++){x=x+L[i][k]*R[k][j];}L[i][j]=a[i][j]-x;}if(i==j){R[i][j]=1;y=0;for(k=1;k<=i-1;k++){y=y+L[i][k]*R[k][i];}L[i][i]=a[i][j]-y;}if(i<j){L[i][j]=0;z=0;for(k=1;k<=i-1;k++){z=z+L[i][k]*R[k][j];}R[i][j]=(a[i][j]-z)/L[i][i];}}}for(i=1;i<=2*(pq+pv);i++){for(j=1;j<=2*(pq+pv);j++){if(i<j)yinzi[i][j]=R[i][j];if(i==j)yinzi[i][j]=1/L[i][j];if(i>j)yinzi[i][j]=L[i][j];}}fprintf(fp2,"\n\n\n******************************** 因子表***************************************** \n");for(i=1;i<=2*(pq+pv);i++){fprintf(fp2,"\n ");for(j=1;j<=2*(pq+pv);j++)fprintf(fp2,"%8.5f ",yinzi[i][j]);}}。
电力系统潮流计算的C语言实现
//////////////////////////////////////////////////////////////////////// PQ分解法潮流////文件输入格式:节点总数n(包括联络节点),支路数zls ////节点数(发电机和负荷)nb,接地电抗数mdk,迭代精度eps // //考虑负荷静特性标志kk2(0考虑),平衡节点号,优化标志(0不优化) ////最大迭代次数it1,支路左右节点号izl[],jzl[],支路电阻zr[],电抗zx[] ////支路容纳zyk[],节点号nob[]及标志nobt[](0-PQ,-1-PV) ////发电机和负荷有功、无功pg[],qg[],pl[],ql[] ////电压v0[](pv节点输入实际值,PQ节点任输入一值) // //电抗节点号idk[],电抗值dkk[] ////////////////////////////////////////////////////////////////////////#include "math.h"#include "stdio.h"#define NS 2000 //最大节点数#define NS2 NS * 2#define NS4 1000 //NS4、NS必须大于2*zls。
#define ZS 3000 //最大支路数#define ZS2 ZS * 2#define DKS 200 //最大电抗器数#define N2 ZS * 4#define N3 ZS * 8 + NS * 4FILE *fp1, *fp2;char inname[12], outname[12];// fp1输入数据文件指针fp2输出文件指针// inname[]输入数据文件名outname[]输出数据文件名int n, zls, nb, mdk, mpj, bnsopton, it1, dsd, kk2, nzls;// 节点总数n(包括联络节点) 支路数(回路数)zls 节点数nb(发电机和负荷) // 接地电抗数mdk 精度eps 平衡节点号mpj// 节点优化(标志)bnsopton(=0节点不优化,!=0节点优化)// 最大迭代次数it1 最低电压或最大功率误差节点号dsd// 负荷静特性标志(=0考虑负荷静特性)// 支路数(双回线算一条支路)int izl[ZS], jzl[ZS], idk[DKS], yds[NS], ydz[NS], iy[ZS2];// izl[],jzl[],idk[]:分别存放左、右节点号和电抗器节点号。
C语言进行潮流计算
C语言进行潮流计算C语言是一种通用的编程语言,被广泛用于开发各种应用程序。
虽然它的历史可以追溯到上个世纪70年代,但C语言在当今仍然非常流行。
它被广泛用于系统编程、嵌入式系统开发、游戏开发和科学计算等领域。
本文将重点介绍C语言的潮流计算。
潮流计算是一种用于分析电力系统稳态和动态行为的工具和技术。
它可以用于预测电力系统中潮流(电压和电流)的分布和变化。
潮流计算的目标是找到系统中各个节点的电压和相应的功率流向。
这对于电力系统的规划和运行至关重要。
C语言可以通过编写相应的程序来实现潮流计算。
在这个程序中,需要定义一组节点和支路,以及相应的导纳矩阵(节点之间的电导和电纳)。
导纳矩阵描述了电力系统中节点之间的电压和电流关系。
一旦定义了这些参数,就可以使用C语言编写算法来解决潮流计算问题。
潮流计算通常使用迭代的方法来求解。
在每一次迭代中,系统的节点电压和功率分布都会进行更新,直到达到稳定状态。
C语言提供了丰富的控制结构和数据类型,使得编写这样的迭代算法变得相对容易。
例如,可以使用for循环来实现迭代过程,同时使用浮点数类型来存储节点电压和功率分布。
潮流计算的核心是求解节点电压的方程组。
这个方程组通常是一个非线性方程组,需要使用牛顿-拉夫逊方法或高斯-赛德尔方法等迭代算法进行求解。
C语言提供了一些数值计算库,如GSL(GNU科学库),可以用于实现这些迭代算法。
这些库提供了各种数值计算函数,如求解非线性方程组、矩阵运算和插值等,可以大大简化潮流计算程序的编写。
除了求解节点电压方程组,潮流计算还需要考虑各种系统参数和条件。
例如,支路的参数(如电阻和电感)、发电机的容量和调节策略、负荷的需求和变化等。
C语言可以通过定义和存储这些参数,并在计算过程中引用它们来实现对这些条件的考虑。
此外,潮流计算还需要处理一些特殊情况,如无源系统和有环路系统。
无源系统是指没有外部电压源的电力系统,只由发电机和负荷组成。
有环路系统是指电力系统中存在环路,这会导致方程组无解。
电力系统通用潮流计算C语言程序
#include <iostream>#include <fstream>#include<iomanip>#include<math.h>using namespace std;//节点号类型负荷有功负荷无功母线数据(类型1=PV节点,2=PQ节点,3=平衡节点)struct BUS{int busno;int type;float Pd;float Qd;};//发电机数据节点号有功发电电压幅值struct Generator{int busno;float Pg;float Vg;};//支路信息节点I 节点J R X B/2 kstruct Line{int busi;int busj;float R;float X;float B;float k;};//deltaP deltaQ deltaV^2//void fun1(double YG[][50],double YB[][50],double e[],double f[],int type[],int N,double W[],double P[],double Q[],double V[]){double dP=0,dQ=0,dV=0;int i,j;for(i=0;i<N-1;i++){double A=0,B=0;for(j=0;j<N;j++){A+=YG[i][j]*e[j]-YB[i][j]*f[j];B+=YG[i][j]*f[j]+YB[i][j]*e[j];}dV=V[i]*V[i]-e[i]*e[i]-f[i]*f[i];dP=P[i]-e[i]*A-f[i]*B;W[2*i]=dP;dQ=Q[i]-f[i]*A+e[i]*B;if(type[i]==1)W[2*i+1]=dQ;else W[2*i+1]=dV;}}//Jacobi矩阵//void Jacobi(double YG[][50],double YB[][50],double e[50],double f[50],int type[50],int N ,double Ja[100][101]){int i,j;for(i=0;i<N;i++){for(j=0;j<N;j++){if(i!=j){if(type[i]==1){Ja[2*i][2*j]=-(YG[i][j]*e[i]+YB[i][j]*f[i]);Ja[2*i][2*j+1]=YB[i][j]*e[i]-YG[i][j]*f[i];Ja[2*i+1][2*j]=Ja[2*i][2*j+1];Ja[2*i+1][2*j+1]=-Ja[2*i][2*j];}else {Ja[2*i][2*j]=-YG[i][j]*e[i]+YB[i][j]*f[i];Ja[2*i][2*j+1]=YB[i][j]*e[i]-YG[i][j]*f[i];Ja[2*i+1][2*j+1]=Ja[2*i+1][2*j]=0;}}else {double a[50]={0},b[50]={0};for(int k=0;k<N;k++){a[i]+=(YG[i][k]*e[k]-YB[i][k]*f[k]);b[i]+=(YG[i][k]*f[k]+YB[i][k]*e[k]);Ja[2*i][2*j]=-a[i]-YG[i][i]*e[i]-YB[i][i]*f[i];Ja[2*i][2*j+1]=-b[i]+YB[i][i]*e[i]-YG[i][i]*f[i];if(type[i]==1){Ja[2*i+1][2*j]=b[i]+YB[i][i]*e[i]-YG[i][i]*f[i];Ja[2*i+1][2*j+1]=-a[i]+YG[i][i]*e[i]+YB[i][i]*f[i];}else {Ja[2*i+1][2*j]=-2*e[i];Ja[2*i+1][2*j+1]=-2*f[i];}}}}}}//高斯消元法解方程组函数//void gauss(double a[][101],int n){int i,j,k;double c;for(k=0;k<n-1;k++) {c=a[k][k];for(j=k;j<=n;j++) a[k][j]/=c;for(i=k+1;i<n;i++) {c=a[i][k];for(j=k;j<=n;j++) a[i][j]-=c*a[k][j];}}a[n-1][n]/=a[n-1][n-1];for(k=n-2;k>=0;k--)for(j=k+1;j<n;j++) a[k][n]-=a[k][j]*a[j][n];}void main(){ifstream fin;int N=0,GS=0,LD=0,ZLs=0; //节点数发电机数负荷数支路数// BUS *B;Generator *G;Line *L;//从文本中读入原始数据到数组中//fin.open("C:\\data.txt");if(!fin){cout<<"输入数据文件不存在!"<<endl;getchar();}int m1[50]={0},m2[50]={0};float m3[50],m4[50],m5[50],m6[50];int i,j,l;for(i=0;;i++){fin>>m1[i];if(m1[i]==0)break;fin>>m2[i]>>m3[i]>>m4[i];N++;}B =new BUS[N];for (i=0;i<N;i++){B[i].busno=m1[i];B[i].type=m2[i];B[i].Pd=m3[i];B[i].Qd=m4[i];}for(i=0;;i++){fin>>m1[i];if(m1[i]==0)break;fin>>m4[i]>>m3[i];GS++;}G =new Generator[GS];for (i=0;i<GS;i++){G[i].busno=m1[i];G[i].Pg=m4[i];G[i].Vg=m3[i];}for(i=0;;i++){fin>>m1[i];if(m1[i]==0)break;fin>>m2[i]>>m3[i]>>m4[i]>>m5[i]>>m6[i];ZLs++;}L =new Line[ZLs];for (i=0;i<ZLs;i++){L[i].busi=m1[i];L[i].busj=m2[i];L[i].R=m3[i];L[i].X=m4[i];L[i].B=m5[i];L[i].k=m6[i];}LD=N-GS;fin.close();//节点导纳矩阵形成//double YB[50][50],YG[50][50],BB[50][50],K[50][50];for(i=0;i<N;i++){for(j=0;j<N;j++){YB[i][j]=0;YG[i][j]=0;BB[i][j]=0;K[i][j]=1;}}for (l=0;l<ZLs;l++){i=L[l].busi-1;j=L[l].busj-1;K[i][j]=L[l].k;BB[i][j]=BB[j][i]=L[l].B;YG[i][j]=YG[j][i]=L[l].R/(L[l].R*L[l].R+L[l].X*L[l].X);YB[i][j]=YB[j][i]=-L[l].X/(L[l].R*L[l].R+L[l].X*L[l].X);}for(i=0;i<N;i++){for(j=i;j<N;j++) {K[i][j]=K[j][i];K[j][i]=1;}for(j=0;j<N;j++){if(i!=j){YG[i][i]=YG[i][i]+(YG[i][j]*K[i][j]*K[i][j]);YB[i][i]=YB[i][i]+(YB[i][j]*K[i][j]*K[i][j]+BB[i][j]);}}}//修正后//for (l=0;l<ZLs;l++){i=L[l].busi-1;j=L[l].busj-1;K[i][j]=L[l].k;YG[i][j]=-YG[i][j]*K[i][j];YG[j][i]=YG[i][j];YB[i][j]=-YB[i][j]*K[i][j];YB[j][i]=YB[i][j];}int type[50]={0};for(i=0;i<N;i++){type[i]=B[i].type;}//PQV的获得//double P[50],Q[50],V[50];for(i=0;i<N;i++){P[i]=0;Q[i]=0;V[i]=0;P[i]=-B[i].Pd;Q[i]=-B[i].Qd;}for (i=0;i<GS;i++){P[G[i].busno-1]=G[i].Pg;V[G[i].busno-1]=G[i].Vg;}// 求A=e+f//double e[50]={0},f[50]={0};double C[100]={0},D[100]={0};for(i=0;i<N;i++){if(V[i]==0){C[2*i]=1;}else C[2*i]=V[i];}double W[100]={0},Ja[100][101]={0};//调用Jacobi函数和高斯函数//for(int t=1;t<10;t++){for(i=0;i<2*N-2;i++){e[i]=C[2*i];f[i]=C[2*i+1];}fun1(YG,YB,e,f,type,N,W,P,Q,V);double it=fabs(W[0]);for(i=1;i<2*N-2;i++){if (it<fabs(W[i])) {it=fabs(W[i]);j=i;}}//中间迭代过程//cout<<setw(10)<<"迭代次数"<<setw(20)<<"最大的功率误差"<<setw(8)<<"节点号"<<endl;cout<<setw(10)<<t<<setw(20)<<it<<setw(8)<<j/2+1<<endl;if (it<0.00001) break;Jacobi(YG,YB,e,f,type,N,Ja);for(i=0;i<2*N-2;i++){Ja[i][2*N-2]=W[i];}//高斯消元法解方程//gauss(Ja,2*N-2);for(i=0;i<2*N-2;i++){D[i]=-Ja[i][2*(N-1)];C[i]+=D[i];}}//平衡节点//for(i=0;i<N;i++){double a=0,b=0;for(int j=0;j<N;j++){a+=(YG[i][j]*e[j]-YB[i][j]*f[j]);b+=(YB[i][j]*e[j]+YG[i][j]*f[j]);}P[i]=e[i]*a+f[i]*b;Q[i]=f[i]*a-e[i]*b;}//支路//double PZL[100][101]={0},QZL[100][101]={0},pr[100][101]={0},qx[100][101]={0}; double x1=0,x2=0,y1=0,y2=0,I2=0;for(int k=0;k<ZLs;k++){i=L[k].busi-1;j=L[k].busj-1;x1=e[i]/L[k].k-e[j];y1=f[i]/L[k].k-f[j];x2=-e[i]*YG[i][j]-f[i]*YB[i][j];y2=-f[i]*YG[i][j]+e[i]*YB[i][j];QZL[i][j]=(x1*y2-x2*y1);PZL[i][j]=(x1*x2+y1*y2);I2=(PZL[i][j]*PZL[i][j]+QZL[i][j]*QZL[i][j])/(e[i]*e[i]+f[i]*f[i]);pr[i][j]=I2*L[k].R;qx[i][j]=I2*L[k].X-(e[i]*e[i]+f[i]*f[i]+e[j]*e[j]+f[j]*f[j])*L[k].B;QZL[i][j]+=(e[i]*e[i]+f[i]*f[i])*(-L[k].B);x1=e[j]*L[k].k-e[i];y1=f[j]*L[k].k-f[i];x2=-e[j]*YG[j][i]-f[j]*YB[j][i];y2=-f[j]*YG[j][i]+e[j]*YB[j][i];QZL[j][i]=(x1*y2-x2*y1);PZL[j][i]=(x1*x2+y1*y2);I2=(PZL[j][i]*PZL[j][i]+QZL[j][i]*QZL[j][i])/(e[j]*e[j]+f[j]*f[j]);pr[j][i]=I2*L[k].R;qx[j][i]=I2*L[k].X-(e[i]*e[i]+f[i]*f[i]+e[j]*e[j]+f[j]*f[j])*L[k].B;QZL[j][i]+=(e[j]*e[j]+f[j]*f[j])*(-L[k].B);}//全网数据//int high=1,low=1;double PG=0,PL=0,Prr=0,Vh=sqrt(e[0]*e[0]+f[0]*f[0]),Vl=sqrt(e[0]*e[0]+f[0]*f[0]); for(k=0;k<N;k++){Prr+=P[k];if(B[k].type==1) PL+=B[k].Pd;else PG+=P[k];if(sqrt(e[k]*e[k]+f[k]*f[k])>Vh){Vh=sqrt(e[k]*e[k]+f[k]*f[k]);high=k+1;}if(sqrt(e[k]*e[k]+f[k]*f[k])<Vl){Vl=sqrt(e[k]*e[k]+f[k]*f[k]);low=k+1;}}//输出数据到文件databak.txt//ofstream fout;fout.open("C:\\databak.txt");fout<<"节点"<<endl;fout<<setw(8)<<"节点号"<<setw(16)<<"V"<<setw(16)<<"弧度"<<setw(16)<<"发电P"<<setw(16)<<"发电Q"<<setw(16)<<"负荷P"<<setw(16)<<"负荷Q"<<endl;for(i=0;i<LD;i++){fout<<setw(8)<<i+1<<setw(16)<<sqrt(e[i]*e[i]+f[i]*f[i])<<setw(16)<<atan2(f[i],e[i])*180/3 .14159<<setw(16)<<0<<setw(16)<<0<<setw(16)<<B[i].Pd<<setw(16)<<B[i].Qd<<endl;}for(j=0;j<GS;j++){i=G[j].busno-1;fout<<setw(8)<<i+1<<setw(16)<<V[i]<<setw(16)<<atan2(f[i],e[i])*180/3.14159<<setw(16)<<P[ i]<<setw(16)<<Q[i]<<setw(16)<<0<<setw(16)<<0<<endl;}fout<<"支路"<<endl;fout<<setw(4)<<"i"<<setw(4)<<"j"<<setw(10)<<"i_j有功"<<setw(10)<<"i_j无功"<<setw(10)<<"j_i有功"<<setw(12)<<"j_i无功"<<setw(12)<<"有功损耗"<<setw(12)<<"无功损耗"<<endl;for (k=0;k<ZLs;k++){i=L[k].busi-1;j=L[k].busj-1;fout<<setw(4)<<L[k].busi<<setw(4)<< L[k].busj <<setw(10)<<PZL[i][j] <<setw(10)<<QZL[i][j]<<setw(10)<< PZL[j][i] <<setw(12)<<QZL[j][i]<<setw(12)<<pr[i][j]<<setw(12)<<qx[i][j]<<endl;}fout<<"全网数据"<<endl;fout<<setw(14)<<"发电有功"<<setw(14)<<"负荷有功"<<setw(14)<<"有功损耗"<<setw(14)<<"最高电压"<<setw(14)<<"节点号"<<setw(14)<<"最低电压"<<setw(14)<<"节点号"<<endl;fout<<setw(14)<<PG<<setw(14)<<PL<<setw(14)<<Prr<<setw(14)<<Vh<<setw(14)<<high<<set w(14)<<Vl<<setw(14)<<low<<endl;fout.close();}。
电力系统潮流计算C程序精编版
电力系统潮流计算注:这是一个基于N-R法的潮流计算通用程序,仅提供了子程序,需要做些处理才能成为一个可运行的计算程序!此程序非我原创,仅与大家共享!!!/******************************************************************* * 这里提供的是电力系统潮流计算机解法的五个子程序,采用的方法是 ** Newton_Raphson法.** 程序中所用的变量说明如下:** N:网络节点总数. M:网络的PQ节点数. ** L:网络的支路总数. N0:雅可比矩阵的行数. ** N1:N0+1K:打印开关.K=1,则打印;否则,不打印.** K1:子程序PLSC中判断输入电压的形式.K1=1,则为极座标形式.否则** 为直角坐标形式.** D:有功及无功功率误差的最大值. * * G(I,J):Ybus的电导元素(实部).** B(I,J):Ybus的电纳元素(虚部).** G1(I) :第I支路的串联电导. B1(I):第I支路的串联电纳. ** C1(I) :第I支路的pie型对称接地电纳. ** C(I,J):第I节点J支路不对称接地电纳. ** CO(I) :第I节点的接地电纳.** S1(I) :第I节点的起始节点号. E1(I):第I节点的终止节点号. ** P(I) :第I节点的注入有功功率. Q(I):第I节点的注入无功功率.** P0(I) :第I节点有功功率误差. Q0(I):第I节点无功功率误差. ** V0(I) :第I节点(PV节点)的电压误差(平方误差). ** V(I) :第I节点的电压误差幅值. * * E(I) :第I节点的电压的实部. F(I):第I节点的电压的虚部. ** JM(I,J):Jacoby矩阵的第I行J列元素. ** A(I,J):修正方程的增广矩阵,三角化矩阵的第I行J列元素,运算结 ** 束后A矩阵的最后一列存放修正的解. ** P1(I) :第I支路由S1(I)节点注入的有功功率. ** Q1(I) :第I支路由S1(I)节点注入的无功功率. ** P2(I) :第I支路由E1(I)节点注入的有功功率. ** Q2(I) :第I支路由E1(I)节点注入的无功功率. ** P3(I) :第I支路的有功功率损耗. * * Q3(I) :第I支路的无功功率损耗. * * ANGLE(I):第I节点电压的角度.********************************************************************/ #include <math.h>#include <stdio.h>#define f1(i) (i-1)/* 把习惯的一阶矩阵的下标转化为C语言数组下标*/#define f2(i,j,n) ((i-1)*(n)+j-1)/* 把习惯的二阶矩阵的下标转化为C语言数组下标*//***************************************************** 本子程序根据所给的支路导纳及有关信息,形成结点 ** 导纳矩阵,如打印参数K=1,则输出电导矩阵G和电纳矩B *****************************************************/void ybus(int n,int l,int m,float *g,float *b,float *g1,float *b1,float *c1,\float *c,float *co,int k,int *s1,int *e1) {extern FILE *file4;FILE *fp;int i,j,io,i0;int pos1,pos2;int st,en;if(file4==NULL){fp=stdout;}else{fp=file4; /* 输出到文件 */}/* 初始化矩阵G,B */for(i=1;i<=n;i++){for(j=1;j<=n;j++){pos2=f2(i,j,n);g[pos2]=0;b[pos2]=0;}}/* 计算支路导纳 */for(i=1;i<=l;i++){/* 计算对角元 */pos1=f1(i);st=s1[pos1];en=e1[pos1];pos2=f2(st,st,n);g[pos2]+=g1[pos1];b[pos2]+=b1[pos1]+c1[pos1];pos2=f2(en,en,n);g[pos2]+=g1[pos1];b[pos2]+=b1[pos1]+c1[pos1];/* 计算非对角元 */pos2=f2(st,en,n);g[pos2]-=g1[pos1];b[pos2]-=b1[pos1];g[f2(en,st,n)]=g[f2(st,en,n)];b[f2(en,st,n)]=b[f2(st,en,n)];}/* 计算接地支路导纳 */for(i=1;i<=n;i++){/* 对称部分*/b[f2(i,i,n)]+=co[f1(i)];/* 非对称部分*/for(j=1;j<=l;j++){b[f2(i,i,n)]+=c[f2(i,j,l)];}}if(k!=1){return; /* 如果K不为 1,则返回;否则,打印导纳矩阵 */ }fprintf(fp,"\n BUS ADMITTANCE MATRIXY(BUS):");fprintf(fp,"\n ******************* ARRAY G ********************"); for(io=1;io<=n;io+=5){i0=(io+4)>n?n:(io+4);fprintf(fp,"\n");for(j=io;j<=i0;j++){fprintf(fp,"%13d",j);}for(i=1;i<=n;i++){fprintf(fp,"\n%2d",i);for(j=io;j<=i0;j++){fprintf(fp,"%13.6f",g[f2(i,j,n)]);}}fprintf(fp,"\n");}fprintf(fp,"\n ******************* ARRAY B ********************");for(io=1;io<=n;io+=5){i0=(io+4)>n?n:(io+4);fprintf(fp,"\n");for(j=io;j<=i0;j++){fprintf(fp,"%13d",j);}for(i=1;i<=n;i++){fprintf(fp,"\n%2d",i);for(j=io;j<=i0;j++){fprintf(fp,"%13.6f",b[f2(i,j,n)]);}}fprintf(fp,"\n");}fprintf(fp,"\n************************************************");}/******************************************** 本子程序根据所给的功率及电压等数据 ** 求出功率及电压误差量,并返回最大有功功率 ** 以用于与给定误差比较.如打印参数K=1,则输 ** 出P0,Q0(对PQ结点),V0(对PV结点). ********************************************/void dpqc(float *p,float *q,float *p0,float *q0,float *v,float *v0,int m,\int n,float *e,float *f,int k,float *g,float *b,float *dd){extern FILE *file4;FILE *fp;int i,j,l;int pos1,pos2;float a1,a2,d1,d;if(file4==NULL){fp=stdout; /* 输出到屏幕 */}else{fp=file4; /* 输出到文件*/}l=n-1;if(k==1){fprintf(fp,"\n CHANGE OFP0,V**2,P0(I),Q0(I),V0(I) ");fprintf(fp,"\n I P0(I)Q0(I)");}for(i=1;i<=l;i++){a1=0;a2=0;pos1=f1(i);for(j=1;j<=n;j++){/* a1,a2对应课本p185式(4-86)中括号内的式子 */pos2=f2(i,j,n);a1+=g[pos2]*e[f1(j)]-b[pos2]*f[f1(j)];a2+=g[pos2]*f[f1(j)]+b[pos2]*e[f1(j)];}/* 计算式(4-86)(4-87)中的deltaPi */p0[pos1]=p[pos1]-e[pos1]*a1-f[pos1]*a2;if(i <= m){ /* 计算PQ结点中的deltaQi */q0[pos1]=q[pos1]-f[pos1]*a1+e[pos1]*a2;}else{ /* 计算PV结点中的deltaVi平方*/v0[pos1]=v[pos1]*v[pos1]-e[pos1]*e[pos1]-f[pos1]*f[pos1];}/* 输出结果 */if(k==1){if(i<m){fprintf(fp,"\n %2d %15.6e %15.6e",i,p0[pos1],q0[pos1]);}else if(i==m){fprintf(fp,"\n %2d %15.6e %15.6e",i,p0[pos1],q0[pos1]);fprintf(fp,"\n I P0(I)V0(I)");}else{fprintf(fp,"\n %2d %15.6e %15.6e",i,p0[pos1],v0[pos1]);}}}/* 找到deltaP和deltaQ中的最小者,作为收敛指标, 存在dd中 */d=0;for(i=1;i<=l;i++){pos1=f1(i);d1=p0[pos1]>0 ? p0[pos1] : -p0[pos1];if(d<d1){d=d1;}if(i<=m){d1=q0[pos1]>0?q0[pos1]:-q0[pos1];if(d<d1){d=d1;}}}(*dd)=d;}/**************************************************** 本子程序根据节点导纳及电压求Jacoby矩阵,用于求** 电压修正量,如打印参数K=1,则输出Jacoby矩阵. ** 对应于课本P186式(4-89)(4-90) ****************************************************/void jmcc(int m,int n,int n0,float *e,float *f,float *g,float *b,float *jm,int k){extern FILE *file4;FILE *fp;int i,j,i1,io,i0,ns;int pos1,pos2;if(file4==NULL){fp=stdout;}else{fp=file4;}/* 初始化矩阵jm */for(i=1;i<=n0;i++){for(j=1;j<=n0;j++){jm[f2(i,j,n0)]=0;}}ns=n-1; /* 去掉一个平衡结点 *//* 计算式(4-89)(4-90) */for(i=1;i<=ns;i++){/* 计算式(4-90) */for(i1=1;i1<=n;i1++){/* pos1是式(4-90)中的j */pos1=f1(i1);/* pos2是式(4-90)中的ij */pos2=f2(i,i1,n);if(i<=m) /* i是PQ结点 */{/* 计算式(4-90)中的Jii等式右侧第一部分 */jm[f2(2*i-1,2*i-1,n0)]+=g[pos2]*f[pos1]+b[pos2]*e[pos1 ];/* 计算式(4-90)中的Lii等式右侧第一部分 */jm[f2(2*i-1,2*i,n0)]+=-g[pos2]*e[pos1]+b[pos2]*f[pos1];}/* 计算式(4-90)中的Hii等式右侧第一部分 */jm[f2(2*i,2*i-1,n0)]+=-g[pos2]*e[pos1]+b[pos2]*f[pos1];/* 计算式(4-90)中的Nii等式右侧第一部分 */jm[f2(2*i,2*i,n0)]+=-g[pos2]*f[pos1]-b[pos2]*e[pos1];}/* pos2是式(4-90)中的ii */pos2=f2(i,i,n);/* pos1是式(4-90)中的i */pos1=f1(i);if(i<=m) /* i是PQ结点 */{/* 计算式(4-90)中的Jii */jm[f2(2*i-1,2*i-1,n0)]+=-g[pos2]*f[pos1]+b[pos2]*e[pos1] ;/* 计算式(4-90)中的Lii */jm[f2(2*i-1,2*i,n0)]+=g[pos2]*e[pos1]+b[pos2]*f[po s1];}/* 计算式(4-90)中的Hii */jm[f2(2*i,2*i-1,n0)]+=-g[pos2]*e[pos1]-b[pos2]*f[pos1];/* 计算式(4-90)中的Jii */jm[f2(2*i,2*i,n0)]+=-g[pos2]*f[pos1]+b[pos2]*e[pos1];if(i>m) /* PV结点 */{/* 计算式(4-90)中的Rii */jm[f2(2*i-1,2*i-1,n0)]=-2*e[pos1];/* 计算式(4-90)中的Sii */jm[f2(2*i-1,2*i,n0)]=-2*f[pos1];}/* 计算式(4-89) */for(j=1;j<=ns;j++){if(j!=i){/* pos1是式(4-89)中的i */pos1=f1(i);/* pos2是式(4-89)中的ij */pos2=f2(i,j,n);/* 计算式(4-89)中的Nij */jm[f2(2*i,2*j,n0)]=b[pos2]*e[pos1]-g[pos2]*f[pos1];/* 计算式(4-89)中的Hij */jm[f2(2*i,2*j-1,n0)]=-g[pos2]*e[pos1]-b[pos2]*f[pos1];if(i<=m) /* i是PQ结点 */{/* 计算式(4-89)中的Lij (=-Hij) */jm[f2(2*i-1,2*j,n0)]=-jm[f2(2*i,2*j-1,n0)];/* 计算式(4-89)中的Jij (=Nij) */jm[f2(2*i-1,2*j-1,n0)]=jm[f2(2*i,2*j,n0)];}else /* i是PV结点 */{/* 计算式(4-89)中的Rij (=0) */jm[f2(2*i-1,2*j-1,n0)]=0;/* 计算式(4-89)中的Sij (=0) */jm[f2(2*i-1,2*j,n0)]=0;}}}}if(k!=1){return;}/* 输出Jacoby矩阵 */fprintf(fp,"\n J MATRIX(C)"); for(io=1;io<=n0;io+=5){i1=(io+4)>n0?n0:(io+4);fprintf(fp,"\n");for(j=io;j<=i1;j++){fprintf(fp,"%10d",j);}for(i=1;i<=n0;i++){fprintf(fp,"\n%2d",i);for(j=io;j<=i1;j++){fprintf(fp,"%12.6f",jm[f2(i,j,n0)]);}}}fprintf(fp,"\n");}/*********************************************** 本子程序用选列主元素的高斯消元法求解组 ** 性方程组求各结点电压修正量,如打印参数K=1,则** 输出增广矩阵变换中的上三角及电压修正量.如果** 无唯一解,则给出信息,并停止程序运行. ***********************************************/void sevc ( float a[], int n0, int k, int n1){extern FILE *file4;FILE *fp;int i,j,l,n2,n3,n4,i0,io,j1,i1;float t0,t,c;if(file4==NULL) fp=stdout;else fp=file4;for(i=1;i<=n0;i++){l=i;for(j=i;j<=n0;j++){if( fabs(a[f2(j,i,n1)]) > fabs(a[f2(l,i,n1)]) ){l=j; /* 找到这行中的最大元 */}}if(l!=i){ /* 行列交换 */for (j=i;j<=n1;j++){t=a[f2(i,j,n1)];a[f2(i,j,n1)]=a[f2(l,j,n1)];a[f2(l,j,n1)]=t;}}if (fabs(a[f2(i,i,n1)]-0)<1e-10){ /* 对角元近似于0, 无解 */printf("\nNo Solution\n");exit (1);}t0=a[f2(i,i,n1)];for(j=i;j<=n1;j++){/* 除对角元 */a[f2(i,j,n1)]/=t0;}if(i==n0){ /* 最后一行,不用消元 */continue;}/* 消元 */j1=i+1;for(i1=j1;i1<=n0;i1++){c=a[f2(i1,i,n1)];for(j=i;j<=n1;j++){a[f2(i1,j,n1)] -= a[f2(i,j,n1)] *c;}}}if(k==1){ /* 输出上三角矩阵 */fprintf(fp,"\nTrianglar Angmentex Matrix ");for(io=1;io<=n1;io+=5){i0=(io+4)>n1?n1:(io+4);fprintf(fp,"\n");fprintf(fp," ");for(i=io;i<=i0;i++){fprintf(fp,"%12d",i);}for(i=1;i<=n0;i++){fprintf(fp,"\n");fprintf(fp,"%2d",i);for(j=io;j<=i0;j++){fprintf(fp,"%15.6f", a[f2(i,j,n1)]);}}}}/* 回代求方程解 */n2=n1-2;for(i=1;i<=n2;i++){n3=n1-i;for(i1=n3;i1<=n0;i1++){n4=n0-i;a[f2(n4,n1,n1)] -= a[f2(i1,n1,n1)]*a[f2(n4,i1,n1)];}}if(k!=1){return;}/* 输出电压修正值 */fprintf(fp,"\nVoltage correction E(i), F(i) :");for(io=1;io<=n0;io+=4){i1=(io+1)/2;i0=((io+3)/2)>(n0/2)?(n0/2):((io+3)/2);fprintf(fp,"\n");for(j=i1;j<=i0;j++){fprintf(fp,"%16d%16d",j,j);}i1 = 2*i0;fprintf(fp,"\n");for(i=io;i<=i1;i++){fprintf(fp,"%15.6f", a[f2(i,n1,n1)]);}}}#define Pi 3.1415927/180void plsc(int n,int l,int m,float g[],float b[],float e[],float f[],\int e1[],int s1[],float g1[],floatb1[],float c1[],float c[],\float co[],float p1[],float q1[],floatp2[],float q2[],float p3[],\float q3[],float p[],float q[],floatv[],float angle[],int k1){extern FILE *file4;FILE *fp;float t1,t2,st,en,cm,x,y,z,x1,x2,y1,y2;int i,i1,j,m1,ns,pos1,pos2,km;ns=n-1;if(file4==NULL){fp=stdout;}else{fp=file4;}fprintf(fp,"\nTHE RESULT ARE:");if(k1==1){for(i=0;i<n;i++){angle[i]*=Pi;e[i]=v[i]*cos(angle[i]);f[i]=v[i]*sin(angle[i]);}}t1=0.0;t2=0.0;for(i=1;i<=n;i++){pos1=f1(i);pos2=f2(n,i,n);t1+=g[pos2]*e[pos1]-b[pos2]*f[pos1];t2+=g[pos2]*f[pos1]+b[pos2]*e[pos1];}pos1=f1(n);p[pos1]=t1*e[pos1];q[pos1]=-t2*e[pos1];m1=m+1;for(i1=m1;i1<=ns;i1++){t1=0;t2=0;for(i=1;i<=n;i++){pos1=f1(i);pos2=f2(i1,i,n);t1+=g[pos2]*e[pos1]-b[pos2]*f[pos1];t2+=g[pos2]*f[pos1]+b[pos2]*e[pos1];}pos1=f1(i1);q[pos1]=f[pos1]*t1-e[pos1]*t2;}for(i=0;i<n; i++){cm=co[i];if(cm!=0){q[i]-=(e[i]*e[i]+f[i]*f[i])*cm;}}fprintf(fp,"\nBUS DATA");fprintf(fp,"\nBUS VOLTAGE ANGLE(DEG S.) BUS P BUS Q");for(i=0;i<n;i++){v[i]=sqrt(e[i]*e[i]+f[i]*f[i]);x=e[i];y=f[i];z=y/x;angle[i]=atan(z);angle[i]/=Pi;fprintf(fp,"\n%3d%13.5e%15.5f%15.5e%15.5e",i+1,v[i],angle[ i],p[i],q[i]);}fprintf(fp,"\n LINE FLOW ");for(i=1;i<=l;i++){pos1=f1(i);st=s1[pos1];en=e1[pos1];x1=e[f1(st)]*e[f1(st)]+f[f1(st)]*f[f1(st)];x2=e[f1(en)]*e[f1(en)]+f[f1(en)]*f[f1(en)];y1=e[f1(st)]*e[f1(en)]+f[f1(st)]*f[f1(en)];y2=f[f1(st)]*e[f1(en)]-e[f1(st)]*f[f1(en)];p1[pos1]=(x1-y1)*g1[pos1]-y2*b1[pos1];q1[pos1]=-x1*(c1[pos1]+b1[pos1])+y1*b1[pos1]-y2*g1[pos1];p2[pos1]=(x2-y1)*g1[pos1]+y2*b1[pos1];q2[pos1]=-x2*(c1[pos1]+b1[pos1])+y1*b1[pos1]+y2*g1[pos1];for(j=1;j<=n;j++){cm=c[f2(j,i,l)];if(cm!=0.0){km=1;if(en==j){km=2;}if(km==1){q1[pos1]-=(e[f1(j)]*e[f1(j)]+f[f1(j)]*f[f1(j)])*cm;}else{q2[pos1]-=(e[f1(j)]*e[f1(j)]+f[f1(j)]*f[f1(j)])*cm;}}}p3[pos1]=p1[pos1]+p2[pos1] ;q3[pos1]=q1[pos1]+q2[pos1] ;fprintf(fp,"\n%2d%8d%11d%13.6e%13.6e%13.6e%13.6e%17d%11d%1 3.6e%13.6e",\i,s1[pos1],e1[pos1],p1[pos1],q1[pos1],p3[pos1],q3[pos1 ],\e1[pos1],s1[pos1],p2[pos1],q2[pos1]);}}。
C语言潮流计算研究报告
潮流计算研究报告一、潮流计算概述电力工业是国民经济的基础产业,为保证电力系统安全、稳定及可靠的运行,首先需计算电力系统网络潮流。
潮流计算指根据给定的电力系统运行条件及系统接线情况确定整个电力系统各部分的运行状态:各母线电压、各元件流过的功率及系统功率损耗等等。
在电力系统规划、设计及运行方式的研究中,都需要利用潮流计算来定量地分析比较供电方案或运行方式的合理性、可靠性及经济性,所以潮流计算是研究电力系统的一种很重要和很基础的计算。
在数学上潮流计算问题是一组多元非线性方程式求解问题,其解法离不开迭代。
二、潮流计算算法框图三、节点分类本次设计采用直角坐标牛顿拉夫逊法,用C语言编制潮流计算程序。
牛顿法拉夫逊:把非线性方程式的求解过程变成反复对相应的线性方程式的求解过程,通常称为逐次线性化过程。
节点分类:1)平衡节点已知节点的电压幅值和相角,求有功和无功,一般设在调频厂(一个)。
2)PQ节点已知节点的有功、无功,求电压幅值和相角,一般设在变电所母线,按给定频率发电的电厂母线(多个)。
3)PV节点已知节点的有功和电压幅值,求无功和电压相角,一般设在有无功补偿的变电所母线,无功可调的发电厂母线(少个)。
四、基本公式1、节点注入电流2、节点功率3、不平衡量4、雅可比矩阵(1)i ≠ j时(2)i=j 时5、线路功率及损耗五、IEEE30拓扑结构IEEE30节点结构六、算法输入原始数据1、支路参数(支路数L=41)始端末端回线数线路类型线路电阻线路电抗线路电纳(B/2)/ 变比2 1 1 0 0.0192 0.0575 0.0528 03 1 1 0 0.0452 0.1852 0.0408 04 2 1 0 0.057 0.1737 0.0368 04 3 1 0 0.0132 0.0379 0.0084 05 2 1 0 0.0472 0.1983 0.0418 06 2 1 0 0.0581 0.1763 0.0374 06 4 1 0 0.0119 0.0414 0.009 07 5 1 0 0.046 0.116 0.0204 07 6 1 0 0.0267 0.082 0.017 08 6 1 0 0.012 0.042 0.009 06 9 1 1 0 0.208 0 0.9786 10 1 1 0 0.556 0 0.96911 9 1 0 0 0.208 0 010 9 1 0 0 0.11 0 04 12 1 1 0 0.256 0 0.93213 12 1 0 0 0.14 0 014 12 1 0 0.1231 0.2559 0 015 12 1 0 0.0662 0.1304 0 016 12 1 0 0.0945 0.1987 0 015 14 1 0 0.221 0.1997 0 017 16 1 0 0.0524 0.1923 0 018 15 1 0 0.1073 0.2185 0 019 18 1 0 0.0639 0.1292 0 020 19 1 0 0.034 0.068 0 020 10 1 0 0.0936 0.209 0 017 10 1 0 0.0324 0.0845 0 021 10 1 0 0.0348 0.0749 0 022 10 1 0 0.0727 0.1499 0 022 21 1 0 0.0116 0.0236 0 023 15 1 0 0.1 0.202 0 024 22 1 0 0.115 0.179 0 024 23 1 0 0.132 0.27 0 025 24 1 0 0.1885 0.3292 0 026 25 1 0 0.2544 0.38 0 027 25 1 0 0.1093 0.2087 0 028 27 1 1 0 0.396 0 0.96829 27 1 0 0.2198 0.4153 0 030 27 1 0 0.3202 0.6027 0 030 29 1 0 0.2399 0.4533 0 028 8 1 0 0.0636 0.2 0.0428 028 6 1 0 0.0169 0.0599 0.013 02、节点参数(节点数N=30)编号节点类型电压实部电压虚部负荷有功负荷无功发电有功发电无功PV节点的V 并联电容1 1 1.05 0 0 0 0 0 1.05 02 3 1.045 0 0.217 0.127 0.8 0 1.045 03 2 1 0 0.024 0.012 0 0 1 04 2 1 0 0.076 0.016 0 0 1 05 3 1.01 0 0.942 0.190 0.5 0 1.01 06 2 1 0 0 0 0 0 1 07 2 1 0 0.228 0.109 0 0 1 08 3 1.01 0 0.30 0.30 0.2 0 1.01 09 2 1 0 0 0 0 0 1 010 2 1 0 0.058 0.02 0 0 1 0.1911 3 1.05 0 0 0 0.2 0 1.05 012 2 1 0 0.112 0.075 0 0 1 013 3 1.05 0 0 0 0.2 0 1.05 014 2 1 0 0.062 0.016 0 0 1 015 2 1 0 0.082 0.025 0 0 1 016 2 1 0 0.035 0.018 0 0 1 017 2 1 0 0.09 0.058 0 0 1 018 2 1 0 0.032 0.009 0 0 1 019 2 1 0 0.095 0.034 0 0 1 020 2 1 0 0.022 0.007 0 0 1 021 2 1 0 0.175 0.112 0 0 1 022 2 1 0 0 0 0 0 1 023 2 1 0 0.032 0.016 0 0 1 024 2 1 0 0.087 0.067 0 0 1 0.04325 2 1 0 0 0 0 0 1 026 2 1 0 0.035 0.023 0 0 1 027 2 1 0 0 0 0 0 1 028 2 1 0 0 0 0 0 1 029 2 1 0 0.024 0.009 0 0 1 0302 1 0 0.106 0.019 0 0 1 0七、潮流程序#include<iostream.h>#include<fstream.h>#include <iomanip.h> //使用setw函数#include<math.h>#include "stdlib.h"#include<stdio.h>#include "math.h"#include <iostream>#include <stdio.h>#include <tchar.h>#include <fstream>#include <cmath>#include <process.h>#include <math.h>#include <malloc.h>using namespace std;void main(){FILE *fp;fp=fopen("result.txt","w");ifstream fin;fin.open("node information.txt");int node_num;fin>>node_num;int n = node_num*(node_num-1);int Jocabi_rank=2*(node_num-1);double * * Jocabi=new double * [Jocabi_rank];int *II=new int[n];int *JJ=new int[n];double *WR=new double[n];double *WX=new double[n];double *WXC=new double[n];double *WNT=new double[n];for(int i=0;i<n;i++){II[i]=0;JJ[i]=0;WR[i]=0;WX[i]=0;WXC[i]=0;WNT[i]=0;}double *GF=new double[n];for(int GF_i=0;GF_i<=n;GF_i++)GF[GF_i]=0;double *BF=new double[n];for(int BF_i=0;BF_i<=n;BF_i++)BF[BF_i]=0;double * * GF1=new double * [node_num+1];for (int GF1_i=0;GF1_i<node_num;GF1_i++){GF1[GF1_i]=new double[node_num+1];for (int GF1_j=0;GF1_j<node_num;GF1_j++){GF1[GF1_i][GF1_j]=0;}} double * * BF1=new double * [node_num+1];for (int BF1_i=0;BF1_i<=node_num;BF1_i++) {BF1[BF1_i]=new double[node_num+1];for (int BF1_j=0;BF1_j<node_num;BF1_j++) {BF1[BF1_i][BF1_j]=0;}} double *GD=new double[node_num];for(int GD_i=0;GD_i<=node_num;GD_i++){GD[GD_i]=0;}double *BD=new double[node_num];for(int BD_i=0;BD_i<=node_num;BD_i++){BD[BD_i]=0;}double * BC=new double[node_num];for(int BC_i=0;BC_i<=node_num;BC_i++){BC[BC_i]=0;}for(i=0;i<n;i++)fin>>II[i]>>JJ[i]>>WR[i]>>WX[i]>>WXC[i]>>WNT[i];//节点导纳矩阵int p,q;double K;for(i=0;i<n;i++){p=0;q=0;K=0.0;if(WNT[i]==0){GF[i]=WR[i]/(WR[i]*WR[i]+WX[i]*WX[i]);BF[i]=(-WX[i])/(WR[i]*WR[i]+WX[i]*WX[i]);}if(WNT[i]>0){K=WNT[i];p=II[i];GF[i]=(WR[i]/(WR[i]*WR[i]+WX[i]*WX[i]))/K;BF[i]=((-WX[i])/(WR[i]*WR[i]+WX[i]*WX[i]))/K;GD[p-1]=GD[p-1]+((K-1)/K)*(WR[i]/(WR[i]*WR[i]+WX[i]*WX[i]));BD[p-1]=BD[p-1]+((K-1)/K)*(-WX[i])/(WR[i]*WR[i]+WX[i]*WX[i]);}if(WNT[i]<0){K=fabs(WNT[i]);q=JJ[i];GF[i]=(WR[i]/(WR[i]*WR[i]+WX[i]*WX[i]))/K;BF[i]=((-WX[i])/(WR[i]*WR[i]+WX[i]*WX[i]))/K;GD[q-1]=GD[q-1]+((1-K)/(K*K))*WR[i]/(WR[i]*WR[i]+WX[i]*WX[i]);BD[q-1]=BD[q-1]+((1-K)/(K*K))*(-WX[i])/(WR[i]*WR[i]+WX[i]*WX[i]);}}for(int I=1;I<=node_num;I++){BC[I-1]=0.0;for(int i=0;i<n;i++){int J=0;if(II[i]==I){if(WXC[i]<1000)BC[I-1]=BC[I-1]+WXC[i];J=JJ[i];GF1[I-1][J-1]=-GF[i];BF1[I-1][J-1]=-BF[i];GF1[I-1][I-1]=GF1[I-1][I-1]+GF[i];BF1[I-1][I-1]=BF1[I-1][I-1]+BF[i];}}GF1[I-1][I-1]=GF1[I-1][I-1]+GD[I-1];BF1[I-1][I-1]=BF1[I-1][I-1]+BD[I-1]+BC[I-1];} //输出节点导纳矩阵fprintf(fp,"节点导纳矩阵是: \n");for(int m=0;m<node_num;m++){for(int n=0;n<node_num;n++){fprintf(fp,"%9.6f",GF1[m][n]);fprintf(fp,"+j");fprintf(fp,"%9.6f",BF1[m][n]);fprintf(fp," ");}fprintf(fp,"\n");}fprintf(fp,"\n");fprintf(fp,"\n");fprintf(fp,"\n");//$$$$$$$$$$$$$$$$$输出节点导纳矩阵完毕$$$$$$$$$$$$$$$$$$$$$//$$$$$$$$$$$$$$$$$$$求节点初始差值$$$$$$$$$$$$$$$$$$$$$$$$$ double *wv=new double [node_num];double *we=new double [node_num];double *wf=new double [node_num];double *wp_g=new double [node_num];double *wq_g=new double [node_num];double *wp_l=new double [node_num];double *wq_l=new double [node_num];double *wn=new double [node_num];for(int p_i=0;p_i<node_num;p_i++){wv[p_i]=0;we[p_i]=0;wf[p_i]=0;wp_g[p_i]=0;wq_g[p_i]=0;wp_l[p_i]=0;wq_l[p_i]=0;wn[p_i]=0;}double * dp=new double [node_num];for (int dp_i=0;dp_i<node_num;dp_i++)dp[dp_i]=0;double * dq=new double [node_num];for (int dq_i=0;dq_i<node_num;dq_i++)dq[dq_i]=0;double * dvv=new double [node_num];for (int dvv_i=0;dvv_i<node_num;dvv_i++)dvv[dvv_i]=0;double * sm=new double [node_num];double * sn=new double [node_num];int n_m=0 ;ifstream ffin;ffin.open("node power.txt");for(int pi=0;pi<node_num;pi++){ffin>>wp_g[pi]>>wq_g[pi]>>wp_l[pi]>>wq_l[pi]>>we[pi]>>wf[pi]>> wn[pi];}for(int wv_i=0;wv_i<node_num;wv_i++){wv[wv_i]=we[wv_i];}double * w_p=new double [node_num];double * w_q=new double [node_num];for (int w_i=0;w_i<node_num;w_i++){w_p[w_i]=0;w_q[w_i]=0;}//开始迭代,次数为iterative_frequencyfor (intiterative_frequency=0;iterative_frequency<12;iterative_frequency++) {fprintf(fp,"第[");fprintf(fp,"%2d",iterative_frequency);fprintf(fp,"]次迭代结果如下:");fprintf(fp,"\n");n_m=0;for(int Jocabi_i=0;Jocabi_i<Jocabi_rank;Jocabi_i++){Jocabi[Jocabi_i]=new double[Jocabi_rank];for(int Jocabi_j=0;Jocabi_j<Jocabi_rank;Jocabi_j++)Jocabi[Jocabi_i][Jocabi_j]=0;}for(i=0;i<node_num;i++){sm[i]=0;sn[i]=0;}for(i=0;i<node_num;i++){if(wn[i]==1){for(int j=0;j<node_num;j++){sm[i]=sm[i]+(GF1[i][j]*we[j]-BF1[i][j]*wf[j]);sn[i]=sn[i]+(GF1[i][j]*wf[j]+BF1[i][j]*we[j]);}dp[i]=wp_l[i]-we[i]*sm[i]-wf[i]*sn[i];dq[i]=wq_l[i]-wf[i]*sm[i]+we[i]*sn[i];n_m++;}if(wn[i]==2){for(int j=0;j<node_num;j++){sm[i]=sm[i]+(GF1[i][j]*we[j]-BF1[i][j]*wf[j]);sn[i]=sn[i]+(GF1[i][j]*wf[j]+BF1[i][j]*we[j]);}dp[i]=wp_g[i]-we[i]*sm[i]-wf[i]*sn[i];dvv[i]=wv[i]*wv[i]-(we[i]*we[i]+wf[i]*wf[i]);w_p[i]=we[i]*sm[i]+wf[i]*sn[i];w_q[i]=wf[i]*sm[i]-we[i]*sn[i];fprintf(fp,"第[" );fprintf(fp,"%2d",i+1 );fprintf(fp, "]个节点是PV节点,且其节点功率为:");fprintf(fp,"%9.6f",w_p[i]);fprintf(fp,"+j" );fprintf(fp,"%9.6f",w_q[i]);fprintf(fp,"\n" );} if(wn[i]==0){for(int j=0;j<node_num;j++){sm[i]=sm[i]+(we[j]*GF1[i][j]-wf[j]*BF1[i][j]);sn[i]=sn[i]+(wf[j]*GF1[i][j]+we[j]*BF1[i][j]);}w_p[i]=we[i]*sm[i]+wf[i]*sn[i];;w_q[i]=wf[i]*sm[i]-we[i]*sn[i];fprintf(fp,"第[" );fprintf(fp,"%2d",i+1 );fprintf(fp, "]个节点是平衡节点,其节点功率为:");fprintf(fp,"%9.6f",w_p[i]);fprintf(fp,"+j" );fprintf(fp,"%9.6f",w_q[i]);fprintf(fp,"\n" );} //$$$$$$$$$$$$$$$$$$$$求Jocabi矩阵$$$$$$$$$$$$$$$$$$$$$for(int j=0;j<node_num;j++){if(j==i&&wn[i]==1){Jocabi[2*i][2*j]=-sm[i]-GF1[i][i]*we[i]-BF1[i][i]*wf[i]; Jocabi[2*i][2*j+1]=-sn[i]+BF1[i][i]*we[i]-GF1[i][i]*wf[i]; Jocabi[2*i+1][2*j]=sn[i]+BF1[i][i]*we[i]-GF1[i][i]*wf[i]; Jocabi[2*i+1][2*j+1]=-sm[i]+GF1[i][i]*we[i]+BF1[i][i]*wf[i];} if(j==i&&wn[i]==2){Jocabi[2*i][2*j]=-sm[i]-GF1[i][i]*we[i]-BF1[i][i]*wf[i]; Jocabi[2*i][2*j+1]=-sn[i]+BF1[i][i]*we[i]-GF1[i][i]*wf[i]; Jocabi[2*i+1][2*j]=(-2)*we[i];Jocabi[2*i+1][2*j+1]=(-2)*wf[i];} if(j!=i&&wn[i]==1){Jocabi[2*i][2*j]=(-1)*(GF1[i][j]*we[i]+BF1[i][j]*wf[i]);Jocabi[2*i][2*j+1]=BF1[i][j]*we[j]-GF1[i][j]*wf[i];Jocabi[2*i+1][2*j]=BF1[i][j]*we[j]-GF1[i][j]*wf[i];Jocabi[2*i+1][2*j+1]=GF1[i][j]*we[i]+BF1[i][j]*wf[i];} if(j!=i&&wn[i]==2){Jocabi[2*i][2*j]=(-1)*(GF1[i][j]*we[i]+BF1[i][j]*wf[i]);Jocabi[2*i][2*j+1]=BF1[i][j]*we[j]-GF1[i][j]*wf[i];Jocabi[2*i+1][2*j]=0;Jocabi[2*i+1][2*j+1]=0;}}} //$$$$$$$$$$$$$$$$$$$高斯法解方程$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ double * Dalta_w=new double[Jocabi_rank];for(i=0;i<node_num;i++){if(wn[i]==1){Dalta_w[2*i]=dp[i];Dalta_w[2*i+1]=dq[i];}if(wn[i]==2){Dalta_w[2*i]=dp[i];Dalta_w[2*i+1]=dvv[i];}}double * M=new double[Jocabi_rank];double * X=new double[Jocabi_rank];for(i=0;i<Jocabi_rank;i++){X[i]=0;M[i]=0;}double t;int * js=new int [Jocabi_rank];for(i=0;i<Jocabi_rank;i++)js[i]=0;//交换Jocabi矩阵的行,使每列的对角线元素为所有行中最大的元素double * temp_swap_vector=new double[Jocabi_rank+1];for(inttemp_swap_vector_i=0;temp_swap_vector_i<Jocabi_rank;temp_swap_vector_ i++)temp_swap_vector[temp_swap_vector_i]=0;double temp_variable_for_compare=0;int temp_line=0;for(int diagonal_i=0;diagonal_i<Jocabi_rank;diagonal_i++){temp_variable_for_compare=Jocabi[diagonal_i][diagonal_i];for(intJocabi_line=diagonal_i;Jocabi_line<Jocabi_rank;Jocabi_line++) {if(temp_variable_for_compare<fabs(Jocabi[Jocabi_line][diagonal _i])){temp_variable_for_compare=fabs(Jocabi[Jocabi_line][diagonal_i] );temp_line=Jocabi_line;for(int Jocabi_j_j=0;Jocabi_j_j<Jocabi_rank;Jocabi_j_j++) {temp_swap_vector[Jocabi_j_j]=Jocabi[diagonal_i][Jocabi_j_j];Jocabi[diagonal_i][Jocabi_j_j]=Jocabi[temp_line][Jocabi_j_j];Jocabi[temp_line][Jocabi_j_j]=temp_swap_vector[Jocabi_j_j];}t=Dalta_w[diagonal_i];Dalta_w[diagonal_i]=Dalta_w[temp_line];Dalta_w[temp_line]=t;}}}//$$$$$$$$$$$$$$交换Jocabi矩阵的行完毕$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ double * * temp=new double * [Jocabi_rank];for(i=0;i<Jocabi_rank;i++){temp[i]=new double[Jocabi_rank];for(int j=0;j<Jocabi_rank;j++)temp[i][j]=0.0;}for(int k=0;k<Jocabi_rank;k++){if(Jocabi[k][k]==0) cout<<"fail"<<endl;else{temp[k][k]=Jocabi[k][k];for(int j=0;j<Jocabi_rank;j++)Jocabi[k][j]=Jocabi[k][j]/temp[k][k];Dalta_w[k]=Dalta_w[k]/temp[k][k];for(int ii=k+1;ii<Jocabi_rank;ii++){M[ii]=0.0;M[ii]=Jocabi[ii][k];for(int jj=k;jj<Jocabi_rank;jj++)Jocabi[ii][jj]=Jocabi[ii][jj]-M[ii]*Jocabi[k][jj];Dalta_w[ii]=Dalta_w[ii]-M[ii]*Dalta_w[k];}}} X[Jocabi_rank-1]=Dalta_w[Jocabi_rank-1]/(-Jocabi[Jocabi_rank-1][J ocabi_rank-1]);for(i=Jocabi_rank-2;i>=0;i--){t=0;for(k=i+1;k<Jocabi_rank;k++){t=t+(-Jocabi[i][k])*X[k];}X[i]=(Dalta_w[i]-t)/(-Jocabi[i][i]);}for(i=0;i<node_num;i++){if(wn[i]==1){we[i]=we[i]+X[2*i];wf[i]=wf[i]+X[2*i+1];fprintf(fp,"第[");fprintf(fp,"%2d",i+1);fprintf(fp,"]个节点是PQ节点其节点电压实部修正量是:");fprintf(fp,"%9.6f",X[2*i]);fprintf(fp," 其节点电压虚部修正量是:");fprintf(fp,"%9.6f",X[2*i+1]);fprintf(fp,"\n");} if(wn[i]==2){we[i]=we[i]+X[2*i];wf[i]=wf[i]+X[2*i+1];fprintf(fp,"第[");fprintf(fp,"%2d",i+1);fprintf(fp,"]个节点是PV节点其节点电压实部修正量是:");fprintf(fp,"%9.6f",X[2*i]);fprintf(fp," 其节点电压虚部修正量是:");fprintf(fp,"%9.6f",X[2*i+1]);fprintf(fp,"\n");}} fprintf(fp,"\n");fprintf(fp,"\n");//$$$$$$$$$$$$$$$$判断是否收敛并求最后的差值$$$$$$$$$$$$$$$$$$$$$$ double ch=0;double * * s_p=new double * [node_num+1];for(int s_p_i=1;s_p_i<=node_num+1;s_p_i++){s_p[s_p_i]=new double[node_num+1];for(int s_p_j=1;s_p_j<=node_num+1;s_p_j++)s_p[s_p_i][s_p_j]=0;}double * * s_q=new double * [node_num+1];for(int s_q_i=1;s_q_i<=node_num+1;s_q_i++){s_q[s_q_i]=new double[node_num+1];for(int s_q_j=1;s_q_j<=node_num+1;s_q_j++)s_q[s_q_i][s_q_j]=0;}for(int ci=1;ci<=node_num-1;ci++){if((fabs(Dalta_w[ci]))>(fabs(ch))){ch=fabs(Dalta_w[ci]);}}fprintf(fp,"判断是否迭代的最大值是:");fprintf(fp,"%9.6f",ch);fprintf(fp,"\n");fprintf(fp,"\n");if(ch<1e-005){double *UU=new double [node_num];for(int k=0;k<node_num;k++)UU[k]=0.0;for(k=0;k<node_num;k++)UU[k]=we[k]*we[k]+wf[k]*wf[k];double *G_ground=new double [n];double *B_ground=new double [n];for(int i=0;i<n;i++){G_ground[i]=0;B_ground[i]=0;}cout<<"满足迭代要求,计算完成,迭代次数是"<<iterative_frequency<<endl;fprintf(fp,"||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||\n");fprintf(fp,"\n");fprintf(fp,"满足迭代要求,计算完成,迭代次数是");fprintf(fp,"%2d",iterative_frequency);fprintf(fp,"\n");for(i=0;i<node_num;i++){fprintf(fp,"节点");fprintf(fp,"[");fprintf(fp,"%2d",i+1);fprintf(fp,"]的电压是:");fprintf(fp,"%9.6f",we[i]);if(wf[i]>0){fprintf(fp," + j");fprintf(fp,"%9.6f",wf[i]);}if(wf[i]<0){fprintf(fp," - j");fprintf(fp,"%9.6f",fabs(wf[i]));}fprintf(fp," 幅值是:");fprintf(fp,"%9.6f",sqrt(we[i]*we[i]+wf[i]*wf[i]));fprintf(fp," 相角是:");fprintf(fp,"%9.6f",atan(wf[i]/we[i])*180/3.1415926);fprintf(fp,"度");fprintf(fp,"\n");}fprintf(fp,"线路功率是:\n");for(int j=0;j<n;j++){double K=0.0;int p=0;int q=0;p=II[j];q=JJ[j];if(p==0&&q==0)break;GF[j]=WR[j]/(WR[j]*WR[j]+WX[j]*WX[j]);BF[j]=(-WX[j])/(WR[j]*WR[j]+WX[j]*WX[j]);if(WNT[j]<0){K=fabs(WNT[j]);G_ground[j]=((1-K)/(K*K))*GF[j];B_ground[j]=((1-K)/(K*K))*BF[j];}if(WNT[j]>0){K=WNT[j];G_ground[j]=((K-1)/K)*GF[j];B_ground[j]=((K-1)/K)*BF[j];}if(WXC[j]<1000)B_ground[j]=B_ground[j]+WXC[j];s_p[p][q]=UU[p-1]*G_ground[j]+UU[p-1]*GF1[p-1][q-1]-(we[p-1]*we[q -1]+wf[p-1]*wf[q-1])*GF1[p-1][q-1]+(we[p-1]*wf[q-1]-we[q-1]*wf[p-1])*BF1[p-1][q-1];s_q[p][q]=-UU[p-1]*B_ground[j]-UU[p-1]*BF1[p-1][q-1]+(we[p-1]*we[ q-1]+wf[q-1]*wf[q-1])*BF1[p-1][q-1]+(we[p-1]*wf[q-1]-we[q-1]*wf[p-1])*GF1[p-1][q-1];fprintf(fp,"S[");fprintf(fp,"%2d",p);fprintf(fp,"][");fprintf(fp,"%2d",q);fprintf(fp,"]=");fprintf(fp,"%9.6f",s_p[p][q]);if(s_q[p][q]>0){fprintf(fp," + j");fprintf(fp,"%9.6f",s_q[p][q]);}if(s_q[p][q]<0){fprintf(fp," - j");fprintf(fp,"%9.6f",fabs(s_q[p][q]));}fprintf(fp,"\n");}break;}}//迭代结束八、IEEE30节点的仿真结果1、节点电压编号电压实部电压虚部电压幅值电压相角节点1 1.05 0i 1.05 0度节点2 1.04445 -0.0337697i 1.045 -1.85186度节点3 1.01843 -0.067472i 1.02066 -3.79037度节点4 1.01033 -0.0798977i 1.01348 -4.52159度节点5 1.0035 -0.114413i 1.01 -6.50445度节点6 1.00662 -0.0943613i 1.01104 -5.35528度节点7 0.996459 -0.111039i 1.00263 -6.35844度节点8 1.00511 -0.0993071i 1.01 -5.64266度节点9 1.03035 -0.122151i 1.03756 -6.76104度节点10 1.02229 -0.156054i 1.03413 -8.67927度节点11 1.04666 -0.0837098i 1.05 -4.57268度节点12 1.03608 -0.141734i 1.04573 -7.78959度节点13 1.0436 -0.115738i 1.05 -6.32836度节点14 1.01898 -0.156444i 1.03092 -8.72848度节点15 1.01403 -0.157951i 1.02626 -8.85357度节点16 1.02183 -0.151553i 1.033 -8.43636度节点17 1.01658 -0.157803i 1.02876 -8.82354度节点18 1.00279 -0.167848i 1.01674 -9.50214度节点19 0.999803 -0.170757i 1.01428 -9.69206度节点20 1.00449 -0.16805i 1.01845 -9.49755度节点21 1.00872 -0.162656i 1.02175 -9.16004度节点22 1.00931 -0.162655i 1.02234 -9.15476度节点23 1.00254 -0.16504i 1.01604 -9.34827度节点24 0.996609 -0.169594i 1.01094 -9.65755度节点25 0.995082 -0.169371i 1.00939 -9.65966度节点26 0.976247 -0.173651i 0.991571 -10.0861度节点27 1.00354 -0.166036i 1.01718 -9.3945度节点28 1.00168 -0.102188i 1.00688 -5.82495度节点29 0.980068 -0.184114i 0.997212 -10.6395度节点30 0.96576 -0.197073i 0.985662 -11.5334度2、线路传输功率首端—末端首末功率末首功率2-1 -57.9109+(8.36395)i 58.5228+(-12.325)i3-1 -39.536+(-7.37948)i 40.2261+(5.83313)i4-2 -30.8909+(-9.48018)i 31.4524+(7.29204)i4-3 -36.9557+(-6.53076)i 37.136+(6.17948)i5-2 -44.4784+(-7.6178)i 45.4077+(7.10769)i6-2 -38.4904+(-7.58429)i 39.3508+(6.2414)i6-4 -34.7811+(4.04816)i 34.9241+(-4.02213)i 7-5 -0.260435+(-7.29197)i 0.278436+(5.2715)i7-6 -22.5396+(-3.60803)i 22.6765+(2.30528)i8-6 -11.9244+(0.486521)i 11.9413+(-1.34664)i 6-9 12.3726+(-12.7417)i -12.3726+(13.3835)i6-10 10.9034+(-3.88366)i -10.9034+(4.61235)i 11-9 20+(6.66081)i -20+(-5.82246)i10-9 -32.6509+(-2.67651)i 32.6509+(3.78043)i4-12 23.6005+(-12.0947)i -23.6005+(13.8474)i 13-12 20+(3.45425)i -20+(-2.93116)i14-12 -7.91606+(-2.10553)i 7.99377+(2.26709)i15-12 -18.28+(-5.90486)i 18.5119+(6.36176)i16-12 -7.55825+(-2.98863)i 7.61675+(3.11163)i15-14 -1.7094+(-0.499524)i 1.71605+(0.505537)i 17-16 -4.04947+(-1.1564)i 4.05825+(1.18863)i18-15 -6.09617+(-1.40631)i 6.13679+(1.48904)i19-18 -2.89082+(-0.495509)i 2.89617+(0.506313)i 20-19 6.6264+(2.93893)i -6.60918+(-2.90448)i 20-10 -8.82641+(-3.63893)i 8.90866+(3.82259)i17-10 -4.95054+(-4.64359)i 4.96464+(4.68038)i21-10 -16.1704+(-9.32613)i 16.2865+(9.57613)i22-10 -7.88783+(-4.19568)i 7.94335+(4.31016)i22-21 1.33022+(1.87505)i -1.32963+(-1.87386)i 23-15 -5.6167+(-2.34288)i 5.65258+(2.41535)i24-22 -6.50437+(-2.23775)i 6.55761+(2.32062)i24-23 -2.40853+(-0.726163)i 2.4167+(0.742882)i25-24 -0.212582+(-0.351348)i 0.212894+(0.351893)i 26-25 -3.5+(-2.29999)i 3.54539+(2.36778)i27-25 3.34908+(2.04752)i -3.3328+(-2.01643)i 28-27 16.1025+(-2.11682)i -16.1025+(3.14712)i 29-27 -6.10422+(-1.50686)i 6.1916+(1.67196)i30-27 -6.92977+(-1.35732)i 7.09411+(1.66665)i30-29 -3.67023+(-0.542645)i 3.70422+(0.60687)i28-8 -1.92156+(-3.12492)i 1.92445+(-1.21858)i28-6 -14.7132+(-3.43133)i 14.7506+(2.24037)i 3、发电机注入的功率编号功率实部功率虚部节点1 98.7489 -6.4919i 节点2 80 41.7051i 节点5 50 16.6537i 节点8 20 29.2679i 节点11 20 6.66081i 节点13 20 3.45425i。
电力系统潮流计算程序
电力系统潮流计算c语言程序,两行,大家可以看看,仔细研究,然后在这个基础上修改。
谢谢#include "stdafx.h"#include <iostream>#include <fstream>#include <process.h>#include"Complex.h"#include"wanjing.h"#include"gauss.h"using namespace std;int _tmain(int argc, _TCHAR* argv[]){int i; //i作为整个程序的循环变量int N=Bus::ScanfBusNo(); //输入节点个数int L=Line::ScanflineNo(); //输入支路个数if((L&&N)==0){return 0;} //如果找不到两个文件中的任意一个,退出Line *line=new Line[L]; //动态分配支路结构体Line::ScanfLineData(line); //输入支路参数Line::PrintfLineData(line,L); //输出支路参数Bus *bus=new Bus[N]; //动态分配结点结构体for(int i=0;i<N;i++){bus[i].Sdelta.real=0;bus[i].Sdelta.image=0;}Bus::ScanfBusData(bus); //输入节点参数Bus::PrintfBusData(bus,N); //输出结点参数Complex **X; X=new Complex *[N]; for(i=0;i<N;i++) {X[i]=new Complex[N];}//动态分配二维数组作节点导纳阵Bus::JisuanNodeDnz(X,line,bus,L,N); //计算节点导纳矩阵Bus::PrintfNodeDnz(X,N); //输出节点导纳矩阵int NN=(N-1)*2;double **JacAug; JacAug=new double *[NN]; for(i=0;i<NN;i++) {JacAug[i]=new double[NN+1];}//为雅可比增广动态分配一个二维数组double *x;x=new double[NN];int count=1;LOOP:Bus::JisuanNodeI(X,bus,N); //计算节点注入电流Bus::JisuanNodeScal(X,bus,N); //计算节点功率Bus::JisuanNodeScal(X,bus,N);//计算节点功率Bus::JisuanNodeSdelta(bus,N); //计算节点功率差值Bus::PrintfNodeScal(X,bus,N);//输出节点功率差值int icon=wehcon1(bus,N);//whether converbence看迭代是否结束if(icon==1){cout<<"icon="<<icon<<"进行第"<<count<<"次迭代"<<endl;Bus::JisuanJacAug(JacAug,X,bus,N); //计算雅可比增广矩阵// Bus::PrintfJacAug(JacAug,N);gauss::gauss_slove(JacAug,x,NN);//解方程组求出电压差值Bus::ReviseNodeV(bus,x,N);//修正节点电压// Bus::PrintfNodeV(bus,N);count++;goto LOOP;}else{for(i=0;i<L;i++)//计算输电线路上的传输功率{int statemp,endtemp;Complex aa,bb,cc,dd,B;B.real=0;B.image=-line[i].B;statemp=line[i].start;endtemp=line[i].end;aa=Complex::productComplex (Complex::getconj(bus[statemp-1].V), B);bb=Complex::subComplex (Complex::getconj(bus[statemp-1].V), Complex::getconj(bus[endtemp-1].V));cc=Complex::productComplex (bb , Complex::getconj(line[i].Y));dd=Complex::CaddC(aa,cc);line[i].stoe=Complex::productComplex(b us[statemp-1].V,dd);aa=Complex::productComplex (Complex::getconj(bus[endtemp-1].V), B);bb=Complex::subComplex (Complex::getconj(bus[endtemp-1].V), Complex::getconj(bus[statemp-1].V));cc=Complex::productComplex (bb , Complex::getconj(line[i].Y));dd=Complex::CaddC(aa,cc);line[i].etos=Complex::productComplex(b us[endtemp-1].V,dd);}cout<<"icon="<<icon<<",迭代结束。
电力系统通用潮流计算C语言程序
#include <iostream>#include <fstream>#include<iomanip>#include<math.h>using namespace std;//节点号类型负荷有功负荷无功母线数据(类型1=PV节点,2=PQ节点,3=平衡节点)struct BUS{int busno;int type;float Pd;float Qd;};//发电机数据节点号有功发电电压幅值struct Generator{int busno;float Pg;float Vg;};//支路信息节点I 节点J R X B/2 kstruct Line{int busi;int busj;float R;float X;float B;float k;};//deltaP deltaQ deltaV^2//void fun1(double YG[][50],double YB[][50],double e[],double f[],int type[],int N,double W[],double P[],double Q[],double V[]){double dP=0,dQ=0,dV=0;int i,j;for(i=0;i<N-1;i++){double A=0,B=0;for(j=0;j<N;j++){A+=YG[i][j]*e[j]-YB[i][j]*f[j];B+=YG[i][j]*f[j]+YB[i][j]*e[j];}dV=V[i]*V[i]-e[i]*e[i]-f[i]*f[i];dP=P[i]-e[i]*A-f[i]*B;W[2*i]=dP;dQ=Q[i]-f[i]*A+e[i]*B;if(type[i]==1)W[2*i+1]=dQ;else W[2*i+1]=dV;}}//Jacobi矩阵//void Jacobi(double YG[][50],double YB[][50],double e[50],double f[50],int type[50],int N ,double Ja[100][101]){ int i,j;for(i=0;i<N;i++){for(j=0;j<N;j++){if(i!=j){if(type[i]==1){Ja[2*i][2*j]=-(YG[i][j]*e[i]+YB[i][j]*f[i]);Ja[2*i][2*j+1]=YB[i][j]*e[i]-YG[i][j]*f[i];Ja[2*i+1][2*j]=Ja[2*i][2*j+1];Ja[2*i+1][2*j+1]=-Ja[2*i][2*j];}else {Ja[2*i][2*j]=-YG[i][j]*e[i]+YB[i][j]*f[i];Ja[2*i][2*j+1]=YB[i][j]*e[i]-YG[i][j]*f[i];Ja[2*i+1][2*j+1]=Ja[2*i+1][2*j]=0;}}else {double a[50]={0},b[50]={0};for(int k=0;k<N;k++){a[i]+=(YG[i][k]*e[k]-YB[i][k]*f[k]);b[i]+=(YG[i][k]*f[k]+YB[i][k]*e[k]);Ja[2*i][2*j]=-a[i]-YG[i][i]*e[i]-YB[i][i]*f[i];Ja[2*i][2*j+1]=-b[i]+YB[i][i]*e[i]-YG[i][i]*f[i];if(type[i]==1){Ja[2*i+1][2*j]=b[i]+YB[i][i]*e[i]-YG[i][i]*f[i];Ja[2*i+1][2*j+1]=-a[i]+YG[i][i]*e[i]+YB[i][i]*f[i];}else {Ja[2*i+1][2*j]=-2*e[i];Ja[2*i+1][2*j+1]=-2*f[i];}}}}}}//高斯消元法解方程组函数//void gauss(double a[][101],int n){int i,j,k;double c;for(k=0;k<n-1;k++) {c=a[k][k];for(j=k;j<=n;j++) a[k][j]/=c;for(i=k+1;i<n;i++) {c=a[i][k];for(j=k;j<=n;j++) a[i][j]-=c*a[k][j];}}a[n-1][n]/=a[n-1][n-1];for(k=n-2;k>=0;k--)for(j=k+1;j<n;j++) a[k][n]-=a[k][j]*a[j][n];}void main(){ifstream fin;int N=0,GS=0,LD=0,ZLs=0; //节点数发电机数负荷数支路数// BUS *B;Generator *G;Line *L;//从文本中读入原始数据到数组中//fin.open("C:\\data.txt");if(!fin){cout<<"输入数据文件不存在!"<<endl;getchar();}int m1[50]={0},m2[50]={0};float m3[50],m4[50],m5[50],m6[50];int i,j,l;for(i=0;;i++){fin>>m1[i];if(m1[i]==0)break;fin>>m2[i]>>m3[i]>>m4[i];N++;}B =new BUS[N];for (i=0;i<N;i++){B[i].busno=m1[i];B[i].type=m2[i];B[i].Pd=m3[i];B[i].Qd=m4[i];}for(i=0;;i++){fin>>m1[i];if(m1[i]==0)break;fin>>m4[i]>>m3[i];GS++;}G =new Generator[GS];for (i=0;i<GS;i++){G[i].busno=m1[i];G[i].Pg=m4[i];G[i].Vg=m3[i];}for(i=0;;i++){fin>>m1[i];if(m1[i]==0)break;fin>>m2[i]>>m3[i]>>m4[i]>>m5[i]>>m6[i];ZLs++;}L =new Line[ZLs];for (i=0;i<ZLs;i++){L[i].busi=m1[i];L[i].busj=m2[i];L[i].R=m3[i];L[i].X=m4[i];L[i].B=m5[i];L[i].k=m6[i];}LD=N-GS;fin.close();//节点导纳矩阵形成//double YB[50][50],YG[50][50],BB[50][50],K[50][50];for(i=0;i<N;i++){for(j=0;j<N;j++){YB[i][j]=0;YG[i][j]=0;BB[i][j]=0;K[i][j]=1;}}for (l=0;l<ZLs;l++){i=L[l].busi-1;j=L[l].busj-1;K[i][j]=L[l].k;BB[i][j]=BB[j][i]=L[l].B;YG[i][j]=YG[j][i]=L[l].R/(L[l].R*L[l].R+L[l].X*L[l].X);YB[i][j]=YB[j][i]=-L[l].X/(L[l].R*L[l].R+L[l].X*L[l].X);}for(i=0;i<N;i++){for(j=i;j<N;j++) {K[i][j]=K[j][i];K[j][i]=1;}for(j=0;j<N;j++){if(i!=j){YG[i][i]=YG[i][i]+(YG[i][j]*K[i][j]*K[i][j]);YB[i][i]=YB[i][i]+(YB[i][j]*K[i][j]*K[i][j]+BB[i][j]);}}}//修正后//for (l=0;l<ZLs;l++){i=L[l].busi-1;j=L[l].busj-1;K[i][j]=L[l].k;YG[i][j]=-YG[i][j]*K[i][j];YG[j][i]=YG[i][j];YB[i][j]=-YB[i][j]*K[i][j];YB[j][i]=YB[i][j];}int type[50]={0};for(i=0;i<N;i++){type[i]=B[i].type;}//PQV的获得//double P[50],Q[50],V[50];for(i=0;i<N;i++){P[i]=0;Q[i]=0;V[i]=0;P[i]=-B[i].Pd;Q[i]=-B[i].Qd;}for (i=0;i<GS;i++){P[G[i].busno-1]=G[i].Pg;V[G[i].busno-1]=G[i].Vg;}// 求A=e+f//double e[50]={0},f[50]={0};double C[100]={0},D[100]={0};for(i=0;i<N;i++){if(V[i]==0){C[2*i]=1;}else C[2*i]=V[i];}double W[100]={0},Ja[100][101]={0}; //调用Jacobi函数和高斯函数//for(int t=1;t<10;t++){for(i=0;i<2*N-2;i++){e[i]=C[2*i];f[i]=C[2*i+1];}fun1(YG,YB,e,f,type,N,W,P,Q,V);double it=fabs(W[0]);for(i=1;i<2*N-2;i++){if (it<fabs(W[i])) {it=fabs(W[i]);j=i;}}//中间迭代过程//cout<<setw(10)<<"迭代次数"<<setw(20)<<"最大的功率误差"<<setw(8)<<"节点号"<<endl;cout<<setw(10)<<t<<setw(20)<<it<<setw(8)<<j/2+1<<endl;if (it<0.00001) break;Jacobi(YG,YB,e,f,type,N,Ja);for(i=0;i<2*N-2;i++){Ja[i][2*N-2]=W[i];}//高斯消元法解方程//gauss(Ja,2*N-2);for(i=0;i<2*N-2;i++){D[i]=-Ja[i][2*(N-1)];C[i]+=D[i];}}//平衡节点//for(i=0;i<N;i++){double a=0,b=0;for(int j=0;j<N;j++){a+=(YG[i][j]*e[j]-YB[i][j]*f[j]);b+=(YB[i][j]*e[j]+YG[i][j]*f[j]);}P[i]=e[i]*a+f[i]*b;Q[i]=f[i]*a-e[i]*b;}//支路//double PZL[100][101]={0},QZL[100][101]={0},pr[100][101]={0},qx[100][101]={0};double x1=0,x2=0,y1=0,y2=0,I2=0;for(int k=0;k<ZLs;k++){i=L[k].busi-1;j=L[k].busj-1;x1=e[i]/L[k].k-e[j];y1=f[i]/L[k].k-f[j];x2=-e[i]*YG[i][j]-f[i]*YB[i][j];y2=-f[i]*YG[i][j]+e[i]*YB[i][j];QZL[i][j]=(x1*y2-x2*y1);PZL[i][j]=(x1*x2+y1*y2);I2=(PZL[i][j]*PZL[i][j]+QZL[i][j]*QZL[i][j])/(e[i]*e[i]+f[i]*f[i]);pr[i][j]=I2*L[k].R;qx[i][j]=I2*L[k].X-(e[i]*e[i]+f[i]*f[i]+e[j]*e[j]+f[j]*f[j])*L[k].B;QZL[i][j]+=(e[i]*e[i]+f[i]*f[i])*(-L[k].B);x1=e[j]*L[k].k-e[i];y1=f[j]*L[k].k-f[i];x2=-e[j]*YG[j][i]-f[j]*YB[j][i];y2=-f[j]*YG[j][i]+e[j]*YB[j][i];QZL[j][i]=(x1*y2-x2*y1);PZL[j][i]=(x1*x2+y1*y2);I2=(PZL[j][i]*PZL[j][i]+QZL[j][i]*QZL[j][i])/(e[j]*e[j]+f[j]*f[j]);pr[j][i]=I2*L[k].R;qx[j][i]=I2*L[k].X-(e[i]*e[i]+f[i]*f[i]+e[j]*e[j]+f[j]*f[j])*L[k].B;QZL[j][i]+=(e[j]*e[j]+f[j]*f[j])*(-L[k].B);}//全网数据//int high=1,low=1;double PG=0,PL=0,Prr=0,Vh=sqrt(e[0]*e[0]+f[0]*f[0]),Vl=sqrt(e[0]*e[0]+f[0]*f[0]);for(k=0;k<N;k++){Prr+=P[k];if(B[k].type==1) PL+=B[k].Pd;else PG+=P[k];if(sqrt(e[k]*e[k]+f[k]*f[k])>Vh){Vh=sqrt(e[k]*e[k]+f[k]*f[k]);high=k+1;}if(sqrt(e[k]*e[k]+f[k]*f[k])<Vl){Vl=sqrt(e[k]*e[k]+f[k]*f[k]);low=k+1;}}//输出数据到文件databak.txt//ofstream fout;fout.open("C:\\databak.txt");fout<<"节点"<<endl;fout<<setw(8)<<"节点号"<<setw(16)<<"V"<<setw(16)<<"弧度"<<setw(16)<<"发电P"<<setw(16)<<"发电Q"<<setw(16)<<"负荷P"<<setw(16)<<"负荷Q"<<endl;for(i=0;i<LD;i++){fout<<setw(8)<<i+1<<setw(16)<<sqrt(e[i]*e[i]+f[i]*f[i])<<setw(16)<<atan2(f[i],e[i])*180/3.14159<<setw(16)<<0 <<setw(16)<<0<<setw(16)<<B[i].Pd<<setw(16)<<B[i].Qd<<endl;}for(j=0;j<GS;j++){i=G[j].busno-1;fout<<setw(8)<<i+1<<setw(16)<<V[i]<<setw(16)<<atan2(f[i],e[i])*180/3.14159<<setw(16)<<P[i]<<setw(16)<<Q[i]<< setw(16)<<0<<setw(16)<<0<<endl;}fout<<"支路"<<endl;fout<<setw(4)<<"i"<<setw(4)<<"j"<<setw(10)<<"i_j有功"<<setw(10)<<"i_j无功"<<setw(10)<<"j_i有功"<<setw(12)<<"j_i无功"<<setw(12)<<"有功损耗"<<setw(12)<<"无功损耗"<<endl;for (k=0;k<ZLs;k++){i=L[k].busi-1;j=L[k].busj-1;fout<<setw(4)<<L[k].busi<<setw(4)<< L[k].busj <<setw(10)<<PZL[i][j] <<setw(10)<<QZL[i][j]<<setw(10)<< PZL[j][i] <<setw(12)<<QZL[j][i]<<setw(12)<<pr[i][j]<<setw(12)<<qx[i][j]<<endl;}fout<<"全网数据"<<endl;fout<<setw(14)<<"发电有功"<<setw(14)<<"负荷有功"<<setw(14)<<"有功损耗"<<setw(14)<<"最高电压"<<setw(14)<<"节点号"<<setw(14)<<"最低电压"<<setw(14)<<"节点号"<<endl;fout<<setw(14)<<PG<<setw(14)<<PL<<setw(14)<<Prr<<setw(14)<<Vh<<setw(14)<<high<<setw(14)<<Vl<<setw(14) <<low<<endl;fout.close();}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
ia[i]=ia[i]+gY_G[n][j]*ge[j]-gY_B[n][j]*gf[j];
ib[i]=ib[i]+gY_G[n][j]*gf[j]+gY_B[n][j]*ge[j];
}
}
for(i=0,n=1;i<Bus_Num-1;i++,n++)
{
gDelta_PQ[2*i]=gDelta_P[i];
gDelta_PQ[2*i+1]=gDelta_Q[i];
}
if((fp=fopen("C:\\Documents and Settings\\Zorro\\桌面\\1\\data\\unbalance.txt","w"))==NULL)
if(gBus[n].Type==1)
gDelta_Q[i]=gDelta_Q[i]-gf[n]*(gY_G[n][j]*ge[j]-gY_B[n][j]*gf[j])+ge[n]*(gY_G[n][j]*gf[j]+gY_B[n][j]*ge[j]);
}
}
for(i=0;i<Bus_Num-1;i++)
{
gY_G[i][j]=0.0;
gY_B[i][j]=0.0;
}
for(l=0;l<Line_Num;l++)
{
i=gLine[l].No_I-1;
j=gLine[l].No_J-1;
r=gLine[l].R;
x=gLine[l].X;
d1=r*r+x*x;
{
printf("Can not open the file named 'unbalance.txt' \n");
return ;
}
fprintf(fp,"---Unbalance---\n");
for(i=0;i<=2*Bus_Num-3;i++)
{
fprintf(fp,"Unbalance[%d]=%10.5f\n",i+1,gDelta_PQ[i]);
#include "math.h"
#include "config.h"
void test()
{
NEquation ob1;
ob1.SetSize(2);
ob1.Data(0,0)=1;
ob1.Data(0,1)=2;
ob1.Data(1,0)=2;
ob1.Data(1,1)=1;
// flow.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream.h>
#include <fstream.h>
#include "NEquation.h"
return;
}
for(i=0;i<=Bus_Num-1;i++)
{
fscanf(fp,"%d,%f,%f,%f,%f,%f,%f,%d",&gBus[i].No,&gBus[i].Voltage,&gBus[i].Phase,
&gBus[i].GenP,&gBus[i].GenQ,&gBus[i].LoadP,&gBus[i].LoadQ,&gBus[i].Type);
if(gBus[n].Type==2)
{
gJaccobi[2*i+1][2*j]=0;
gJaccobi[2*i+1][2*j+1]=0;
}
else
gY_B[j][i]=gY_B[j][i]-b;
}
}
// output the Y matrix
if((fp=fopen("C:\\Documents and Settings\\Zorro\\桌面\\1\\data\\ymatrix.txt","w"))==NULL)
FILE *fp;
for(i=0;i<Bus_Num;i++)
{
if(gBus[i].Type==3)
{
a=gBus[i].Voltage;
gBus[i].Voltage=gBus[0].Voltage;
gBus[0].Voltage=a;
a=gBus[i].Phase;
gBus[i].Phase=gBus[0].Phase;
gBus[0].Phase=a;
a=gBus[i].GenP;
gBus[i].GenP=gBus[0].GenP;
gBus[0].GenP=a;
a=gBus[i].GenQ;
gBus[i].GenQ=gBus[Байду номын сангаас].GenQ;
}
{
if(gLine[i].No_J==bal_num)
gLine[i].No_J=1;
else if(gLine[i].No_J==1)
gLine[i].No_J=bal_num;
}
}
for(i=0;i<Line_Num-1;i++)
for(j=0;j<Line_Num-1;j++)
}
fclose(fp);
}
void GetYMatrix()
{
int i,j;
FILE *fp;
// calculate the Y matrix
int l,bal_num;
float r,x,d1,g,b;
for(i=0;i<Bus_Num-1;i++)
{
g=r/d1;
b=-x/d1;
if(gLine[l].k==0)
{
gY_G[i][i]=gY_G[i][i]+g;
gY_G[j][j]=gY_G[j][j]+g;
gY_B[i][i]=gY_B[i][i]+b+gLine[l].B;
gY_B[j][j]=gY_B[j][j]+b+gLine[l].B;
ob1.Value(0)=5;
ob1.Value(1)=4;
ob1.Run();
printf("x1=%f\n",ob1.Value(0));
printf("x2=%f\n",ob1.Value(1));
}
void GetData()//Read the data
{
FILE *fp;
if(gBus[i].Type==3)
bal_num=i+1;
}
for(i=0;i<Line_Num;i++)
{
{
if(gLine[i].No_I==bal_num)
gLine[i].No_I=1;
else if(gLine[i].No_I==1)
gLine[i].No_I=bal_num;
gY_G[i][j]=gY_G[i][j]-g;
gY_G[j][i]=gY_G[j][i]-g;
gY_B[i][j]=gY_B[i][j]-b;
gY_B[j][i]=gY_B[j][i]-b;
}
else
{
gY_G[i][i]=gY_G[i][i]+g/gLine[l].k+g*(1-gLine[l].k)/gLine[l].k/gLine[l].k;
a=gBus[i].Type;
gBus[i].Type=gBus[0].Type;
gBus[0].Type=a;
}
}
for(i=0,n=1;i<Bus_Num-1;i++,n++)
{
gDelta_P[i]=gBus[n].GenP-gBus[n].LoadP;
if(gBus[n].Type==1)
{
printf("Can not open the file named 'ymatrix.txt' \n");
return ;
}
fprintf(fp,"---Y Matrix---\n");
for(i=0;i<=Bus_Num-1;i++)
{
for(j=0;j<=Bus_Num-1;j++)
}
fclose(fp);
}
void GetJaccobi()
{
FILE *fp;
int i,j,n;
float ia[Bus_Num-1],ib[Bus_Num-1];
for(i=0,n=1;i<Bus_Num-1;i++,n++)
{
ia[i]=0;
ib[i]=0;
{