共轭梯度法c++程序

上传人:M****1 文档编号:489042801 上传时间:2022-12-16 格式:DOCX 页数:6 大小:22.61KB
返回 下载 相关 举报
共轭梯度法c++程序_第1页
第1页 / 共6页
共轭梯度法c++程序_第2页
第2页 / 共6页
共轭梯度法c++程序_第3页
第3页 / 共6页
共轭梯度法c++程序_第4页
第4页 / 共6页
共轭梯度法c++程序_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《共轭梯度法c++程序》由会员分享,可在线阅读,更多相关《共轭梯度法c++程序(6页珍藏版)》请在金锄头文库上搜索。

1、最优化课程设计题目:共轭梯度法姓 名:田鑫指导老师:智红英学号:201118030216班级:信息与计算科学111802班共轭梯度法(Conjugate Gradient)是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但 克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并 求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解 大型非线性最优化最有效的算法之一。在各种优化算法中,共轭梯度法是非常 重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任 何外来参数。设我们要求解下列线性系统其中n-X-n矩阵A是对称的(也即

2、,At = A),正定的(也即,xtAx 0对于 所有非0向量x属于Rn),并且是实系数的。将系统的唯一解记作x。*最后算法经过一些简化,可以得到下列求解Ax = b的算法,其中A是实对称正定矩阵。x := 00k := 0r := b0repeat until r is sufficiently small:k := k + 1if k = 1p1elseend ifx :二 x + a pkk-1k kr := r -a Apkk-1k kend repeat 结果为xk共轭梯度法程序源代码#include #include#define N 10#define eps pow(10,-6

3、) double f(double x,double p,double t) double s; s=pow(x0+t*p0,2)+25*pow(x1+t*p1,2); return s; /*以下是进退法搜索区间源程序*/ void sb(double *a,double *b,double x,double p) double t0,t1,t,h,alpha,f0,f1;int k=0;t0=2.5; /*初始值*/ h=1;/*初始步长*/alpha=2; /*加步系数*/ f0=f(x,p,t0);t1=t0+h;f1=f(x,p,t1);while(1)if(f1f0)h=alpha

4、*h; t=t0;t0=t1; f0=f1;k+;elseif(k=0)h=-h;t=t1;else*a=tt1?t:t1;break;t1=t0+h;f1=f(x,p,t1);/*以下是黄金分割法程序源代码*/double hjfg(double x,double p)double beta,t1,t2,t;double f1,f2;double a=0,b=0;double *c,*d;c=&a,d=&b;sb(c,d,x,p);/*调用进退法搜索区间*/printf(nx1=%f,x2=%f,p1=%f,p2=%f,x0,x1,p0,p1); printf(na,b=%f,%f,a,b)

5、;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;elseif(f1f2)t=(t1+t2)/2;b=t2; t2=t1;f2=f1; t1=a+b-t2; f1=f(x,p,t1);elsea=t1; t1=t2;f1=f2; t2=a+beta*(b-a);f2=f(x,p,t2); t=(t1+t2)/2; return t;/*以下是共轭梯度法程序源代码*/void gtd()double xN,gN,pN,t=0,f0,mod

6、1=0,mod2=0,nanda=0;int i,k,n;printf(请输入函数的元数值n=2);scanf(%d,&n);printf(n请输入初始值:2,2);for(i=0;i0)p0=-g0; pl=-gl; k=0;while(l)t=hjfg(x,p);/*调用黄金分割法求t的值*/ printf(npl=%f,p2=%f,t=%f,p0,pl,t);x0=x0+t*p0; xl=xl+t*pl; g0=2*x0;gl=50*xl;/*printf(nxl=%f,x2=%f,gl=%f,g2=%f,x0,xl,g0,gl);*/ mod2=sqrt(pow(g0,2)+pow(g

7、l,2); /*求梯度的长度*/ if(mod2=0) break; else if(k+1=n) g0=2*x0; g1=50*x1; p0=-g0; p1=-g1; k=0;else nanda=pow(mod2,2)/pow(mod1,2); printf(nnanda=%f,mod=%f,nanda,mod2); p0=-g0+nanda*p0; p1=-g1+nanda*p1;mod1=mod2; k+; printf(n); printf(n 最优解为 x1=%f,x2=%f,x0,x1); printf(n 最终的函数值为%f,f(x,g,t);main()gtd();运行结果如

8、下:请输入函数的元数值 n=2请输入初始值:2 2 x1=2.000000,x2=2.000000,p1=-4.000000,p2=-100.000000 a,b=-4.500000,1.500000p1=-4.000000,p2=-100.000000,t=0.020030 nanda=0.001474,mod=3.842730 x1=1.919879,x2=-0.003022,p1=-3.845655,p2=0.003665a,b=-4.500000,1.500000p1=-3.845655,p2=0.003665,t=0.499240 x1=-0.000026,x2=-0.001192,

9、p1=0.000052,p2=0.059610a,b=-4.500000,1.500000p1=0.000052,p2=0.059610,t=0.020000nanda=0.000000,mod=0.000050 x1=-0.000025,x2=-0.000000,p1=0.000050,p2=0.000001a,b=-4.500000,1.500000p1=0.000050,p2=0.000001,t=0.495505 x1=-0.000000,x2=0.000000,p1=0.000000,p2=-0.000023a,b=-4.500000,1.500000p1=0.000000,p2=-0.000023,t=0.020007最优解为 x1=-0.000000,x2=-0.000000最终的函数值为 0.000000

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号