1101180924姚卿卿-潮流上机课程设计报告

 

课程设计报告

( 20##—20##年度第一学期)

名    称:电力系统潮流上机  

院    系:电气与电子工程学院

班    级:     实验电10     

学    号:   1101180924     

学生姓名:      姚卿卿     

指导教师:      姜彤       

设计周数:      两周       

成    绩:                   

          

                   日期: 20##年1月11日


一、课程设计的目的与要求

培养学生的电力系统潮流计算机编程能力,掌握计算机潮流计算的相关知识

二、设计正文(详细内容见附录)

1. 手算

2. 计算机计算

3. 思考题

3.1潮流计算的方法有哪些?各有何特点?

1:手算和计算机计算两大类,其中计算机计算中又可以分为有高斯-赛德尔法、牛顿-拉夫逊法、P-Q分解法等算法。

2:特点

(1):手算潮流的特点:可用于求解简单的网络中的潮流计算,计算量很大,对于n个节点的网络就要列写n-1的平方的雅克比矩阵,还要进行迭代,所以对于多节点的网络用手算一般很难得到准确的结果,但通过手算可以加深求解潮流问题的过程,是编程解潮流的基础,还可以在计算机计算之前用手算求一些原始的数据。

(2):高斯-赛德尔法特点:算法简单,对初值的准确度要求不高,但迭代的次数较多,收敛的速度较慢,在早期的潮流计算程序中应用很多,之后逐渐被牛顿-拉夫逊迭代法所取代,但仍可作为计算程序前几次迭代的算法,以弥补后者对初值要求高的缺点。

(3):牛顿-拉夫逊法特点:是常用的解非线性方程组的方法,也是当前广泛采用的计算潮流的方法,其收敛速度快,几次迭代就可以得到最终的结果。但其缺点是要求初值的选择得比较接近它们的精确值,否则迭代过程可能不收敛。

(4):P-Q分解法特点:派生于以极坐标表示时的牛顿-拉夫逊法,其根据电力系统的特点,对后者的修正方程做了简化,P-Q分解法的系数矩阵B’和B”代替了牛拉法中的雅可比矩阵J,阶数降低,其中的元素在迭代过程中不发生变化,而且元素对称,这些都大大提高了运算速度,而且精确度几乎不受影响。P-Q分解法的收敛特性接近于直线,而牛顿-拉夫逊的收敛速度要比P-Q分解法快,但是由于牛顿-拉夫逊每次迭代都要形成雅客比矩阵,所以一次迭代的时间比P-Q分解法长。[2]

3.2 如果交给你一个任务,请你用已有的潮流计算软件计算北京城市电网的潮流,你应该做哪些工作?(收集哪些数据,如何整理,计算结果如何分析)

    首先分析解潮流需要的数据有哪些:

(1)各个节点之间的电阻电抗电导电纳变比

(2)PQ节点的等值负荷功率,等值电源功率,注入功率

(3)平衡节点的电压幅值和相角

(4)PV节点的等值负荷功率和等值电源功率,还有注入的有功功率以及电压幅值

    实际数据:

(1)各发电厂的有功和无功功率

(2)各变电所母线的有功和无功功率

(3)变压器变比

(4)电气连接图

(5)线路的电阻电抗电导电纳

    整理数据:

(1)根据发电厂和变电所的数据判断是第几类节点

(2)写出PQ节点的注入的有共和无功功率

(3)写出PV节点的注入的有功功率和电压幅值

(4)写出平衡节点的电压幅值和相位

(5)写出各非负荷节点的可提供的最大和最小的有功无功功率限制

    结果分析:

(1)根据各个节点的电压可以分析该节点是否正常工作,有没有电压幅值产出或低于限制的情况发生

(2)根据各节点的功率可以判断该节点是否处于重载或轻载的状态,和根据情况调节潮流的分布

(3)根据线路上的功率可分析线路是否出现超出最大容量的问题

(4)根据各线路的损耗可以判断供电的经济性

(5)根据数据可以结合等耗量微增率和等网损微增率调节潮流的分布

3.3计中遇到的问题和解决的办法

1:关于C的问题,比如文件的调用和存储,关于Break语句的使用等等[1],经老师的讲解已经比较熟练地掌握。

2:数组从0开始编写的问题,比如在编写雅克比矩阵的时候就不能考虑平衡节点,语句要从1开始循环。

3:写标注的时候只有一行时使用//,不要轻易使用/**/。这样有助于将大段的注释和小段的注释区别开。

4:不要轻易删掉程序,可以先注意掉保留在文件中,以防丢失。

5:使用F5调试,逐句调试可需要逻辑错误,观看有没有黄色的箭头可以知道程序是否运行到了提前设定的语句,调试过程中还可以讲光标移至数组等变量出观看数组长度和所赋的值,这样很利于排查错误。

6:编写Y矩阵时的电纳是否应该除以2需要仔细看说明。

7:编写修正量的后的输出结果不正确,是因为写完雅克比矩阵没先和老师的结果校验,否就用老师给的解多元一次方程式的函数解修正量,这个时候会出现方程解不了的情况,自然输出的量不对。

8:出现内存溢出的错误,让中断程序。这时候要重新检查定义的数组和数组复制的情况,修改数组的长度。

9:编写支路功率损耗的时候没有考虑对地的电纳的影响。

10:计算不平衡量时只单独计算gDelta_P和gDelta_Q,导致后来计算修正量时不会给ob1.Value(i)赋值,经老师讲解后使用gDelta_PQ数组将gDelta_P和gDelta_Q的数据存入以后解决。

三、课程设计总结或结论

1:手算潮流和计算机计算潮流的意义所在

(1)手算:通过对一个三节点的网络进行两次牛拉法的迭代我体会到了手算潮流的复杂,充分了解了计算机计算的优越性,但是,在手算的过程中让我回忆并复习了本学期学习的电力系统稳态的内容,尤其是网络中潮流负荷哪样的分布规律,为何这样分布,怎样简单快捷的求取潮流的分布,加深了对物理概念的理解。

(2)计算机计算:如果一个九节点的网络用手算可想而知其复杂性,这就是计算机计算的最大的好处,随着电力网络日益庞大和复杂,只用手算实际网络已经变得不是很实际,通过编程计算只需运用一样的公式就可以利用循环语句完成对多节点的计算,还可以利用计算机的功能对所得到的结果判断正误。运用电子计算机计算一般要用到一下的几个步骤:简历数学模型,确定计算方法,制定计算流程,编制计算程序,这次主要进行了编制计算程序的步骤,前面的几步是根据前人的方法直接应用于程序之中。总之计算机计算提高了计算效率,结果的准确性,大大缩短了计算的时间。

2:我的收获

(1)关于C++2008的应用:大一时候学习的是C语言的应用,编写的程序都不会超过50行,这次一下子写几百行的程序对我来讲是一个很大的挑战,编程的过程中遇到了很多问题,多谢有同学的指导,研究生学长的支持,齐郑老师的讲解才得以完成。我充分理解了编程的难处,一个长的程序必须需要明确的思路,先把最终目标分解成几个小目标,用几个小的函数实现,最后用主函数调用几个子函数完成最终计算任务。

       (2)本次实际操作编程让我对潮流的计算的理解更加深刻,尤其是对雅克比矩阵的H,N,J,L,R,S系数对对角线元素和分对角线元素的区别,三种类型的节点的区别,节点导纳矩阵的变压器模型,计算不平衡节点时候的三种不同类型节点的区别,修正方程与潮流方程的区别,Q方程改成V方程,在修正方程中不考虑平衡节点等等问题。

       (3)对于不考虑平衡节点的实现方法是用数组在循环中避开第一个节点,也就是从i=0开始循环;对于节点导纳矩阵节点间的数据和节点的自数据依照书上的不同的公式编辑,在循环中用if语句区分,对于节点类型的区别也是在循环中应用if语句对节点类型区分,有变压器的支路则比较麻烦需要考虑[2]67页的公式。

(4)对于最终计算出各节点电压、相位,各线路传输功率及损耗,平衡节点注入功率,对于结果的分析没做什么工作,我想可以根据思考题3.2的解答对结果进行处理,得到一些使用的结论。根据各个节点的电压可以分析该节点是否正常工作,有没有电压幅值产出或低于限制的情况发生;根据各节点的功率可以判断该节点是否处于重载或轻载的状态,和根据情况调节潮流的分布;根据线路上的功率可分析线路是否出现超出最大容量的问题;根据各线路的损耗可以判断供电的经济性;根据数据可以结合等耗量微增率和等网损微增率调节潮流的分布。

四、参考文献

1.    《C语言程序设计》,魏海新主编,机械工业出版社;

2.    《电力系统计算:电子数字计算机的应用》,西安交通大学等合编。北京:水利电力出版社;

3.    《现代电力系统分析》,王锡凡主编,科学出版社;

4.    《电力系统稳态分析》,陈珩,中国电力出版社,20##年,第三版;

五、附录

1、计算机计算潮流程序流程图

                                     潮流计算开始

         读入节点和支路数据

形成节点导纳矩阵

赋电压初值

判断是否符合迭代要求 (用迭代次数 k 表示)

计算不平衡量?P、?Q

形成 Jacobi 矩阵

解方程求电压修正量和电压新值

得最终的节点电压

计算平衡节点的功率、PV 节点的无 功、各支路功率和网损

数据输出

潮流结束

2、计算机计算短路故障程序流程图

短路计算开始

读入节点导纳矩阵和节点电压

计算正、负、零序节点导纳矩阵

   解方程得短路节点对应的各序阻抗列向量

形成正序增广网络(各种类型的短路故 障不同),并求出短路处电流)

计算各序电压并求出三相各节点电压

输出结果

短路计算结束

 

第二篇:潮流上机课程设计全程序

// flow.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <iostream.h>#include <fstream.h>#include "NEquation.h"#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;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(){FILE *fp;int i;if((fp=fopen("E:\\1071140221 王帅兵\\flow\\data\\data.txt","r"))==NULL){ printf("Can not open the file named 'data.txt' \n");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);}for(i=0;i<=Line_Num-1;i++){fscanf(fp,"%d,%d,%d,%f,%f,%f,%f",&gLine[i].No,&gLine[i].No_I,&gLine[i].No_J,&gLine[i].R,&gLine[i].X,&gLine[i].B,&gLine[i].k); }fclose(fp);}void GetYMatrix(){int i,j,bus1,bus2;float r,x,g,d,b;FILE *fp;for(i=0;i<=Bus_Num-1;i++){for(j=0;j<=Bus_Num-1;j++){gY_G[i][j]=0;gY_B[i][j]=0; }}for(i=0; i<=Line_Num-1; i++){bus1=gLine[i].No_I-1;bus2=gLine[i].No_J-1;r=gLine[i].R;x=gLine[i].X;d=r*r+x*x;g=r/d;b=-x/d;if(gLine[i].k==0){ gY_G[bus1][bus1]=gY_G[bus1][bus1]+g;gY_G[bus2][bus2]=gY_G[bus2][bus2]+g;gY_G[bus1][bus2]=gY_G[bus1][bus2]-g;gY_G[bus2][bus1]=gY_G[bus2][bus1]-g;gY_B[bus1][bus1]=gY_B[bus1][bus1]+b+gLine[i].B;gY_B[bus2][bus2]=gY_B[bus2][bus2]+b+gLine[i].B;gY_B[bus1][bus2]=gY_B[bus1][bus2]-b;gY_B[bus2][bus1]=gY_B[bus2][bus1]-b;}else if(gLine[i].k==1){ gY_G[bus1][bus1]=gY_G[bus1][bus1]+g;gY_G[bus2][bus2]=gY_G[bus2][bus2]+g;gY_G[bus1][bus2]=gY_G[bus1][bus2]-g;gY_G[bus2][bus1]=gY_G[bus2][bus1]-g;gY_B[bus1][bus1]=gY_B[bus1][bus1]+b;gY_B[bus2][bus2]=gY_B[bus2][bus2]+b;gY_B[bus1][bus2]=gY_B[bus1][bus2]-b;gY_B[bus2][bus1]=gY_B[bus2][bus1]-b;}}if((fp=fopen("C:\\Documents and Settings\\王帅兵\\桌面\\1071140221\\程序模板\\data\\ymatrix.txt","w"))==NULL){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++){fprintf(fp,"Y(%d,%d)=(%10.5f,%10.5f)\n",i+1,j+1,gY_G[i][j],gY_B[i][j]);}}fclose(fp); }void SetInitial(){int i;for(i=0;i<=Bus_Num-1;i++){if(gBus[i].Type==3){gf[i]=gBus[i].Voltage*sin(gBus[i].Phase);ge[i]=gBus[i].Voltage*cos(gBus[i].Phase);}else if(gBus[i].Type==1||gBus[i].Type==2){gf[i]=0;ge[i]=1;}}}void GetUnbalance(){ int i,j;float m,n;printf("\n---不平衡

功率---\n"); for(i=1;i<=Bus_Num-1;i++){ m=0;n=0;for(j=0;j<=Bus_Num-1;j++){m=m+(ge[i]*(gY_G[i][j]*ge[j]-gY_B[i][j]*gf[j])+gf[i]*(gY_G[i][j]*gf[j]+gY_B[i][j]*ge[j]));n=n+(gf[i]*(gY_G[i][j]*ge[j]-gY_B[i][j]*gf[j])-ge[i]*(gY_G[i][j]*gf[j]+gY_B[i][j]*ge[j]));} if(gBus[i].Type==1){ gDelta_P[i-1]=(gBus[i].GenP-gBus[i].LoadP)-m;gDelta_Q[i-1]=(gBus[i].GenQ-gBus[i].LoadQ)-n;}else if(gBus[i].Type==2){ gDelta_P[i-1]=(gBus[i].GenP-gBus[i].LoadP)-m;gDelta_Q[i-1]=gBus[i].Voltage*gBus[i].Voltage-(ge[i]*ge[i]+gf[i]*gf[i]); } }for(i=0;i<Bus_Num-1;i++){gDelta_PQ[2*i]=gDelta_P[i];gDelta_PQ[2*i+1]=gDelta_Q[i];}for(i=0;i<Bus_Num-1;i++){printf("%10.5f %10.5f\n",gDelta_P[i],gDelta_Q[i]);}}void GetJaccobi(){int i,j,k;float m,n;float H[Bus_Num-1][Bus_Num-1],N[Bus_Num-1][Bus_Num-1];float J[Bus_Num-1][Bus_Num-1],L[Bus_Num-1][Bus_Num-1]; for(i=1;i<=Bus_Num-1;i++){m=0;n=0;for(k=0;k<=Bus_Num-1;k++){ if(i!=k){m=m+gY_G[i][k]*gf[k]+gY_B[i][k]*ge[k];n=n+gY_G[i][k]*ge[k]-gY_B[i][k]*gf[k]; }else continue;}for(j=1;j<=Bus_Num-1;j++){if(gBus[i].Type==1){if(i!=j){H[i-1][j-1]=-gY_B[i][j]*ge[i]+gY_G[i][j]*gf[i];N[i-1][j-1]=gY_G[i][j]*ge[i]+gY_B[i][j]*gf[i];J[i-1][j-1]=-N[i-1][j-1];L[i-1][j-1]=H[i-1][j-1];}else if(i==j){ H[i-1][i-1]=2*gY_G[i][i]*gf[i]+m;N[i-1][i-1]=2*gY_G[i][i]*ge[i]+n;J[i-1][i-1]=-2*gY_B[i][i]*gf[i]+n;L[i-1][i-1]=-2*gY_B[i][i]*ge[i]-m; }}else if(gBus[i].Type==2){if(i!=j){H[i-1][j-1]=-gY_B[i][j]*ge[i]+gY_G[i][j]*gf[i];N[i-1][j-1]=gY_G[i][j]*ge[i]+gY_B[i][j]*gf[i];J[i-1][j-1]=0;L[i-1][j-1]=0;}else if(i==j){ H[i-1][i-1]=2*gY_G[i][i]*gf[i]+m;N[i-1][i-1]=2*gY_G[i][i]*ge[i]+n;J[i-1][i-1]=2*gf[i];L[i-1][i-1]=2*ge[i]; }}} }for(i=1;i<=Bus_Num-1;i++) { for(j=1;j<=Bus_Num-1;j++){gJaccobi[2*(i-1)][2*(j-1)]=H[i-1][j-1];gJaccobi[2*(i-1)][2*j-1]=N[i-1][j-1];gJaccobi[2*i-1][2*(j-1)]=J[i-1][j-1];gJaccobi[2*i-1][2*j-1]=L[i-1][j-1]; }}}void GetRevised(){int i,j;NEquation ob1;printf("\n电压修正量\n");ob1.SetSize(2*(Bus_Num-1));for(i=0;i<2*(Bus_Num-1);i++){for(j=0;j<2*(Bus_Num-1);j++){ob1.Data(i,j)=gJaccobi[i][j];}ob1.Value(i)=gDelta_PQ[i];}ob1.Run();for(i=0;i<Bus_Num-1;i++){gDelta_f[i]=ob1.Value(2*i);gDelta_e[i]=ob1.Value(2*i+1);gDelta_fe[2*i]=gDe

lta_f[i];gDelta_fe[2*i+1]=gDelta_e[i]; }for(i=0;i<Bus_Num-1;i++) {printf("%10.5f %10.5f\n",gDelta_e[i],gDelta_f[i]);}}void GetNewValue(){int i;printf("\n计算所得电压新值\n");for(i=0;i<Bus_Num-1;i++){gf[i+1]=gf[i+1]+gDelta_f[i];ge[i+1]=ge[i+1]+gDelta_e[i];printf("%10.5f %10.5f\n",ge[i+1],gf[i+1]);} }int main(int argc, char* argv[]){int i,j,Count_Num;float maxValue,P_Bus[Bus_Num],Q_Bus[Bus_Num];float P[Bus_Num][Bus_Num],Q[Bus_Num][Bus_Num],PS,QS;float gBus_b[Bus_Num];// test();GetData();GetYMatrix();SetInitial();for(Count_Num=0;Count_Num<=100;Count_Num++){GetUnbalance();GetJaccobi();GetRevised();GetNewValue();maxValue=fabs(gDelta_fe[0]);for(i=1;i<2*(Bus_Num-1);i++){if(maxValue<fabs(gDelta_fe[i])){maxValue=fabs(gDelta_fe[i]);}}if(maxValue<Precision){break;}}printf("\n");//下面求节点功率P_Bus,Q_Busfor(i=0;i<Bus_Num;i++){P_Bus[i]=0;Q_Bus[i]=0;}printf("节点注入功率\n");for(i=0;i<Bus_Num;i++){for(j=0;j<Bus_Num;j++){ P_Bus[i]=P_Bus[i]+ge[i]*(gY_G[i][j]*ge[j]-gY_B[i][j]*gf[j])+gf[i]*(gY_G[i][j]*gf[j]+gY_B[i][j]*ge[j]);Q_Bus[i]=Q_Bus[i]+gf[i]*(gY_G[i][j]*ge[j]-gY_B[i][j]*gf[j])-ge[i]*(gY_G[i][j]*gf[j]+gY_B[i][j]*ge[j]); }printf("P(%d)=%10.5f Q(%d)=%10.5f\n",i,P_Bus[i],i,Q_Bus[i]);}printf("\n节点对地电纳\n");for(i=1;i<=Bus_Num;i++) { gBus_b[i-1]=0;for(j=1;j<=Line_Num;j++){if((i==gLine[j].No_I)||(i==gLine[j].No_J)){gBus_b[i-1]=gBus_b[i-1]+gLine[j].B;}else continue;}printf("%10.5f\n",gBus_b[i-1]);} printf("\n线路功率\n");for(i=0;i<=Bus_Num-1;i++){ for(j=0;j<=Bus_Num-1;j++){ P[i][j]=ge[i]*(ge[i]-ge[j])*gY_G[i][j]+ge[i]*(gf[j]-gf[i])*gY_B[i][j]+gf[i]*(ge[i]-ge[j])*gY_B[i][j]-gf[i]*(gf[j]-gf[i])*gY_G[i][j];Q[i][j]=-(ge[i]*ge[i]+gf[i]*gf[i])*gBus_b[i]+ge[i]*(ge[i]-ge[j])*gY_B[i][j]+ge[i]*(gf[j]-gf[i])*gY_G[i][j]+gf[i]*(ge[i]-ge[j])*gY_G[i][j]+gf[i]*(gf[j]-gf[i])*gY_B[i][j];printf("P_L[%d %d]=%10.5f Q_L[%d %d]=%10.5f\n",i,j,-P[i][j],i,j,-Q[i][j]);}}printf("\n迭代次数:%d\n",Count_Num);printf("\n");for(i=0;i<=Bus_Num-1;i++){printf("电压%10.5f 相角%10.5f\n",sqrt(ge[i]*ge[i]+gf[i]*gf[i]),atan(gf[i]/ge[i]));}for(i=0;i<Bus_Num;i++){if(gBus[i].Type==3){printf("平衡节点功率:P=%10.5f Q=%10.5f\n",P_Bus[i],Q_Bus[i]);//平衡节点功率打印}else if(gBus[i].Type==2){printf("PV节点的功率:P=%10.5f Q=%10.5f\n",P_Bus[i],Q_Bus[i]);}}printf("\n网线路功率计算的损耗:");PS=0;QS=0;for(i=0;i<Bus_Num;i++){for(j=

0;j<Bus_Num;j++){if(i!=j){PS=PS+P[i][j];QS=QS+Q[i][j];}else continue;}} printf("%10.5f %10.5f\n",-PS,-QS); return 0; }

相关推荐