⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 自己做的小波与神经网络组合方法实现负荷预测程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
       temp=c_temp[1];
       c_temp[1]=c_temp[i];
       c_temp[i]=temp;
	 }   
   } 
  min_c3=c_temp[1];

  for(i=1;i<=40;i++)           //数据归一化
    net_c[i]=(net_c[i]-min_c3)/(max_c3-min_c3);
  //fpc=fopen("cc.txt","w");
   //for(i=1;i<41;i++)
   //fprintf(fpc,"%lf\n",net_c[i]);


  ///////////////////////////////////输入c3in文件
  fp=fopen("c3in.txt","w");
  for(i=0;i<1;i++)
	fprintf(fp,"%lf\t",net_c[i]);
  fprintf(fp,"\n");
  fclose(fp);
  fp=fopen("c3in.txt","a+");
  for(i=1;i<=7;i++)
	fprintf(fp,"%lf\t",net_c[i]);
  fprintf(fp,"\n");
  fclose(fp);
  fp=fopen("c3in.txt","a+");
  for(i=8;i<=14;i++)
	fprintf(fp,"%lf\t",net_c[i]);
  fprintf(fp,"\n");
  fclose(fp);
  fp=fopen("c3in.txt","a+");
  for(i=15;i<=21;i++)
	fprintf(fp,"%lf\t",net_c[i]);
  fprintf(fp,"\n");
  fclose(fp);
  fp=fopen("c3in.txt","a+");
  for(i=22;i<=28;i++)
	fprintf(fp,"%lf\t",net_c[i]);
  fprintf(fp,"\n");
  fclose(fp);
  fp=fopen("c3in.txt","a+");
  for(i=29;i<=35;i++)
	fprintf(fp,"%lf\t",net_c[i]);
  fprintf(fp,"\n");
  fclose(fp);
  fp=fopen("c3in.txt","a+");
  for(i=36;i<=40;i++)
	fprintf(fp,"%lf\t",net_c[i]);
  fprintf(fp,"\n");
  fclose(fp);
  
  
                        //存预测样本数据
    
  day=yucetian-1;  //29   yucetian---为30
  pday="c3_day";
  strday.Format("%d",day);
  pday+=strday;
  pday+=".txt";
  fpc=fopen(pday,"r"); 
  for(i=0;i<24;i++)                //96点的话要修改,这是24点
   {
    fscanf(fpc,"%lf",&tmp31[i]);   //tmp31----29
   }
  fclose(fpc);
    
  day=yucetian-2;  //28
  pday="c3_day";
  strday.Format("%d",day);
  pday+=strday;
  pday+=".txt";
  //cout<<pday<<endl;
  fpd=fopen(pday,"r");
  for(i=0;i<24;i++)
   {
    fscanf(fpd,"%lf",&tmp32[i]);     //tmp32---28
   }
  fclose(fpd);
  
  day=yucetian-3;   //27
  pday="c3_day";
  strday.Format("%d",day);
  pday+=strday;
  pday+=".txt";
  fp=fopen(pday,"r");
  for(i=0;i<24;i++)
   {
    fscanf(fp,"%lf",&tmp33[i]);     //tmp3---27
   }
  fclose(fp);
   
  c3_yuce[1]=tmp31[0];    
  c3_yuce[0]=tmp32[23];        //96点的话要修改,这是24点
  c3_yuce[3]=tmp32[0];
  c3_yuce[2]=tmp33[23];
  c3_yuce[4]=tmp31[0]-tmp32[0];
  

  day=yucetian-7;  //23
  pday="c3_day";
  strday.Format("%d",day);
  pday+=strday;
  pday+=".txt";
  fpc=fopen(pday,"r");
  for(i=0;i<24;i++)
   {
    fscanf(fpc,"%lf",&tmp34[i]);     //tmp34---23
   }
  fclose(fpc);
   
  day=yucetian-14; //16
  pday="c3_day";
  strday.Format("%d",day);
  pday+=strday;
  pday+=".txt";
  fpd=fopen(pday,"r");
  for(i=0;i<24;i++)
   {
    fscanf(fpd,"%lf",&tmp35[i]);   //tmp35---16
   }
  fclose(fpd);
 
  c3_yuce[6]=tmp34[0];
  c3_yuce[5]=tmp35[0];
 

   ///////输入c3bpin文件  
  for(i=0;i<=6;i++)
    c3_yuce[i]=(c3_yuce[i]-min_c3)/(max_c3-min_c3);   /////负荷数据归一化
  fp=fopen("c3bpin.txt","w");
  for(i=0;i<=6;i++)
	fprintf(fp,"%lf\t",c3_yuce[i]);
  fclose(fp);

   
  ///////对c3序列进行神经网络预测
  netc3();///网络训练
 
  fp=fopen("c3bpin.txt","r+");    //c3神经网络模型输入的数据文件
  fpc=fopen("c3bpout.txt","w+");  //c3神经网络模型输出数据文件

  for(i=0;i<IN_c;i++)
	  {
        fscanf(fp,"%lf",&Study_Data_c[0].input[i]);
	  }

  input_P_c(0); //输入第m个学习样本 (2)

  H_I_O_c(); //第m个学习样本隐层各单元输入、输出值 (4)
  O_I_O_c(); //第m个学习样本输出层各单元输入、输出值 (5)
  
  for(int j=0;j<ON_c;j++)
    O_c[j]=(max_c3-min_c3)*O_c[j]+min_c3;
  for(j=0;j<ON_c;j++)
    fprintf(fpc,"%lf\n",O_c[j]);
  fclose(fp);
  fclose(fpc);
 }


///////////////////////////////////////////////////////////////////////
 void yucec3(int hour)
 {
    net_c[0]=0.00001;
	 for(int i=hour-1;i<=hour-1;i++)	
    {
	 net_c[2]=tmp1[hour-1];      //28
     net_c[1]=tmp1[hour-2];        //96点的话要修改,这是24点
     net_c[4]=tmp2[hour-1];   //27
     net_c[3]=tmp2[hour-2];   
     net_c[5]=tmp1[hour-1]-tmp2[hour-1];
     net_c[7]=tmp4[hour-1];   //22
     net_c[6]=tmp5[hour-1];  //15
  
     //训练样本28
     net_c[9]=tmp6[hour-1];     //27 
     net_c[8]=tmp6[hour-2];   //27
     net_c[11]=tmp7[hour-1];   //26
     net_c[10]=tmp7[hour-2];
     net_c[12]=tmp6[hour-1]-tmp7[hour-1];
     net_c[14]=tmp9[hour-1];   //21
     net_c[13]=tmp10[hour-1]; //14

     //训练样本23
     net_c[16]=tmp11[hour-1];    //22 
     net_c[15]=tmp11[hour-2];
     net_c[18]=tmp12[hour-1];  //21
     net_c[17]=tmp12[hour-2];
     net_c[19]=tmp11[hour-1]-tmp12[hour-1];
     net_c[21]=tmp14[hour-1];  //16
     net_c[20]=tmp15[hour-1];  //9

    //训练样本 16
     net_c[23]=tmp16[hour-1];   //15  
     net_c[22]=tmp16[hour-2];
     net_c[25]=tmp17[hour-1];  //14
     net_c[24]=tmp17[hour-2];
     net_c[26]=tmp16[hour-1]-tmp17[hour-1];
     net_c[28]=tmp19[hour-1];  //9
     net_c[27]=tmp20[hour-1];  //2

     //训练样本27
     net_c[30]=tmp21[hour-1];   //26 
     net_c[29]=tmp21[hour-2];             //96点的话要修改,这是24点
     net_c[32]=tmp22[hour-1];  //25
     net_c[31]=tmp22[hour-2];
     net_c[33]=tmp21[hour-1]-tmp22[hour-1];
     net_c[35]=tmp24[hour-1];  //20
     net_c[34]=tmp25[hour-1];  //13


     //教师样本
     net_c[36]=tmp26[hour-1];  //29

     net_c[37]=tmp27[hour-1];   //28

     net_c[38]=tmp28[hour-1];  //23

     net_c[39]=tmp29[hour-1];  //16

     net_c[40]=tmp30[hour-1];  //27


     //预测样本输入 
     c3_yuce[1]=tmp31[hour-1];    //29 
     c3_yuce[0]=tmp31[hour-2];        
     c3_yuce[3]=tmp32[hour-1];  //28
     c3_yuce[2]=tmp32[hour-2];
     c3_yuce[4]=tmp31[hour-1]-tmp32[hour-1];
  
     c3_yuce[6]=tmp34[hour-1];  //23
     c3_yuce[5]=tmp35[hour-1];  //16
    }
  

  ////数据归一化
  for(i=1;i<=40;i++)            ///求极大值
    c_temp[i]=net_c[i];
  for(i=1; i<=40; i++)
   {
     if(c_temp[1]<c_temp[i])
	 {
       temp=c_temp[1];
       c_temp[1]=c_temp[i];
       c_temp[i]=temp;
	 }   
   } 
  max_c3=c_temp[1];

  for(i=1;i<=40;i++)      ////求极小值
    c_temp[i]=net_c[i];
  for(i=1;i<=40; i++)
   {
     if(c_temp[1]>c_temp[i])
	 {
       temp=c_temp[1];
       c_temp[1]=c_temp[i];
       c_temp[i]=temp;
	 }   
   } 
  min_c3=c_temp[1];

  for(i=1;i<=40;i++)           //数据归一化
    net_c[i]=(net_c[i]-min_c3)/(max_c3-min_c3);
  

  ///////////////////////////////////输入c3in文件
  fp=fopen("c3in.txt","w");
  for(i=0;i<1;i++)
	fprintf(fp,"%lf\t",net_c[i]);
  fprintf(fp,"\n");
  fclose(fp);
  fp=fopen("c3in.txt","a+");
  for(i=1;i<=7;i++)
	fprintf(fp,"%lf\t",net_c[i]);
  fprintf(fp,"\n");
  fclose(fp);
  fp=fopen("c3in.txt","a+");
  for(i=8;i<=14;i++)
	fprintf(fp,"%lf\t",net_c[i]);
  fprintf(fp,"\n");
  fclose(fp);
  fp=fopen("c3in.txt","a+");
  for(i=15;i<=21;i++)
	fprintf(fp,"%lf\t",net_c[i]);
  fprintf(fp,"\n");
  fclose(fp);
  fp=fopen("c3in.txt","a+");
  for(i=22;i<=28;i++)
	fprintf(fp,"%lf\t",net_c[i]);
  fprintf(fp,"\n");
  fclose(fp);
  fp=fopen("c3in.txt","a+");
  for(i=29;i<=35;i++)
	fprintf(fp,"%lf\t",net_c[i]);
  fprintf(fp,"\n");
  fclose(fp);
  fp=fopen("c3in.txt","a+");
  for(i=36;i<=40;i++)
	fprintf(fp,"%lf\t",net_c[i]);
  fprintf(fp,"\n");
  fclose(fp);
 

  ///////输入c3bpin文件
  for(i=0;i<=6;i++)
    c3_yuce[i]=(c3_yuce[i]-min_c3)/(max_c3-min_c3);   /////负荷数据归一化
  fp=fopen("c3bpin.txt","w");
  for(i=0;i<=6;i++)
	fprintf(fp,"%lf\t",c3_yuce[i]);
  fclose(fp);

   
  ///////对c3序列进行神经网络预测
  netc3();///网络训练
  
  fp=fopen("c3bpin.txt","r+");    //c3神经网络模型输入的数据文件
  fpc=fopen("c3bpout.txt","a+");  //c3神经网络模型输出数据文件

  for(i=0;i<IN_c;i++)
	  {
        fscanf(fp,"%lf",&Study_Data_c[0].input[i]);
	  }

  input_P_c(0); //输入第m个学习样本 (2)

  H_I_O_c(); //第m个学习样本隐层各单元输入、输出值 (4)
  O_I_O_c(); //第m个学习样本输出层各单元输入、输出值 (5)
  for(int j=0;j<ON_c;j++)
    O_c[j]=(max_c3-min_c3)*O_c[j]+min_c3;
  for(j=0;j<ON_c;j++)
    fprintf(fpc,"%lf\n",O_c[j]);
  fclose(fp);
  fclose(fpc);  
 }


////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////d3预测//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////
//////////////////d3///////////////
///////////////////////////////////
#define N_d3 5//学习样本个数
#define IN_d3 28 //输入层神经元数目
#define HN_d3 15 //隐层神经元数目
#define ON_d3 1 //输出层神经元数目
const   R_d3=HN_d3*(IN_d3+1)+ON_d3*(HN_d3+1);  //列的常数定义
//#define DIM R_d3
#define EPSILON 0.000000001
#include "qiunid3.c"
extern int gjcpegd3(int process,double A[DIM][DIM],double b[DIM][DIM]);

double P_d3[IN_d3]; //单个样本输入数据
double T_d3[ON_d3]; //单个样本教师数据
double W_d3[HN_d3][IN_d3]; //输入层至隐层权值
double V_d3[ON_d3][HN_d3]; //隐层至输出层权值
double X_d3[HN_d3]; //隐层的输入
double Y_d3[ON_d3]; //输出层的输入
double H_d3[HN_d3]; //隐层的输出
double O_d3[ON_d3]; //输出层的输出
double sita_d3[HN_d3]; //隐层的阈值
double gama_d3[ON_d3]; //输出层的阈值
double err_m_d3[N_d3]; //第m个样本的总误差
double err_O_d3[N_d3][ON_d3];  ///m样本第ON输出的误差
double s2_d3[ON_d3];   //定义敏感度s2
double s1_d3[HN_d3];  //定义敏感度数组s1
double yacobi_d3[N_d3][R_d3];   //N*ON,IN*HN+HN+HN*ON+ON   行,列
double niu_d3,beta_d3=10.0;   //定义参数
double det_x_d3[R_d3];      ////定义误差数组
//定义一个放学习样本的结构
struct {
double input[IN_d3];
double teach[ON_d3];
}Study_Data_d3[N_d3];

///////////////////////////
//初始化权、阈值子程序/////
///////////////////////////
initial_d3()
{
//隐层权、阈值初始化//
	srand( (unsigned)time( NULL ) );

	for(int i=0;i<HN_d3;i++)
	{
		for(int j=0;j<IN_d3;j++)
			W_d3[i][j]= (double)((rand()/32767.0)*2-1); //初始化输入层到隐层的权值,-1到1之间的随机值	
	}
	for(int ii=0;ii<ON_d3;ii++)
	{
		for(int jj=0;jj<HN_d3;jj++)
			V_d3[ii][jj]= (double)((rand()/32767.0)*2-1); //初始化隐层到输出层的权值,-1到1之间的随机值	
	}
	for(int k=0;k<HN_d3;k++)
	{
		sita_d3[k] = (double)((rand()/32767.0)*2-1);  //隐层阈值初始化 -1到1之间的随机值	
	}
	for(int kk=0;kk<ON_d3;kk++)
	{
		gama_d3[kk] = (double)((rand()/32767.0)*2-1); //输出层阈值初始化 ,-1到1之间的随机值	
	}
  return 1;
}//子程序initial()结束

////////////////////////////////
////第m个学习样本输入子程序///
///////////////////////////////
input_P_d3(int m)
{
  int i;
  for(i=0;i<IN_d3;i++)
  P_d3[i]=Study_Data_d3[m].input[i];
return 1;
}//子程序input_P(m)结束
/////////////////////////////
////第m个样本教师信号子程序//
/////////////////////////////
input_T_d3(int m)
{
 int k;
 for(k=0;k<ON_d3;k++)
 T_d3[k]=Study_Data_d3[m].teach[k];
 return 1;
}//子程序input_T(m)结束

/////////////////////////////////
//隐层各单元输入、输出值子程序///
/////////////////////////////////
H_I_O_d3()
{
double sigma;
int i,j;
for (j=0;j<HN_d3;j++)
{ 
 sigma=0.0;
 for (i=0;i<IN_d3;i++)
  sigma+=W_d3[j][i]*P_d3[i];//求隐层内积
 X_d3[j]=sigma+sita_d3[i];//求隐层净输入
 H_d3[j]=1.0/(1.0+exp(-X_d3[j]));//求隐层输出
}
return 1;
}//子程序H_I_O()结束
///////////////////////////////////
//输出层各单元输入、输出值子程序///
///////////////////////////////////
O_I_O_d3()
{
 int k,j;
 double sigma;
  for(k=0;k<ON_d3;k++)
  {
	sigma=0.0;
    for (j=0;j<HN_d3;j++)
      sigma+=V_d3[k][j]*H_d3[j];//求输出层内积
    Y_d3[k]=sigma+gama_d3[k]; //求输出层净输入
    O_d3[k]=1.0/(1.0+exp(-Y_d3[k]));
  }
return 1;
}//子程序O_I_O()结束

////////////////////////////////////
/////求输出误差、各样本平方误差/////
////////////////////////////////////  
  Err_yangben_d3(int m)
   {    
    double abs_err[ON_d3];  //每个样本的绝对误差都是从0开始的
    double sqr_err=0;   //每个样本的平方误差计算都是从0开始的
    for (int k=0;k<ON_d3;k++)
	{    
	  err_O_d3[m][k]=T_d3[k]-O_d3[k];
	  abs_err[k]=T_d3[k]-O_d3[k];	  
      sqr_err+=(abs_err[k])*(abs_err[k]);//求第m个样本下输出层的平方误差
    } 
    err_m_d3[m]=sqr_err;   
   return 1;
  }//子程序Err_yangben(m)结束

  /////////////////////////////////
  //N个样本的全局误差计算子程序////
  /////////////////////////////////
  double Err_Sum_d3()
  {
   double total_err=0;
   int m;
   for (m=0;m<N_d3;m++) 
   total_err+=err_m_d3[m];//每个样本的均方误差加起来就成了全局误差 
   return total_err;
  }//子程序Err_sum()结束

////////////////////////////////////
//////////////求LM敏感度////////////
////////////////////////////////////

Err_O_H_s_d3()
{
  int k;
  for (k=0;k<ON_d3;k++)
  {  
   s2_d3[k]=-O_d3[k]*(1.0-O_d3[k]);   //敏感度s2   
  }
 return 1;
}//子程序Err_O_H_s(m)结束

Err_H_I_s_d3()
{
   int j,k;
   double sigma;
   
   for (j=0;j<ON_d3;j++) 
   { 
	 sigma=0.0;     
     for (k=0;k<HN_d3;k++) 
	 {  
	   sigma=(H_d3[k]*(1.0-H_d3[k]))*V_d3[j][k];   
	   s1_d3[k]=sigma*s2_d3[j];             //敏感度s1     
     }
   }

   return 1;
}//子程序Err_H_I_s_c()结束

////////////////////////////////////
/////////////求雅可比矩阵///////////
////////////////////////////////////
qiuyacobi_d3(int m)         //求雅可比矩阵各元素
{
  int i,j,jj;
    jj=0;
    
    for(i=0;i<HN_d3;i++)                        
	 {
      for(j=0;j<IN_d3;j++)
		{ 
		  yacobi_d3[m][jj]=s1_d3[i]*P_d3[j];
	      jj=jj+1;
		}
      yacobi_d3[m][jj]=s1_d3[i];			
	  jj=jj+1;
     }

    for(j=0;j<ON_d3;j++)
	 {
	  for(i=0;i<HN_d3;i++)
	    {
		 yacobi_d3[m][jj]=s2_d3[j]*H_d3[i];
         jj=jj+1;
	    }
      yacobi_d3[m][jj]=s2_d3[j];                    
	  jj=jj+1;
     } 
  return 1;
 } 

        //////////////////////////////////////////  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -