當前位置:編程學習大全網 - 編程語言 - 為什麽我編的電力系統潮流計算C語言PQ分解法不收斂

為什麽我編的電力系統潮流計算C語言PQ分解法不收斂

//PQ 分解法源程序

#include "math.h"

#include "stdio.h"

#include "stdlib.h"

#define M 14 //預計支路數

#define N 14 //預計節點數

//

struct linestr //支路信息

{

int i,j; //和該支路相連的兩個節點

float r,x,g,b; //該支路的參數,kb為非標準變比

float pij,qij,pji,qji; //支路潮流—計算數據

}line[M];

struct pointstr //節點信息

{

int sign; //節點類型,0—平衡節點,1—PQ節點,2—PV節點

float voltage,cta,p,q; //節點電壓幅值和相位角,節點註入有功、無功

}pointpri[N],pointaft[N]; //pointpri用於存放節點的初始數據,pointaft用於存放計算後的節點數據

float G[N][N]={0},B[N][N]={0}; //節點導納陣

//

float B1[N][N]={0},B2[N][N]={0};//修正方程系數矩陣

float detp[N]={0},detct[N]={0},detq[N]={0},detv[N]={0};//依次放修正方程的修正量

float pn[N]={0},ctn[N]={0},qn[N]={0},vn[N]={0}; //依次放修正量對應的節點號,即變量對應的節點號

int nline,npoint; //準確的支路數和節點數

int npq,npv,nbal; //PQ節點數、PV節點數、平衡節點數

void creat()

{

int i;

npq=0;npv=0;nbal=0;

printf("\n請輸入總支路數:");scanf("%d",&nline);

for(i=1;i<=nline;i++)

{

printf("請輸入%d號支路數據:\n",i);

printf("和該支路相連的節點號i,j(請用逗號隔開):");scanf("%d,%d",&(line[i].i),&(line[i].j));

printf("該支路的電阻和電抗R,X(請用逗號隔開):");scanf("%f,%f",&(line[i].r),&(line[i].x));

printf("該支路的對地電導和電納G,B(請用逗號隔開):");scanf("%f,%f",&(line[i].g),&(line[i].b));

line[i].pij=0;line[i].qij=0;line[i].pji=0;line[i].qji=0;

//形成節點導納陣

G[line[i].i][line[i].j]=-line[i].r/((line[i].r*line[i].r+line[i].x*line[i].x));

G[line[i].j][line[i].i]=G[line[i].i][line[i].j];

B[line[i].i][line[i].j]=line[i].x/((line[i].r*line[i].r+line[i].x*line[i].x));

B[line[i].j][line[i].i]=B[line[i].i][line[i].j];

G[line[i].i][line[i].i]+=line[i].r/((line[i].r*line[i].r+line[i].x*line[i].x));

G[line[i].i][line[i].i]+=line[i].g;

B[line[i].i][line[i].i]+=(-line[i].x)/((line[i].r*line[i].r+line[i].x*line[i].x));

B[line[i].i][line[i].i]+=line[i].b;

G[line[i].j][line[i].j]+=line[i].r/(line[i].r*line[i].r+line[i].x*line[i].x);

G[line[i].j][line[i].j]+=line[i].g;

B[line[i].j][line[i].j]+=(-line[i].x)/(line[i].r*line[i].r+line[i].x*line[i].x);

B[line[i].j][line[i].j]+=line[i].b;

}

printf("\n請輸入總節點數:");scanf("%d",&npoint);

for(i=1;i<=npoint;i++)

{

printf("請輸入節點%d的數據\n",i);

printf("選擇節點類型(1-平衡節點,2-PQ節點,3-PV節點):");

scanf("%d",&(pointpri[i].sign));

if(pointpri[i].sign==1)

{

printf("請輸入該節點的電壓幅值和相位角(用逗號隔開):");

scanf("%f,%f",&(pointpri[i].voltage),&(pointpri[i].cta));

pointpri[i].p=0;pointpri[i].q=0;

nbal++;

}

else if(pointpri[i].sign==2)

{

printf("請輸入該節點的註入有功和無功(用逗號隔開):");

scanf("%f,%f",&(pointpri[i].p),&(pointpri[i].q));

pointpri[i].voltage=1;pointpri[i].cta=0;

npq++;

}

else if(pointpri[i].sign==3)

{

printf("請輸入該節點的有功註入和電壓幅值(用逗號隔開):");

scanf("%f,%f",&(pointpri[i].p),&(pointpri[i].voltage));

pointpri[i].q=0;pointpri[i].cta=0;

npv++;

}

else

{

printf("選擇無效,請重新輸入\n");

i--;

}

if(nbal>1)

{

printf("出現多個平衡節點,請重新輸入\n");

i--;nbal--;

}

}

}

void view()

{

int i,j;

for(i=1;i<=npoint;i++)

{

for(j=1;j<=npoint;j++)

printf("%f+j%f ,",G[i][j],B[i][j]);

printf("\n");

}

for(i=1;i<=npoint;i++)

{

printf("節點%d參數:",i);

if(pointpri[i].sign==1)printf("平衡節點 v=%f,theta=%f\n",pointpri[i].voltage,pointpri[i].cta);

else if(pointpri[i].sign==2)printf("PQ節點 P=%f,Q=%f\n",pointpri[i].p,pointpri[i].q);

else printf("PV節點 P=%f,v=%f\n",pointpri[i].p,pointpri[i].voltage);

}

}

void modify()

{

}

void run()

{

int i,j,k,m,n;

float E,e;//E為題目所要求的叠代精度,由鍵盤輸入,e為每壹步叠代的實際計算精度,用以和E比較

int numPQ[N];//PQ節點號

int numPV[N];//PV節點號

int numBAL; //平衡節點號

int np_th[N],nq_v[N];//叠代方程中的有功-電壓相位角方程、無功-電壓幅值方程分別對應的節點號

float B1_fac[N][N]={0},B2_fac[N][N]={0},a;

j=1;k=1;m=1;n=1;

for(i=1;i<=npoint;i++){B1_fac[i][i]=1;B2_fac[i][i]=1;}

for(i=1;i<=npoint;i++)

{//將數據存入壹個新的結構體數組,保證在叠代過程中即使數據有改變,仍能保留住原始數據

pointaft[i].sign=pointpri[i].sign;

pointaft[i].voltage=pointpri[i].voltage;

pointaft[i].cta=pointpri[i].cta;

pointaft[i].p=pointpri[i].p;

pointaft[i].q=pointpri[i].q;

//統計PV節點和PQ節點序號,並存入臨時數組

if(pointpri[i].sign==1)numBAL=i;

else if(pointpri[i].sign==2){numPQ[j++]=i;np_th[m++]=i;nq_v[n++]=i;}

else {numPV[k++]=i;np_th[m++]=i;}

}

//形成有功-相位角的叠代方程系數矩陣B1

for(i=1;i<=npoint-1;i++)

for(j=1;j<=npoint-1;j++)

B1[i][j]=B[np_th[i]][np_th[j]];

//形成因子表

for(k=1;k<=npoint-1;k++)

for(i=k+1;i<=npoint-1;i++)

{ a=B1[i][k];

for(j=1;j<=npoint-1;j++)

{

B1[i][j]-=a*B1[k][j]/B1[k][k];

B1_fac[i][j]-=a*B1_fac[k][j]/B1[k][k];

}

}

//形成無功-電壓幅值的叠代方程的系數矩陣B2

for(i=1;i<=npq;i++)

for(j=1;j<=npq;j++)

B2[i][j]=B[nq_v[i]][nq_v[j]];

//形成因子表

for(k=1;k<=npq;k++)

for(i=k+1;i<=npq;i++)

{ a=B2[i][k];

for(j=1;j<=npq;j++)

{

B2[i][j]-=a*B2[k][j]/B2[k][k];

B2_fac[i][j]-=a*B2_fac[k][j]/B2[k][k];

}

}

printf("請輸入叠代精度:");scanf("%f",&E);

k=-1;

do

{

e=0;

k++;

//有功叠代

//首先計算有功不平衡量

for(i=1;i<=npoint-1;i++)

{

detp[i]=pointaft[np_th[i]].p/pointaft[np_th[i]].voltage;

for(j=1;j<=npoint;j++)

detp[i]-=pointaft[j].voltage*(G[np_th[i]][j]*cos(pointaft[np_th[i]].cta-pointaft[j].cta)+B[np_th[i]][j]*sin(pointaft[np_th[i]].cta-pointaft[j].cta));

printf("%f,",detp[i]);

}

for(i=1;i<=npoint-1;i++)

{

detct[i]=0;

for(j=1;j<=npoint-1;j++)

detct[i]+=B1_fac[i][j]*detp[j];

}

for(i=npoint-1;i>=1;i--)

{

for(j=npoint-1;j>i;j--)

detct[i]-=B1[i][j]*detct[j];

detct[i]/=B1[i][i];

}

for(i=1;i<=npoint-1;i++)detct[i]/=(-pointaft[np_th[i]].voltage);//求出相位角的修正量

for(i=1;i<=npoint-1;i++){pointaft[np_th[i]].cta+=detct[i];e+=detct[i]*detct[i];}//修正角度,並計算精度

printf("第%d次叠代後的相位角:",k);

for(i=1;i<=npoint;i++)printf("%f,",pointaft[i].cta);

printf("\n");

//無功叠代

//首先計算無功不平衡量

for(i=1;i<=npq;i++)

{

detq[i]=pointaft[nq_v[i]].q/pointaft[nq_v[i]].voltage;

for(j=1;j<=npoint;j++)

detq[i]-=pointaft[j].voltage*(G[nq_v[i]][j]*sin(pointaft[nq_v[i]].cta-pointaft[j].cta)-B[nq_v[i]][j]*cos(pointaft[nq_v[i]].cta-pointaft[j].cta));

printf("%f,",detq[i]);

}

for(i=1;i<=npq;i++)

{

detv[i]=0;

for(j=1;j<=npq;j++)

detv[i]+=B2_fac[i][j]*detq[j];

}

for(i=npq;i>=1;i--)

{

for(j=npq;j>i;j--)

detv[i]-=B2[i][j]*detv[j];

detv[i]/=B2[i][i];

}

for(i=1;i<=npq;i++)detv[i]/=(-1);//求出電壓的修正量

for(i=1;i<=npq;i++){pointaft[nq_v[i]].voltage+=detv[i];e+=detv[i]*detv[i];}//修正電壓

printf("第%d次叠代後的電壓幅值為:",k);

for(i=1;i<=npoint;i++)printf("%f,",pointaft[i].voltage);

printf("\n");

}while(e>E&&k<100);

//輸出結果

printf("在滿足精度E=%f的情況下,計算結果為:",E);

for(i=1;i<=npoint;i++)

printf("v%d=%f,cta%d=%f\n",i,pointaft[i].voltage,i,pointaft[i].cta);

//計算平衡節點註入功率

pointaft[numBAL].p=0;pointaft[numBAL].q=0;

for(i=1;i<=npoint;i++)

{

pointaft[numBAL].p+=pointaft[i].voltage*(G[numBAL][i]*cos(pointaft[numBAL].cta-pointaft[i].cta)+B[numBAL][i]*sin(pointaft[numBAL].cta-pointaft[i].cta));

pointaft[numBAL].q+=pointaft[i].voltage*(G[numBAL][i]*sin(pointaft[numBAL].cta-pointaft[i].cta)-B[numBAL][i]*cos(pointaft[numBAL].cta-pointaft[i].cta));

}

pointaft[numBAL].p*=pointaft[numBAL].voltage;

pointaft[numBAL].q*=pointaft[numBAL].voltage;

printf("平衡節點註入功率為:%f+j%f\n",pointaft[numBAL].p,pointaft[numBAL].q);

//計算各支路潮流

for(k=1;k<=nline;k++)

{

float aa,bb,cc;

i=line[k].i;j=line[k].j;

aa=pointaft[i].voltage*cos(pointaft[i].cta)-pointaft[j].voltage*cos(pointaft[j].cta);

bb=pointaft[i].voltage*sin(pointaft[i].cta)-pointaft[j].voltage*sin(pointaft[j].cta);

cc=line[k].r*line[k].r+line[k].x*line[k].x;

line[k].pij=(line[k].r*(pointaft[i].voltage*cos(pointaft[i].cta)*aa+pointaft[i].voltage*sin(pointaft[i].cta*bb))-line[k].x*(pointaft[i].voltage*sin(pointaft[i].cta*aa-pointaft[i].voltage*cos(pointaft[i].cta)*bb)))/cc;

line[k].qij=(line[k].x*(pointaft[i].voltage*cos(pointaft[i].cta)*aa+pointaft[i].voltage*sin(pointaft[i].cta*bb))+line[k].r*(pointaft[i].voltage*sin(pointaft[i].cta*aa-pointaft[i].voltage*cos(pointaft[i].cta)*bb)))/cc;

line[k].pji=(line[k].r*(pointaft[j].voltage*cos(pointaft[j].cta)*(-aa)+pointaft[j].voltage*sin(pointaft[j].cta*(-bb)))-line[k].x*(pointaft[j].voltage*sin(pointaft[j].cta*(-aa)-pointaft[j].voltage*cos(pointaft[j].cta)*(-bb))))/cc;

line[k].qji=(line[k].x*(pointaft[j].voltage*cos(pointaft[j].cta)*(-aa)+pointaft[j].voltage*sin(pointaft[j].cta*(-bb)))+line[k].r*(pointaft[j].voltage*sin(pointaft[j].cta*(-aa)-pointaft[j].voltage*cos(pointaft[j].cta)*(-bb))))/cc;

printf("由節點%d流向節點%d的功率為:%f+j%f\n",i,j,line[k].pij,line[k].qij);

printf("由節點%d流向節點%d的功率為:%f+j%f\n",j,i,line[k].pji,line[k].qji);

}

}

main ()

{

int a;

printf("\n");

printf("***************電力系統潮流計算**************\n");

printf("\n");

printf(" 設計者: 李 冰 設計:2014 年 5 月\n");

printf("\n");

printf("\n");

printf(" 註:各參數用標麽值表示,角度均以弧度制表示\n");

printf("\n");

printf("\n");

do

{

printf("請選擇:1-建立電網;2-查看數據;3-修改數據;4-運行計算;0-退出程序:");//由鍵盤輸入選項

scanf("%d",&a);

if (a==0) //如果選中0,就表示退出程序

{

exit(0);

}

else if (a==1) //如果選中1,就跳去執行建立電網,即creat處

{

creat();

}

else if (a==2) //如果選中2,就跳去執行查看數據,即view處

{

view();

}

else if (a==3) //如果選中1,就跳去執行修改數據,即modify處

{

modify();

}

else if (a==4) //如果選中1,就跳去執行運行計算,即run處

{

run();

}

else //如果以上都不是,則表示無效輸入,重新要求輸入選擇

{

printf("\n無效輸入,請重新選擇\n");

}

}while(1);

}

不知道能不能幫到妳

  • 上一篇:百度地圖的路徑搜索算法
  • 下一篇:學維修電腦前景如何?去培訓基地學好?還是當學徒好?
  • copyright 2024編程學習大全網