欢迎访问:常州市武进区嘉泽中心小学网站 !今天是:
栏目列表
您现在的位置是:首页>>教师>>计算机技术>>程序设计>>杂项>>文章内容
bp网络算法对y=0.4sin(2*PI*x)+0.5的拟合
发布时间:2008-11-20   点击:   来源:本站原创   录入者:佚名
 
B-P算法对函数y=0.4sin(2*PI*x)+0.5的拟合







#include



#include



#include



#define M 8 //隐节点个数



#define N 20 //学习样本个数



#define PI 3.14159



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



static float x[N]; //x输入



static float y[N]; //y输出



static float t[N]; //t教师



static float h[M][N]; // 记录隐单元的输出



static float b[N]; //输出误差



static float b1[M][N]; //记录隐单元误差



float w1[M]={0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8}; //输入与第一隐层的权



float w2[M]={0.8,0.7,0.6,0.5,0.4,0.3,0.2,0.1}; //第一隐层与输出层的权



float q[M]={0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8}; //第一隐层的阈值



float p=0.3; //输出层的阈值



float r=0.2; //步长



int n=0; //记录训练次数



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



float f(float u)



{



return 1/(1+exp(-u));



}



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



//赋值函数



void fuzhi(void)



{



int k;



for(k=0;k x[k]=(float)k/20; // 输入值



for(k=0;k {



t[k]=0.4*sin(2*PI*x[k])+0.5; //计算教师的值



cout<<"x["< }



}



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



//计算隐单元输出,输出单元



void jisuan(void)



{



int i,j;



static float a[N]; //存放中间结果



for( i=0;i for( j=0;j h[i][j]=f(w1[i]*x[j]-q[i]); //计算隐单元输出



for(j=0;j {



a[j]=0; //注意初值



for(i=0;i a[j]+=w2[i]*h[i][j];



y[j]=f(a[j]-p);



}







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



//计算误差



void wucha(void)



{



int i,j;



for( j=0;j b[j]=y[j]*(1-y[j])*(t[j]-y[j]); //输出



for( i=0;i for(j=0;j b1[i][j]=b[j]*w2[i]*h[i][j]*(1-h[i][j]);//隐单元



}



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



//权的修改



void xiugai(void)



{



float c,d; //临时变量



int i,j;



for( i=0;i {



c=0;



for( j=0;j c+=b[j]*h[i][j];



w2[i]+=r*c;



}



c=0;



for(j=0;j c+=b[j]*(-1);



p+=c*r;



for(i=0;i {



c=0;



d=0;



for(j=0;j {



c+=b1[i][j]*x[j];



d+=b1[i][j]*(-1);



}



w1[i]+=r*c;



q[i]+=r*d;



}



}



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



//计算输出的总误差



float shuchu(void)



{



float E=0;



for(int j=0;j E+=(t[j]-y[j])*(t[j]-y[j]);



return E;



}



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



//主函数



void main()



{



char s;



float Ez;



fuzhi();



do{ ++n;



jisuan();



wucha();



xiugai();



Ez=shuchu();cout< } while(Ez/2>0.01);



// for(int j=0;j // cout<<"y["< cin>>s;



}



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




附件:
    关闭窗口
    打印文档
    账号登录
    保持登录 忘记密码?
    账号与武进教师培训平台同步