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

📄 bp_learnfunction.cpp

📁 用神经网络对系统辨识(BP网络)。此程序为c语言和matlab混和编程
💻 CPP
字号:
#include  <stdlib.h>
#include  <math.h>

#include  "bp.h"
#include  "bp_learnfunction.h"


//调用rand函数来初始化权重系数
void Random( double referArray[][MAXDIMREFER][MAXDIMREFER] )
{
	for( int i = 0; i < PRERANDOM; i++ )//改变PRERANDOM(bp.h中)的值来改变权重系数的初始值
	rand();

	for( int rank = 0; rank < RANK; rank++ )
        for( int dim1 = 0; dim1 < MAXDIMREFER; dim1++ )
			for( int dim2 = 0; dim2 < MAXDIMREFER; dim2++ )
				referArray[rank][dim1][dim2] =(  ( double )rand() - RAND_MAX/2  )/ RAND_MAX * 2 ;//系数值为-1到1之间	
}


//初始化各权重系数增量为0
void Zero( double incReferArray[][MAXDIMREFER][MAXDIMREFER] )
{
	for( int rank = 0; rank < RANK; rank++ )
        for( int dim1 = 0; dim1 < MAXDIMREFER; dim1++ )
			for( int dim2 = 0; dim2 < MAXDIMREFER; dim2++ )
				incReferArray[rank][dim1][dim2] = 0;	
}


//求BP网络各层输出
void GetTheOut( int rank, double referArray[][MAXDIMREFER][MAXDIMREFER], double out[][MAXDIMREFER] )
{
	double u;

	if( rank == 1 )
	{
		out[rank][0] = 1; 
		for( int dimRefer1A = 1; dimRefer1A <= DIMREFER1; dimRefer1A++ )
		{   
			u = 0;
            for( int dimXB = 0; dimXB <= DIMX; dimXB++ )		
				u += referArray[rank][dimRefer1A][dimXB]  *  out[rank-1][dimXB] ;
            out[rank][dimRefer1A] = G(u);
		}
	}
	if(  rank == ( RANK - 1)  )
	{
		for( int dimY = 0; dimY < DIMY ; dimY++ )
		{
			u = 0;
            for( int dimRefer1B = 0; dimRefer1B <= DIMREFER1; dimRefer1B++ )		
				u += referArray[rank][dimY][dimRefer1B]*out[rank-1][dimRefer1B];//最后一层输出为y
			out[rank][dimY] = G(u);
		}

	}
}


//反相计算各层梯度
void GetTheErr( int rank, double referArray[][MAXDIMREFER][MAXDIMREFER], double out[][MAXDIMREFER],  double e[][MAXDIMREFER], double yArray[][DIMY], int learn )
{
    if( rank == RANK - 1 )//输出层
	{
		for( int dimYA = 0; dimYA < DIMY; dimYA++ )
			e[rank][dimYA] = (yArray[learn][dimYA] - out[rank][dimYA] ) * CONFACTOR * out[rank][dimYA]*( 1 - out[rank][dimYA] );
	}
	if( rank == RANK - 2 )
	{
		for( int dimRefer1 = 0; dimRefer1 <= DIMREFER1; dimRefer1++ )
		{
			e[rank][dimRefer1] = 0;
		    for( int dimYB = 0; dimYB < DIMY; dimYB++ )
			    e[rank][dimRefer1] += e[rank+1][dimYB] * referArray[rank+1][dimYB][dimRefer1];

		    e[rank][dimRefer1] *= CONFACTOR * out[rank][dimRefer1] * (1 - out[rank][dimRefer1] );
		}
	}
} 




void ModifyRefer( int rank, double referArray[][MAXDIMREFER][MAXDIMREFER], double out[][MAXDIMREFER], double e[][MAXDIMREFER], double yArray[][DIMY], double incReferArray[][MAXDIMREFER][MAXDIMREFER] )
{
    if( rank == 1 )//第1层 (隐层) 
	{	
		for( int dimRefer1A = 0; dimRefer1A <= DIMREFER1; dimRefer1A++ )
			for( int dimX = 0; dimX <= DIMX; dimX++ )
			{
				incReferArray[rank][dimRefer1A][dimX] = 
				STEPLENGTH * e[rank][dimRefer1A] * out[rank-1][dimX] + INERTIA * incReferArray[rank][dimRefer1A][dimX];

			    referArray[rank][dimRefer1A][dimX] += incReferArray[rank][dimRefer1A][dimX];
			}
	}
	if( rank == RANK-1 )//输出层
	{
		for( int dimY = 0; dimY < DIMY; dimY++ )
			for( int dimRefer1B = 0; dimRefer1B <= DIMREFER1; dimRefer1B++ )
			{
				incReferArray[rank][dimY][dimRefer1B] = 
				STEPLENGTH * e[rank][dimY] * out[rank-1][dimRefer1B] + INERTIA * incReferArray[rank][dimY][dimRefer1B];
   				
				referArray[rank][dimY][dimRefer1B] += incReferArray[rank][dimY][dimRefer1B];

			}
	}


}


//计算指标函数值
double GetThePowE(double  yArray[][DIMY], double out[][MAXDIMREFER], int learn )
{
    double e;

	e = 0;

    for( int dimY = 0; dimY < DIMY; dimY++ )
	{
		e += ( yArray[learn][dimY] - out[RANK-1][dimY] ) * ( yArray[learn][dimY] - out[RANK-1][dimY] );	
	}

	return  0.5 * e;
}

//对训练后的BP网络,由输入求解输出
void GetYValue( double xArray[DIMX], double yArray[DIMY], double referArray[][MAXDIMREFER][MAXDIMREFER] )
{
	double out[RANK][MAXDIMREFER];
    
	out[0][0] = 1;

	for( int dimXA = 1; dimXA <= DIMX; dimXA++ )
		out[0][dimXA] = xArray[dimXA - 1];    

    for( int rankA = 1; rankA < RANK; rankA++ )
        GetTheOut( rankA, referArray, out );

	for( int dimY = 0; dimY < DIMY; dimY++ )
		yArray[dimY] = out[2][dimY];
}

⌨️ 快捷键说明

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