资源描述:
《共轭梯度法c++程序》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、最优化课程设计题目:共轭梯度法姓名:田鑫指导老师:智红英学号:201118030216班级:信息与计算科学111802班共轭梯度法(ConjugateGradient)是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。设我们要求解下列线性系统其中n-×-n矩阵A是对称的
2、(也即,AT=A),正定的(也即,xTAx>0对于所有非0向量x属于Rn),并且是实系数的。将系统的唯一解记作x*。最后算法经过一些简化,可以得到下列求解Ax=b的算法,其中A是实对称正定矩阵。x0:=0k:=0r0:=brepeatuntilrkis"sufficientlysmall":k:=k+1ifk=1p1:=r0elseendifxk:=xk-1+αkpkrk:=rk-1-αkApkendrepeat结果为xk共轭梯度法程序源代码#include#include#defineN10#defineepspow(10,-6)doub
3、lef(doublex[],doublep[],doublet){doubles;s=pow(x[0]+t*p[0],2)+25*pow(x[1]+t*p[1],2);returns;}/*以下是进退法搜索区间源程序*/voidsb(double*a,double*b,doublex[],doublep[]){doublet0,t1,t,h,alpha,f0,f1;intk=0;t0=2.5; /*初始值*/h=1; /*初始步长*/alpha=2; /*加步系数*/f0=f(x,p,t0);t1=t0+h;f1=f(x,p,t1);while(1){
4、 if(f1t1?t:t1; break; } } t1=t0+h; f1=f(x,p,t1);}}/*以下是黄金分割法程序源代码*/doublehjfg(doublex[],doublep[]){doublebeta,t1,t2,t;doublef1,f2;doublea=0,b=0;double*c,*
5、d;c=&a,d=&b;sb(c,d,x,p);/*调用进退法搜索区间*/printf("x1=%f,x2=%f,p1=%f,p2=%f",x[0],x[1],p[0],p[1]);printf("[a,b]=[%f,%f]",a,b);beta=(sqrt(5)-1.0)/2;t2=a+beta*(b-a);f2=f(x,p,t2);t1=a+b-t2; f1=f(x,p,t1);while(1){ if(fabs(t1-t2)<0) break; else { if(f16、 t2=t1; f2=f1; t1=a+b-t2; f1=f(x,p,t1); } else { a=t1; t1=t2; f1=f2; t2=a+beta*(b-a); f2=f(x,p,t2); } }}t=(t1+t2)/2;returnt;}/*以下是共轭梯度法程序源代码*/voidgtd(){doublex[N],g[N],p[N],t=0,f0,mod1=0,mod2=0,nanda=0;inti,k,n;printf("请输入函数的元数值n=2"
7、);scanf("%d",&n);printf("请输入初始值:2,2");for(i=0;i0){ p[0]=-g[0];p[1]=-g[1];k=0; while(1) { t=hjfg(x,p);/*调用黄金分割法求t的值*/ printf("p1=%f,p2