资源描述:
《最速下降法 C语言》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、1.最速下降法#include"stdio.h"#include"math.h"doublefun1(doublex1,doublex2)/*定义函数fun1为目标函数*/{doubley;y=x1*x1-2*x1*x2+4*x2*x2+x1-3*x2;returny;}voidmain(){doublet,x1=1,x2=1,e=0.01,g[2],y,m;intk=1;/*定义起始点为x1=0,x2=1,并定义精度为e=0.01*/g[0]=2*x1-2*x2+1;/*目标函数对x1求偏导*/g[1]=(-2)*x1+8*x2-3;/*目标函数对x2求偏导*/
2、m=(sqrt(g[0]*g[0]+g[1]*g[1]));/*对g[0]*g[0]+g[1]*g[1]求开方,将值赋给m*/while(m>e&&k<=200)/*判断,当m>e时进行以下循环*/{t=((2*g[1]-2*g[0])*x1+(2*g[0]-8*g[1])*x2-g[0]+3*g[1])/(4*g[0]*g[1]-2*g[0]*g[0]-8*g[1]*g[1]);/*根据梯度法(最速下降法),利用梯度和海赛矩阵*/x1=x1-g[0]*t;/*求步长t。根据步长和梯度方向求出新的x1,x2*/x2=x2-g[1]*t;printf("迭代次数%d
3、",k);printf("搜索方向-%f,-%f,负梯度的模%f,步长%f",g[0],g[1],m,t);printf("x的值%f,%f",x1,x2);g[0]=2*x1-2*x2+1;g[1]=(-2)*x1+8*x2-3;m=(sqrt(g[0]*g[0]+g[1]*g[1]));/*计算新的m*/printf("新的负梯度的模%f",m);k++;}y=fun1(x1,x2);/*当m不满足m>e的时候退出循环,并计算fun1,*/printf("分别输出x1,x2%f,%f",x1,x2);/*将值赋给y,并输出。*/printf
4、("极小值y%f",y);}2.FR共轭梯度法#include"stdio.h"#include"math.h"doublefun1(doublex1,doublex2)/*定义函数fun1为目标函数*/{doubley;y=x1*x1-2*x1*x2+4*x2*x2+x1-3*x2;returny;}doublefun2(doubleg[],doubled[])/*定义函数fun2为求步长的函数*/{doublebuchang;buchang=-(g[0]*d[0]+g[1]*d[1])/(d[0]*(2*d[0]-2*d[1])+d[1]*((-2)*d[0]
5、+8*d[1]));returnbuchang;}voidmain(){doublet,beta,x1=1,x2=1,d[2],g[4],y,m,e=0.01;/*定义起始点为x1=0,x2=1,并定义精度为e=0.01*/intk=1;g[0]=2*x1-2*x2+1;/*目标函数对x1求偏导*/g[1]=(-2)*x1+8*x2-3;/*目标函数对x2求偏导,求梯度*/m=(sqrt(g[0]*g[0]+g[1]*g[1]));/*对g[0]*g[0]+g[1]*g[1]求开方,将值赋给m*/while(m>e&&k<=200)/*判断,当m>e时进行以下循环
6、*/{if(k==1){d[0]=-g[0];d[1]=-g[1];beta=0;}/*计算因子beta*/else{beta=(g[0]*g[0]+g[1]*g[1])/(g[2]*g[2]+g[3]*g[3]);/*计算因子beta*/d[0]=-g[0]+beta*d[0];d[1]=-g[1]+beta*d[1];}t=fun2(g,d);/*计算步长*/x1=x1+d[0]*t;/*根据步长和搜索方向求出新的x1,x2*/x2=x2+d[1]*t;printf("迭代次数为%d",k);printf("梯度%f,%f,梯度的模%f",g[0],g
7、[1],m);printf("搜索方向%f,%f,计算因子%f,步长%f",d[0],d[1],beta,t);printf("x的值%f,%f",x1,x2);g[2]=g[0];g[3]=g[1];g[0]=2*x1-2*x2+1;/*根据得到的x1,x2求出新的梯度,并将值*/g[1]=(-2)*x1+8*x2-3;/*赋给g[0],g[1],*/m=double(sqrt(g[0]*g[0]+g[1]*g[1]));/*计算新的m*/printf("新的负梯度的模%f",m);k++;}y=fun1(x1,x2);/*当m不满足m>e的时候退出
8、循环,并计