| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 677 人关注过本帖
标题:c语言调用原始数据提示数据打开失败请高手帮忙
只看楼主 加入收藏
manywishes
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-5-24
结帖率:0
收藏
已结贴  问题点数:20 回复次数:6 
c语言调用原始数据提示数据打开失败请高手帮忙
/*   FUNCTION : POWER FLOW             */
/*   WRITTEN BY : HUANG&YANG&TONG   */
#include <stdio.h>
#include <math.h>

/***  宏定义  ***/
#define eP 0.00001
#define eQ 0.00001
#define Y_(i,j) (*(*(Y+i)-i+j))
#define Yij (*(Yi+j))
#define Yji (*(*(Y+j)-j+i))
#define Pji Yji.G*cos(tmp)+Yji.B*sin(tmp)
#define Pij Yij.G*cos(tmp)+Yij.B*sin(tmp)
#define Qji Yji.G*sin(tmp)-Yji.B*cos(tmp)
#define Qij Yij.G*sin(tmp)-Yij.B*cos(tmp)

/***  结构体变量定义  ***/
struct Nodetype /* 节点功率 */
{
 float P,Q;
};
struct Linetype /* 线路类型 */
{
 float G,B,B0,k;
};

/***  子函数声明  ***/
void in_node();  /* 读节点功率 */
void in_line();  /* 读线路参数 */
void B_Form();   /* 生成BP、BQ矩阵 */
void factor(); /* 求因子表 */
void solve(float **B,float *X,int N); /* 解方程组 */
void PrtNode();  /*打印节点参数*/
void ErrorMsg(int Flag); /* 错误提示信息 */

/***  全局变量声明  ***/
int Node;    /*节点数*/
int *Num;    /*保存原始节点序号*/
int NP,NQ=0;  /*PV+PQ、PQ节点数*/
struct Nodetype *No;  /*节点数据*/
struct Linetype **Y; /*线路参数*/
float **BP,**BQ; /*有功、无功简化雅克比矩阵B*/
float *V;      /*节点电压有效值*/
float *Dlta;   /*节点电压相角值*/
unsigned int count=0; /*迭代计数*/
int i,j,k,m;    /*通用下标值*/
float tmp;    /*临时数据暂存*/
char *Type; /*节点类型*/
FILE *in,*out;    /*输入、输出文件指针*/

/******************  主函数  ******************/
/**↓****↓****↓**  主函数  **↓****↓****↓**/
int main(void)
{
 int kp=1,kq=1; /*P、Q精度判断:1-不满足,0-满足精度要求*/
 float *dP,*dPi,*dQ,*dQi; /*ΔP、ΔQ*/
 float Dltai;
 struct Linetype *Yi;
 struct Nodetype *Noi;
 float tP,tQ;

 if((in=fopen("Data.txt","r"))==NULL) ErrorMsg(1);
 if((out=fopen("out.txt","w"))==NULL) ErrorMsg(2);
 in_node();  /*读取节点参数并统计PQ、PV节点数*/
 in_line();  /*读取线路参数并形成Y矩阵*/
 B_Form();   /*形成B(BP&BQ)矩阵*/
 factor();   /*求B因子式(仍保存于BP&BQ)*/
 for(i=0;i<NQ;i++) *(V+i)=1;  /*对PQ节点电压V赋初值*/
 dP=(float *)malloc(sizeof(float)*NP);  /*ΔP*/
 dQ=dP;  /*ΔQ*//*ΔP、ΔQ不同时存在,故而可共用空间*/

loop:    /****开始迭代****/
 if(kp==0&&kq==0) goto loopEnd;
 count++; /*迭代次数加一*/
 if(count==65535) ErrorMsg(99); /*不收敛,退出*/
 kp=0;
 for(i=0;i<NP;i++)
  {
   dPi=dP+i;
   Yi=*(Y+i)-i;
   Dltai=*(Dlta+i);
   *dPi=0;
   for(j=0;j<Node;j++)
    {
     tmp=Dltai-*(Dlta+j);  /*tmp即δij*/
     if(i>j) *dPi+=*(V+j)*(Pji);
     else *dPi+=*(V+j)*(Pij);
    }         /*注意到Y矩阵为上三角矩阵,i>j时要交换下标*/
   *dPi*=*(V+i);
   *dPi=(*(No+i)).P-*dPi; /*求得ΔPi*/
   if(fabs(*dPi)>0x8fffffff) ErrorMsg(99);  /*不收敛,退出*/
   if(fabs(*dPi)>eP) kp=1; /*有不满足精度的ΔP即令kp=1*/
   *dPi/=*(V+i); /*求得常数项ΔPi/Vi*/
  }
 if(kp==0) goto loopQ;
 solve(BP,dP,NP);
 for(i=0;i<NP;i++) *(Dlta+i)+=(*(dP+i)/(*(V+i))); /*修正相角δ+=Δδ*/

loopQ:
 if(kp==0&&kq==0) goto loopEnd;
 kq=0;
 for(i=0;i<NQ;i++)
  {
   dQi=dQ+i;
   Yi=*(Y+i)-i;
   Dltai=*(Dlta+i);
   *dQi=0;
   for(j=0;j<Node;j++)
    {
     tmp=Dltai-*(Dlta+j);  /*tmp即δij*/
     if(i>j) *dQi+=*(V+j)*(Qji);
     else *dQi+=*(V+j)*(Qij);
    }         /*注意到Y矩阵为上三角矩阵,i>j时要交换下标*/
   *dQi*=*(V+i);
   *dQi=(*(No+i)).Q-*dQi; /*求得ΔQi*/
   if(fabs(*dQi)>0x8fffffff) ErrorMsg(99);  /*不收敛,退出*/
   if(fabs(*dQi)>eQ) kq=1; /*有不满足精度的ΔQ即令kq=1*/
   *dQi/=*(V+i); /*求得常数项ΔQi/Vi*/
  }
 if(kq==0) goto loop;
 solve(BQ,dQ,NQ);
 for(i=0;i<NQ;i++) *(V+i)+=*(dQ+i); /*修正PQ节点电压V+=ΔV*/
 goto loop; /*无功迭代,则必定需要下一轮回迭代判断*/
loopEnd:    /****迭代结束****/

free(dP);  /*释放内存空间*/

/****计算PV节点和平衡节点的无功功率Q****/
 for(i=NQ;i<Node;i++)
  {
   Noi=No+i;
   Yi=*(Y+i)-i;
   Dltai=*(Dlta+i);
   for(j=0;j<Node;j++)
    {
     tmp=Dltai-*(Dlta+j);  /*tmp即δij*/
     if(i>j) (*Noi).Q+=*(V+j)*(Qji);
     else (*Noi).Q+=*(V+j)*(Qij);
    }         /*注意到Y矩阵为上三角矩阵,i>j时要交换下标*/
   (*Noi).Q*=*(V+i);
  }

/****计算平衡节点的有功功率P****/
 i=NP;
 Noi=No+i;
 Dltai=*(Dlta+i);
 for(j=0;j<Node;j++)
  {
   tmp=Dltai-*(Dlta+j);  /*tmp即δij*/
   (*Noi).P+=*(V+j)*(Pji);
  }         /*注意到Y矩阵为上三角矩阵,i>j时要交换下标*/
 (*Noi).P*=*(V+i);

/****输出最终结果****/
fprintf(out,"\n\n【 潮流计算结果(节点) 】 ( 迭代次数k=%3d )\n",count-1);
PrtNode();

/****计算全部线路功率****/
fprintf(out,"\n\n【 潮流计算结果(线路) 】\n");
fprintf(out,"  线路         P          Q\n");
 for(k=0;k<Node;k++)
  {
   i=*(Num+k);
   Yi=*(Y+i)-i;
   Dltai=*(Dlta+i);
   Noi=No+i;
   for(m=0;m<Node;m++)
    {
     j=*(Num+m);
     if(j==i) continue;
     tmp=Dltai-*(Dlta+j);  /*tmp即δij*/
     if(j<i)
      {
       if(Yji.B==0) continue; /*若Bij=0,则节点i、j无直接联系*/
       tP=*(V+j)*(Pji);
       tP=*(V+i)*Yji.G-tP;
       tP*=*(V+i);
       tQ=-*(V+j)*(Qji);
       tQ-=*(V+i)*(Yji.B-Yji.B0/Yji.k);
       tQ*=*(V+i);
      }
     else
      {
       if(Yij.B==0) continue; /*若Bij=0,则节点i、j无直接联系*/
       tP=*(V+j)*(Pij);
       tP=*(V+i)*Yij.G-tP;
       tP*=*(V+i);
       tQ=-*(V+j)*(Qij);
       tQ-=*(V+i)*(Yij.B-Yij.B0);
       tQ*=*(V+i);
      }
     fprintf(out,"S[%d,%d]= (%10.6f,%10.6f)\n",k+1,m+1,-tP,-tQ);
    }
  }
 
 fclose(out);
 system("cmd /c start out.txt");
 return(0);
}
/**↑****↑****↑**  主函数  **↑****↑****↑**/
/******************  主函数  ******************/

/****************  子函数:读节点数据  ****************/
void in_node()
{
 struct Nodetype *Noi; /*临时变量*/

 fscanf(in,"%d %d",&Node,&k);/*读取节点数Node*/
 NP=Node-1; /*PV+PQ节点数,即非平衡节点数目*/
 Num=(int *)malloc(sizeof(int)*Node); /*开Node个空间,每节点一个*/
 V=(float *)malloc(sizeof(float)*Node); /*电压*/
 Dlta=(float *)malloc(sizeof(float)*Node); /*电压相角*/
 No=(struct Nodetype *)malloc(sizeof(struct Nodetype)*Node);/*节点功率*/
 j=1;
 while(k!=0) /*若k=0,表明节点数据读取完毕*/
  {
   switch(k)
    {
     case 1:k=NQ;NQ++;break;  /*NQ统计PQ节点个数*/
     case 2:k=NP-j;j++;break; /*从NP-1个空间倒着保存PV节点*/
     case 3:k=NP;break; /*平衡节点*/
     default:ErrorMsg(3);
    }
   Noi=No+k;
   fscanf(in,"%d %f %f %f %f",&i,&(*Noi).P,&(*Noi).Q,V+k,Dlta+k);
   i--;  /*节点编号减一,以和程序表达方式兼容*/
   *(Num+i)=k; /*第i个Num元素中存放i节点在No中的下标*/
   fscanf(in,"%d",&k); /*读取节点类型*/
  }
  if(NQ+j!=Node) ErrorMsg(4); /*检验节点数据个数是否够Node个*/

fprintf(out,"【 节点参数表 】\n");
PrtNode();
fprintf(out,"  总节点:%d\n  PQ节点:%d\n  PV节点:%d\n",Node,NQ,NP-NQ);
}

/************  子函数:读线路数据,并形成节点导纳矩阵Y  ************/
void in_line()
{
 struct Linetype *Yi;
 float R,X,k,B;

 m=sizeof(struct Linetype);
 Y=(struct Linetype **)malloc(m*Node); /*先开Node行,每一个节点一行*/
 for(i=0;i<Node;i++)                      /*再在第i行上面开辟Node-i列*/
  {                                       /*即以上三角存储 Y 矩阵*/
   *(Y+i)=(struct Linetype *)malloc(m*(Node-i));
   Yi=*(Y+i)-i;
   for(j=i;j<Node;j++) {Yij.G=Yij.B=Yij.B0=Yij.k=0;} /*初始化*/
  }
 while(feof(in)==0) /*文件指针到文件末*/
  {
   fscanf(in,"%d %d %f %f %f %f",&i,&j,&R,&X,&k,&B);
   i--;j--;
   i=*(Num+i); /*转换节点号为该节点在程序中的储存编号*/
   j=*(Num+j);
   (*(*(Y+i))).B+=B; /* 将对地充电导纳累加到自导纳 */
   (*(*(Y+j))).B+=B;
   if(k!=1.0)
    {
     X*=k;R=0;
     tmp=(1-k)/X;
     (*(*(Y+i))).B+=tmp;  /*将变压器的对地充电容纳累加到自导纳*/
     (*(*(Y+j))).B+=-(tmp/k);
     B=tmp;
     k=-k;
    }
   if(i>j) {tmp=i;i=j;j=tmp;k=1/k;B*=k;}
   Yi=*(Y+i)-i; /*  以Yi代替*(Y+i)-i,简化表达式并避免重复计算  */
   Yij.B0=B;  /*保存ij0、ji0对地充电电容到Bij0*/
   Yij.k=k;   /*且有B0ji=B0ij/k*/
   tmp=R*R+X*X;
   R/=tmp;
   X/=tmp;
   Yij.G=-R; /* 生成互导纳 */
   Yij.B=X;
   (*(*(Y+i))).G+=R; /* 将线路互导纳累加到自导纳 */
   (*(*(Y+i))).B+=-X;
   (*(*(Y+j))).G+=R;
   (*(*(Y+j))).B+=-X;
  }
 fclose(in);
fprintf(out,"\n【 节点导纳矩阵 Y 】\n");
for(k=0;k<Node;k++)
 {
  i=k;
  i=*(Num+i); /*查取第i节点在程序中存储序号*/
  for(j=0;j<k;j++) fprintf(out,"\t\t\t");
  for(m=k;m<Node;m++)
   {
    j=*(Num+m); /*查取第j节点在程序中存储序号*/
    if(i<j) fprintf(out,"(%10.6f,%10.6f) ",Y_(i,j).G,Y_(i,j).B);
    else fprintf(out,"(%10.6f,%10.6f) ",Y_(j,i).G,Y_(j,i).B);
   }
  fprintf(out,"\n");
 }
}

/****************  子函数:生成BP、BQ矩阵  ****************/
void B_Form()
{
 float *BPi,*BQi;
 struct Linetype *Yi;
 int size=sizeof(float);
 BP=(float **)malloc(size*NP); /*以上三角存储*/
 for(i=0;i<NP;i++) *(BP+i)=(float *)malloc(size*(NP-i));
 for(i=0;i<NP;i++)
  {
   BPi=*(BP+i)-i; /*  以BPi代替*(BP+i)-i,避免重复计算  */
   Yi=*(Y+i)-i;
   for(j=i;j<NP;j++) *(BPi+j)=Yij.B;  /*(BPi+j)即相当于BP[i][j]*/
  }
 BQ=BP; /* BP包含BQ,BP左上角的NQ*NQ子阵即BQ */
}

/****************  子函数:求因子表  ****************/
void factor()
{
 float *BPi,*BPk,*BQi;
 for(i=0;i<NP;i++)
  {
   BPi=*(BP+i)-i;
   for(k=0;k<i;k++)
    {
     BPk=*(BP+k)-k;
     tmp=(*(BPk+i))/(*(BPk+k));
     for(j=i;j<NP;j++) (*(BPi+j))-=tmp*(*(BPk+j));
    }
   *(BPi+i)=1/(*(BPi+i));
   for(j=i+1;j<NP;j++) *(BPi+j)*=*(BPi+i);
  }
}

/****************  子函数:解方程组  ****************/
void solve(float **B,float *X,int N)
{
 float *Bi,*Xi;
 for(i=0;i<N;i++) *(X+i)=-*(X+i);/*对常数项取负*/
/****对常数列进行前代****/
 for(i=0;i<N;i++)
  {
   Bi=*(B+i)-i;
   Xi=X+i;
   for(j=i+1;j<N;j++) *(X+j)-=*(Bi+j)**Xi;
   *Xi*=*(Bi+i);
  }

/****回代以求解方程组****/
 for(i=N-1;i>=0;i--)
  {
   Bi=*(B+i)-i;
   Xi=X+i;
   for(j=N-1;j>i;j--) *Xi-=*(Bi+j)**(X+j);
  }
}

/****打印节点参数****/
void PrtNode()
{
 struct Nodetype *Noi;
fprintf(out,"节点  类型        P          Q          V         δ\n");
for(i=0;i<Node;)
 {
  j=*(Num+i); /*查取第i节点在程序中存储序号*/
  Noi=No+j;
  if(j<NQ) Type="PQ"; else Type="PV";
  if(j==NP) Type="BS";
  fprintf(out,"%3d    %s   %10.6f %10.6f %10.6f %10.6f\n",
        ++i,Type,(*Noi).P,(*Noi).Q,*(V+j),*(Dlta+j)/0.017453);
 }
}
  /****************  子函数:错误信息  ****************/
void ErrorMsg(int Flag)
{
 switch(Flag)
  {
   case 1:printf("\n\tError(1): Failed to Open File \"Data.txt\"!");break;
   case 2:printf("\n\tError(2): Failed to Creat File \"out.txt\"!");break;
   case 3:printf("\n\tError(3): Node Data Error, Please Check!");break;
   case 4:printf("\n\tError(4): Lack Node Data, Please Check!");break;
   case 99:printf("k=%d\n\tError(99): It's Emanative!",count);break;
  }
 getch();
 fclose(out);
 exit(Flag);
}

搜索更多相关主题的帖子: c语言 数据 原始 失败 
2010-05-25 13:41
manywishes
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-5-24
收藏
得分:0 
我已经做好了原始数据的txt文档,但是还是提示打开失败,请问高手帮忙看看怎么弄
2010-05-25 13:43
韩明海
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:253
专家分:749
注 册:2010-4-3
收藏
得分:20 
程序一时半会还看不明白,你是在linux下编么?看看文件的权限
因为你的文件只写文件名,没有路径,就要确定执行文件和.txt在一个文件里
2010-05-25 14:47
manywishes
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-5-24
收藏
得分:0 
回复 3楼 韩明海
我的程序是关于潮流计算的,我的data路径和程序文件时放在同一个文件夹下的,可是还是不能打开,请问怎么修改才能添加路径
2010-05-25 16:12
韩明海
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:253
专家分:749
注 册:2010-4-3
收藏
得分:0 
我不懂你说的什么潮流计算,呵呵,文件权限改成777试试呢,路径就加在文件名前就可以了,如果加路径最好是绝对路径
2010-05-25 16:15
manywishes
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-5-24
收藏
得分:0 
我改了绝对路径可是还是搞不定
2010-05-25 16:29
韩明海
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:253
专家分:749
注 册:2010-4-3
收藏
得分:0 
呵呵,权限改过么?路径对,权限也可以,那就不知道了
2010-05-25 17:33
快速回复:c语言调用原始数据提示数据打开失败请高手帮忙
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039372 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved