C语言编写短路电流计算的程序讲课讲稿.doc
Good is good, but better carries it.精益求精,善益求善。C语言编写短路电流计算的程序-初始条件:如图所示电力系统,最大运行方式时,两个电源同时送电,变压器并联运行,忽略线路电阻,线路电抗0.4/km。计算k1和k2点在最大运行方式时的三相短路电流。要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.写出三相短路电流的计算方法;2.用C或FORTRAN语言实现三相短路电流的计算程序;3.调试程序并求出计算结果;4.撰写计算方法原理、计算流程文档及设计说明书;5.提供计算程序代码。 代码使用C+编写的,共有三个文件,请建立工程,一起编译。这是Plural.hpp#ifndefPLURAL_HPP#definePLURAL_HPP/类名称:Plural /方法:GetR,GetI,SetRI,SetR,SetI/数据:m_pluralR,m_pluralI classPlural public: Plural(); Plural(floatpR,floatpI); Plural(); floatGetR()const; floatGetI()const; voidSetRI(floatpR,floatpI); voidSetR(floatpR); voidSetI(floatpI); private: floatm_pluralR; floatm_pluralI;/名称:复数乘法,PluralMul(Pluralplural1,Pluralplural2)/参数:复数plural1plural2 /返回值:复数 PluralPluralMul(Pluralplural1,Pluralplural2);/函数名:复数除法,运算浮点数除以复数 /参数:num,分子,是一个浮点数。den,分母,是一个复数 /返回值:结果的复数 PluralPluralDiv(floatnum,Pluralden);/函数名:复数求倒数 /参数:den,分母,是一个复数 /返回值:此复数的倒数 PluralPluralDiv(Pluralplu);/参数:mat为待变换的复数矩阵的数组名,n为阶数 /返回值:无 /说明:变换后的结果依旧保存在mat中 voidMatrixInv(Plural*mat,intn);#endif#include"plural.hpp"#include<stdio.h>#include<stdlib.h>#include<math.h>/类名称:Plural /方法:GetR,GetI,SetRI,SetR,SetI/数据:m_pluralR,m_pluralI Plural:Plural() m_pluralR=0; m_pluralI=0;Plural:Plural(floatpR,floatpI) m_pluralR=pR; m_pluralI=pI; Plural:Plural()floatPlural:GetR()const returnm_pluralR;floatPlural:GetI()const returnm_pluralI;voidPlural:SetRI(floatpR,floatpI) m_pluralR=pR; m_pluralI=pI;voidPlural:SetR(floatpR) m_pluralR=pR;voidPlural:SetI(floatpI) m_pluralI=pI;/ 名称:复数乘法,PluralMul(Pluralplural1,Pluralplural2)/ 参数:复数plural1plural2 / 返回值:复数 PluralPluralMul(Pluralplural1,Pluralplural2) Pluralresult; result.SetRI(plural1.GetR()*plural2.GetR()-plural1.GetI()*plural2.GetI(),plural1.GetR()*plural2.GetI()+plural1.GetI()*plural2.GetR(); returnresult;/函数名:复数除法,运算浮点数除以复数 /参数:num,分子,是一个浮点数。den,分母,是一个复数 /返回值:结果的复数 PluralPluralDiv(floatnum,Pluralden) Pluralresult; floatk; k=den.GetR()*den.GetR()+den.GetI()*den.GetI(); result.SetR(num*den.GetR()/k); result.SetI(-1.0*num*den.GetI()/k); returnresult; /函数名:复数求倒数 /参数:den,分母,是一个复数 /返回值:此复数的倒数 PluralPluralDiv(Pluralplu) Pluralresult; floatk; k=plu.GetR()*plu.GetR()+plu.GetI()*plu.GetI(); result.SetR(plu.GetR()/k); result.SetI(-1.0*plu.GetI()/k); returnresult; /说明:以下3个函数组合用来求复数矩阵的逆。 double*inv(double*A,double*Ainv,intn);voidmulAB(double*A,double*B,double*C,intam,intan,intbm,intbn);/参数:mat为待变换的复数矩阵的数组名,n为阶数 /返回值:无 /说明:变换后的结果依旧保存在mat中 voidMatrixInv(Plural*mat,intn);/矩阵求逆。A为原矩阵,Ainv为求逆之后矩阵,n为阶数 double*inv(double*A,double*Ainv,intn) int*is,*js,i,j,k,l,u,v; doubled,p; for(i=0;i<n*n;i+) *(Ainv+i)=*(A+i); is=(int*)malloc(n*sizeof(int); js=(int*)malloc(n*sizeof(int); for(k=0;k<=n-1;k+) d=0.0; for(i=k;i<=n-1;i+) for(j=k;j<=n-1;j+) l=i*n+j; p=fabs(Ainvl); if(p>d) d=p; isk=i; jsk=j; if(d+1.0=1.0) free(is); free(js); returnNULL; if(isk!=k) for(j=0;j<=n-1;j+) u=k*n+j; v=isk*n+j; p=Ainvu; Ainvu=Ainvv; Ainvv=p; if(jsk!=k) for(i=0;i<=n-1;i+) u=i*n+k; v=i*n+jsk; p=Ainvu; Ainvu=Ainvv; Ainvv=p; l=k*n+k; Ainvl=1.0/Ainvl; for(j=0;j<=n-1;j+) if(j!=k) u=k*n+j; Ainvu=Ainvu*Ainvl; for(i=0;i<=n-1;i+) if(i!=k) for(j=0;j<=n-1;j+) if(j!=k) u=i*n+j; Ainvu=Ainvu-Ainvi*n+k*Ainvk*n+j; for(i=0;i<=n-1;i+) if(i!=k) u=i*n+k; Ainvu=-Ainvu*Ainvl; for(k=n-1;k>=0;k-) if(jsk!=k) for(j=0;j<=n-1;j+) u=k*n+j; v=jsk*n+j; p=Ainvu; Ainvu=Ainvv; Ainvv=p; if(isk!=k) for(i=0;i<=n-1;i+) u=i*n+k; v=i*n+isk; p=Ainvu; Ainvu=Ainvv; Ainvv=p; free(is); free(js); returnAinv;/参数:a为原矩阵,b为逆矩阵,c为结果。其他在此都为n voidmulAB(double*a,double*b,double*c,intam,intan,intbm,intbn) inti,j,l,u; if(an!=bm) printf("不能完成原矩阵和其逆矩阵矩阵相乘n"); return; for(i=0;i<am;i+) for(j=0;j<bn;j+) u=i*bn+j; cu=0.0; for(l=0;l<an;l+) cu=cu+ai*an+l*bl*bn+j; return;/复数矩阵求逆。参数:mat为待求矩阵,n为阶数 voidMatrixInv(Plural*mat,intn) inti,j; doublepluralRnn,pluralInn; double*a=NULL,*b=NULL,*c=NULL; double*resultR=NULL,*resultI=NULL; Pluralresultnn; for(i=0;i<n;i+) for(j=0;j<n;j+) pluralRij=mati*n+j.GetR(); pluralIij=mati*n+j.GetI(); printf("原始矩阵为:n"); for(i=0;i<n;i+) for(j=0;j<n;j+) printf("%10.4f+j%0.4ft",(*pluralR)i*n+j,(*pluralI)i*n+j); printf("n"); a=(double*)malloc(n*n*sizeof(double); b=(double*)malloc(n*n*sizeof(double); c=(double*)malloc(n*n*sizeof(double); resultR=inv(*pluralR,a,n); resultI=inv(*pluralI,b,n); if(resultI!=NULL) printf("n求逆之后虚部是:n"); if(n%2=0) for(i=0;i<n;i+) for(j=0;j<n;j+) printf("%10.4f+j%0.4ft",resultR=NULL?0:resultRi*n+j,resultI=NULL?0:resultIi*n+j); printf("n"); else for(i=0;i<n;i+) for(j=0;j<n;j+) printf("%10.4f+j%0.4ft",resultR=NULL?0:resultRi*n+j,resultI=NULL?0:-1.0*resultIi*n+j); printf("n"); / 测试所求实部逆矩阵 / mulAB(*pluralR,a,c,n,n,n,n);/ printf("nn求逆后原实部和现在的实部乘积是n");/ for(i=0;i<n;i+)/ / for(j=0;j<n;j+)/ printf("%10.4ft",ci*n+j);/ printf("n");/ / 测试用所求逆矩阵 / mulAB(*pluralI,b,c,n,n,n,n);/ printf("nn求逆之后原虚部和现在的虚部乘积是:n");/ for(i=0;i<n;i+)/ / for(j=0;j<n;j+)/ printf("%10.4ft",-1.0*ci*n+j);/ printf("n");/ for(i=0;i<n;i+) for(j=0;j<n;j+) mati*n+j.SetRI(resultR=NULL?0:resultRi*n+j,resultI=NULL?0:resultIi*n+j); free(a); free(b); free(c); #include<iostream>#include"plural.hpp"/#include"input.hpp"usingnamespacestd;voidNodInit() floatg1S,g1X,g2S,g2X,l1L,l1D,l2L,l2D,t1S,t1U,t2S,t2U; cout<<"请输入发电机G1的容量S(无穷大请输入0):" cin>>g1S; cout<<"请输入发电机G1的电抗Xd(没有请输入0):" cin>>g1X; cout<<endl<<"*"<<endl<<endl; cout<<"请输入发电机G2的容量S(无穷大请输入0):" cin>>g2S; cout<<"请输入发电机G2的电抗Xd(没有请输入0):" cin>>g2X; cout<<endl<<"*"<<endl<<endl; cout<<"请输入线路1的长度L(KM):" cin>>l1L; cout<<"请输入线路1每千米电抗值:" cin>>l1D; cout<<endl<<"*"<<endl<<endl; cout<<"请输入线路2的长度L(KM):" cin>>l2L; cout<<"请输入线路2每千米电抗值:" cin>>l2D; cout<<endl<<"*"<<endl<<endl; cout<<"请输入变压器T1的容量S(MVA):" cin>>t1S; cout<<"请输入变压器T1的Uk%:" cin>>t1U; cout<<endl<<"*"<<endl<<endl; cout<<"请输入变压器T2的容量S(MVA):" cin>>t2S; cout<<"请输入变压器T2的Uk%:" cin>>t2U; intmain() NodInit(); Pluralmatrix233; matrix200.SetRI(0,1);matrix201.SetRI(0,2);matrix210.SetRI(0,1);matrix211.SetRI(0,1); matrix202.SetRI(0,2);matrix212.SetRI(0,1);matrix220.SetRI(0,3);matrix221.SetRI(0,2);matrix222.SetRI(0,1); MatrixInv(*matrix2,3); printf("n1点短路电流是n"); printf("%f+j%f",PluralDiv(matrix200).GetR(),PluralDiv(matrix200).GetI(); printf("n2点短路电流是n"); printf("%f+j%f",PluralDiv(matrix211).GetR(),PluralDiv(matrix211).GetI(); printf("n3点短路电流是n"); printf("%f+j%f",PluralDiv(matrix211).GetR(),PluralDiv(matrix211).GetI(); getchar(); return0;-