📄 pq.txt
字号:
精华区文章阅读
发信人: ncepuBD (跳伞塔), 信区: NumComp
标 题: 问一个很菜的问题
发信站: BBS 水木清华站 (Wed Nov 28 16:19:51 2001)
在下用c语言编一个pq分解法的潮流计算程序,遇到一个很怪怪的问题
#include "math.h"
#include "stdio.h"
#include "stdlib.h"
main()
{
int k,n,nb,i,j;
double r,x,yk,Z,Gij,Bij,b_ij;
/*发电机节点*/
struct generator
{int i,type;
double p,q;
double v;
}*pgen;
/*负荷节点*/
struct load
{int i,type;
double p,q;
double v;
}*pload;
/*PV节点*/
struct pvnode
{
double v;
int i;
}*ppv;
/*支路*/
struct branch
{
int i,j,type;
double r,x,yk;
}*pbr;
/*导纳矩阵元素*/
struct yii
{
double g,b;
}*pyii,*pyii1; /*对角元*/
struct yij
{
double g,b;
int j;
}*pyij,*pyij1; /*非对角元*/
/*打开文件*/
FILE *pf;
if ((pf=fopen("data1.txt","r"))==NULL)
{
printf("cannot open this file.\n");
exit(0);
}
fscanf (pf,"%d%d",&n,&nb);/*读入节点数和支路数*/
pbr=(branch *)malloc((nb+1)*sizeof(branch)); /*给支路数组动态分配内存*/
/*读入支路数据*/
for(k=1;k<=nb;k++)
{
fscanf (pf,"%d%d%lf%lf%lf",&pbr[k].i,&pbr[k].j,
&pbr[k].r,&pbr[k].x,&pbr[k].yk);
************ printf("%d%d%lf%lf%lf ",pbr[k].i,pbr[k].j,
pbr[k].r,pbr[k].x,pbr[k].yk);
}
printf("zxyweu\n");
/*为导纳矩阵结构体动态分配内存*/
pyii=(struct yii *)malloc((n+1)*sizeof(yii));
pyii1=(struct yii *)malloc((n+1)*sizeof(yii));
pyij=(struct yij *)malloc((nb+1)*sizeof(yij));
pyij1=(struct yij *)malloc((nb+1)*sizeof(yij));
/*各行第一个非对角元在导纳阵非对角元中的位置顺序号*/
int *nyseq=(int *)malloc((n+1)*sizeof(int));
/*导纳矩阵中各行非对角元的个数*/
int *nysum=(int *)malloc((n+1)*sizeof(int));
/*给导纳阵元素赋初值*/
for(k=1;k<=n;k++)
{
pyii[k].g=0.0;
pyii[k].b=0.0;
pyii1[k].g=0.0;
pyii1[k].b=0.0;
nysum[k]=0;
}
/*形成不接地支路的导纳矩阵*/
for(k=1;k<=nb;k++)
{
i=abs(pbr[k].i);
j=abs(pbr[k].j);
r=pbr[k].r;
x=pbr[k].x;
yk=pbr[k].yk;
Z=r*r+x*x;
Gij=r/Z;
Bij=-x/Z;
b_ij=-1.0/x;
if((pbr[k].i<0)||(pbr[k].j<0))
{
pyij[k].g=-Gij/yk;
pyij[k].b=-Bij/yk;
pyij1[k].g=0.0;
pyij1[k].b=-b_ij/yk;
}
else
{
pyij[k].g=-Gij;
pyij[k].b=-Bij;
pyij1[k].g=0.0;
pyij1[k].b=-b_ij;
}
pyij[k].j=j;
pyij1[k].j=j;
if((pbr[k].i<0)||(pbr[k].j<0))
{
pyii[i].g=pyii[i].g+Gij/yk;
pyii[i].b=pyii[i].b+Bij/yk;
pyii[j].g=pyii[j].g+Gij/yk;
pyii[j].b=pyii[j].b+Bij/yk;
pyii1[i].b=pyii1[i].b+b_ij/yk;
pyii1[j].b=pyii1[j].b+b_ij/yk;
}
else
{
pyii[i].g=pyii[i].g+Gij;
pyii[i].b=pyii[i].b+Bij;
pyii[j].g=pyii[j].g+Gij;
pyii[j].b=pyii[j].b+Bij;
pyii1[i].b=pyii1[i].b+b_ij;
pyii1[j].b=pyii1[j].b+b_ij;
}
nysum[i]++;
}
nyseq[1]=1;
for(k=1;k<=(n-1);k++)
nyseq[k+1]=nyseq[k]+nysum[k];
/*追加接地支路*/
for(k=1;k<=nb;k++)
{
i=pbr[k].i;
j=pbr[k].j;
yk=pbr[k].yk;
if((i<0)||(j<0))
{
if(i<0)
{
i=abs(i);
Gij=pyij[k].g;
Bij=pyij[k].b;
b_ij=pyij1[k].b;
pyii[i].g=pyii[i].g+(1.0-1.0/yk)*Gij;
pyii[i].b=pyii[i].b+(1.0-1.0/yk)*Bij;
pyii1[i].b=pyii1[i].b+(1.0-1.0/yk)*b_ij;
pyii[j].g=pyii[j].g+(1.0-yk)*Gij;
pyii[j].b=pyii[j].b+(1.0-yk)*Bij;
pyii1[j].b=pyii1[j].b+(1.0-yk)*b_ij;
}
else
{
j=abs(j);
Gij=pyij[k].g;
Bij=pyij[k].b;
b_ij=pyij1[k].b;
pyii[j].g=pyii[j].g+(1.0-1.0/yk)*Gij;
pyii[j].b=pyii[j].b+(1.0-1.0/yk)*Bij;
pyii1[j].b=pyii1[j].b+(1.0-1.0/yk)*b_ij;
pyii[i].g=pyii[i].g+(1.0-yk)*Gij;
pyii[i].b=pyii[i].b+(1.0-yk)*Bij;
pyii1[i].b=pyii1[i].b+(1.0-yk)*b_ij;
}
}
else
{
Bij=yk/2.0;
b_ij=yk/2.0;
pyii[i].b=pyii[i].b+Bij;
pyii[j].b=pyii[j].b+Bij;
pyii1[i].b=pyii1[i].b+b_ij;
pyii1[j].b=pyii1[j].b+b_ij;
}
}
/*因子表生成*/
free(pyii);
free(pyii1);
free(pyij);
free(pyij1);
free(pbr);
free(nyseq);
free(nysum);
getchar();
}
请注意长串星花所指的一句,直接运行无异样,
如果把这句输出语句注释掉,花括号内的读入语句及该循环就就不被执行,而直接结束
整个程序;
如果把该语句放到花括号外紧接该循环体,又一切正常。
?????????????
我用的环境是borland c++
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -