共轭梯度法程序及调试结果分析
运筹学实验报告(F-R共轭梯度法、Wolfe简约梯度法)

一、实验目的:1、掌握求解无约束最优化问题的 F-R 共轭梯度法,以及约束最优化问题 Wolfe 简约梯度法。
2、学会用MATLAB 编程求解问题,并对以上方法的计算过程和结果进行分析。
二、实验原理与步骤: 1、F-R 共轭梯度法基本步骤是在点)(k X 处选取搜索方向)(k d , 使其与前一次的搜索方向)1(-k d关于A 共轭,即(1)()(1),0k k k d d Ad --<>=然后从点)(k X 出发,沿方向)(k d 求得)(X f 的极小值点)1(+k X ,即)(m in )()()(0)1(k d X f X f k k λλ+=>+如此下去, 得到序列{)(k X }。
不难求得0,)1()(>=<-k k Ad d的解为)()1()1()()()()1(,,k k k k k k k d Ad d d AX b XX><>-<+=--+注意到)(k d 的选取不唯一,我们可取)1(1)()()(--+-∇=k k k k d X f d β由共轭的定义0,)1()(>=<-k k Add 可得: ><><-=----)1()1()1()(1,,k k k k k Ad d Ad r β共轭梯度法的计算过程如下:第一步:取初始向量)0(X , 计算⎪⎪⎩⎪⎪⎨⎧+=><><-=-=-∇==(0)0(0)(1))0()0()0()0(0(0)(0)(0)(0)d X X ,,X )X (r d λλAd d Ad r A b f第1+k 步:计算⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎨⎧+=><><-=+=><><-=-=-∇=+------(k)0(k)1)(k )()()()()1(1(k))()1()1()1()(1(k)(k)(k)d X X ,,r ,,X )X (r λλββk k k k k k k k k k k k k Ad d Ad r d d Ad d Adr A b f2、Wolfe 简约梯度法Wolfe 基本计算步骤:第一步:取初始可行点 x 0∈X l ,给定终止误差ε>0 ,令k:=0;第二步:设 I B k是x k 的 m 个最大分量的下标集,对矩阵A 进行相应分解 A =(B k ,N k );第三步:计算 ∇f(x k)=(∇B f(x k )∇Nf(x k )) ,然后计算简约梯度r N k=−(B k −1N k )T ∇B f(x k )+∇N f(x k );第四步:构造可行下降方向 p k . 若||p k ||≤ε ,停止迭代,输出x k 。
共轭梯度法求线性方程组的解matlab程序资料讲解

r0=r;
ห้องสมุดไป่ตู้喜欢□一般□不喜欢□end
二、在命令窗体中输入参数a、b、c、x0以及x=cg(a,b,c,x0),即可求出线性方程组的解。
9、如果你亲戚朋友送你一件DIY手工艺制品你是否会喜欢?m(k+1)=r'*r/(d'*a*d);
x=x+m(k+1)*d;
但这些困难并非能够否定我们创业项目的可行性。盖茨是由一个普通退学学生变成了世界首富,李嘉诚是由一个穷人变成了华人富豪第一人,他们的成功表述一个简单的道理:如果你有能力,你可以从身无分文变成超级富豪;如果你无能,你也可以从超级富豪变成穷光蛋。r=b-a*x;
c=10^(-3);
end
r0=b-a*x0;
r=r0;
d=r0;
3.www。oh/ov。com/teach/student/shougong/m=zeros(n,1);
1996年“碧芝自制饰品店”在迪美购物中心开张,这里地理位置十分优越,交通四通八达,由于位于市中心,汇集了来自各地的游客和时尚人群,不用担心客流量的问题。迪美有300多家商铺,不包括柜台,现在这个商铺的位置还是比较合适的,位于中心地带,左边出口的自动扶梯直接通向地面,从正对着的旋转式楼梯阶而上就是人民广场中央,周边4、5条地下通道都交汇于此,从自家店铺门口经过的90%的顾客会因为好奇而进去看一下。p=zeros(n,1);
原创力文档是网络服务平台方若您的权利被侵害侵权客服qq
一、函数代码:
functionx=cg(a,b,c,x0)注释: ax=b;c表示误差精度;x0表示初始向量,c和x0均可省略,但如果c省略了,则x0必须省略。
共轭梯度法程序

一、共轭梯度法共轭梯度法(Conjugate Gradient)是共轭方向法的一种,因为在该方向法中每一个共轭向量都是依靠赖于迭代点处的负梯度而构造出来的,所以称为共轭梯度法。
由于此法最先由Fletcher和Reeves (1964)提出了解非线性最优化问题的,因而又称为FR 共轭梯度法。
由于共轭梯度法不需要矩阵存储,且有较快的收敛速度和二次终止性等优点,现在共轭梯度法已经广泛地应用于实际问题中。
共轭梯度法是一个典型的共轭方向法,它的每一个搜索方向是互相共轭的,而这些搜索方向d仅仅是负梯度方向与上一次迭代的搜索方向的组合,因此,存储量少,计算方便,效果好。
二、共轭梯度法的原理设有目标函数f(X)=1/2X T HX+b T X+c 式1 式中,H作为f(X)的二阶导数矩阵,b为常数矢量,b=[b1,b2,b3,...b n]T 在第k次迭代计算中,从点X(k)出发,沿负梯度方向作一维搜索,得S(K)=-∆f(X(k))式2 X(k+1)=X(k)+ɑ(k)S(k) 式3在式中,ɑ(k)为最优步长。
设与S(k)共轭的下一个方向S(k+1)由点S(k)和点X(k+1)负梯度的线性组合构,即S (k+1)=-∆f (X (k+1))+β(k)S (k) 式4 根据共轭的条件有[S (k)]T ∆2f (X (k))S (k+1)=0 式5 把式2和式4带入式5,得-[∆f(X (k))]T ∆2f (X (k))[-∆f (X (k+1))+β(k)S (k) ]=0 式6 对于式1,则在点X (k)和点X (k+1)的梯度可写为∆f(X (k))=HX (k)+b 式7 ∆f (X (k+1))=HX (k+1)+b 式8 把上面两式相减并将式3代入得ɑ(k)H S (k)=∆f (X (k+1))-∆f(X (k)) 式9 将式4和式9两边分别相乘,并代入式5得-[∆f (X (k+1))+β(k)∆f(X (k))]T [∆f (X (k+1))-∆f(X (k)]=0 式10 将式10展开,并注意到相邻两点梯度间的正交关系,整理后得 β(k )=22||))((||||))1((||k X f k X f ∆+∆ 式11把式11代入式4和式3,得 S (k+1)=-∆f (X (k))+β(k )S (k )X (k+1)=X (k )+ɑ(k )S (k )由上可见,只要利用相邻两点的梯度就可以构造一个共轭方向。
共轭梯度法实验报告

共轭梯度法实验报告
实验报告:共轭梯度法
引言:
实验目的:
1.了解共轭梯度法的基本原理和步骤;
2.掌握共轭梯度法的具体实现方法;
3.比较共轭梯度法和其他方法的解的精确度和收敛速度;
4.验证共轭梯度法在求解大规模线性方程组中的优势。
实验步骤:
1.阐述共轭梯度法的原理和步骤;
2.设定一个线性方程组,并使用共轭梯度法进行求解;
3.通过计算实验结果与理论结果的误差,评估共轭梯度法的精确度;
4.将共轭梯度法与其他迭代方法进行对比,分析其收敛速度;
5.设定一个大规模的线性方程组,比较共轭梯度法在求解大规模方程组时的性能。
实验结果与分析:
根据实验步骤中的设定,实验结果显示,共轭梯度法成功求解了所设定的线性方程组,并且与理论结果的误差很小,说明共轭梯度法的精确度很高。
此外,将共轭梯度法与其他迭代方法进行对比发现,共轭梯度法的
收敛速度相对较快,需要的迭代次数较少。
在求解大规模线性方程组时,共轭梯度法表现出了较大的优势,可以显著减少计算时间。
结论:
共轭梯度法是一种求解线性方程组的高效方法,其精确度和收敛速度优于其他迭代方法。
在实际应用中,共轭梯度法可以被广泛应用于求解大规模的线性方程组,提高计算效率。
值得指出的是,共轭梯度法在求解非对称方程组时效果不佳,需要使用相关的改进方法来解决。
因此,在实际使用共轭梯度法时,需根据方程组的特点来选择合适的方法。
2. Saad Y. Iterative methods for sparse linear systems [M]. SIAM, 200
3.。
运筹学实验共轭梯度法

共轭梯度法一、实验目的(1).熟悉使用共轭梯度法求解无约束非线性规划问题的原理;(2).在掌握原理的基础上熟练运用此方法解决问题;(3).学会利用计算机语言编写程序来辅助解决数学问题;(4).解决问题的同时分析问题,力求达到理论与实践的相统一;(5).编写规范的实验报告.二、问题描述自选初始点开始迭代三、算法介绍<算法原理>:共轭梯度法为求解线性方程组而提出。
后来,人们把这种方法用于求解无约束最优化问题,使之成为一种重要的最优化方法。
共轭梯度法的基本思想是把共轭性与最速下降方法相结合,利用已知点处的梯度构造一组共轭方向,并沿这组方向进行搜索,求出目标函数的极小点。
根据共轭方向的基本性质,这种方法具有二次终止性。
在各种优化算法中,共轭梯度法是非常重要的一种。
其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。
共轭方向无约束最优化方法的核心问题是选择搜索方向.在本次实验中,我们运用基于共轭方向的一种算法—共轭梯度法<算法流程图>:四、程序%¾«È·ÏßËÑË÷,ÌݶÈÖÕÖ¹×¼Ôòfunction [ m,k,d,a,X,g1,fv] = GETD( G,b,c,X,e,method)if nargin<6error('ÊäÈë²ÎÊý±ØÐëΪ6');endn=length(G);if n==2format long e%ratsyms x1x2f=1/2*[x1,x2]*G*[x1;x2]+b'*[x1;x2]+c;g=[diff(f,x1);diff(f,x2)];g1=subs(subs(g,x1,X(1,1)),x2,X(2,1));d=-g1;a=-(d'*g1)/(d'*G*d);% a=-((X(:,1)'*G*d+b'*d)/(d'*G*d)); a=g1(:,1)'*g1(:,1)/(d(:,1)'*G*d(:,1));X(:,2)=X(:,1)+a*d;g1=[g1 subs(subs(g,x1,X(1,2)),x2,X(2,2))];m1=norm(g1(:,1));m=norm(g1(:,2));i=2;k=zeros(1);switch methodcase'FR'while m>=ek(i-1)=(m/m1)^2;d(:,i)=-g1(:,i)+k(i-1)*d(:,i-1);a(i)=-(d(:,i)'*g1(:,i))/(d(:,i)'*G*d(:,i));%a1(i)=-((X(:,i)'*G*d(:,i)+b'*d(:,i))/(d(:,i)'*G*d(:,i)));a (i)=g1(:,i)'*g1(:,i)/(d(:,i)'*G*d(:,i));X(:,i+1)=X(:,i)+a(i)*d(:,i);g1=[g1 subs(subs(g,x1,X(1,i+1)),x2,X(2,i+1))];m1=m;m=norm(g1(:,i+1));i=i+1;endcase'PRP'while m>=ek(i-1)=g1(:,i)'*(g1(:,i)-g1(:,i-1))/(norm(g1(:,i-1)))^2;d(:,i)=-g1(:,i)+k(i-1)*d(:,i-1);a(i)=-(d(:,i)'*g1(:,i))/(d(:,i)'*G*d(:,i));X(:,i+1)=X(:,i)+a(i)*d(:,i);g1=[g1 subs(subs(g,x1,X(1,i+1)),x2,X(2,i+1))];i=i+1;endcase'HS'while m>=ek(i-1)=g1(:,i)'*(g1(:,i)-g1(:,i-1))/(d(:,i-1)'*(g1(:,i)-g1(:,i-1))); d(:,i)=-g1(:,i)+k(i-1)*d(:,i-1);a(i)=-(d(:,i)'*g1(:,i))/(d(:,i)'*G*d(:,i));X(:,i+1)=X(:,i)+a(i)*d(:,i);g1=[g1 subs(subs(g,x1,X(1,i+1)),x2,X(2,i+1))];m=norm(g1(:,i+1));i=i+1;endcase'DY'while m>=ek(i-1)=g1(:,i)'*g1(:,i)/(d(:,i-1)'*(g1(:,i)-g1(:,i-1)));d(:,i)=-g1(:,i)+k(i-1)*d(:,i-1);a(i)=-(d(:,i)'*g1(:,i))/(d(:,i)'*G*d(:,i));X(:,i+1)=X(:,i)+a(i)*d(:,i);g1=[g1 subs(subs(g,x1,X(1,i+1)),x2,X(2,i+1))];m=norm(g1(:,i+1));i=i+1;endcase'LS'while m>=ek(i-1)=g1(:,i)'*(g1(:,i)-g1(:,i-1))/(d(:,i-1)'*(-g1(:,i-1)));d(:,i)=-g1(:,i)+k(i-1)*d(:,i-1);a(i)=-(d(:,i)'*g1(:,i))/(d(:,i)'*G*d(:,i)); %a(i)=-((X(:,i)'*G*d(:,i) +b'*d(:,i))/(d(:,i)'*G*d(:,i)));X(:,i+1)=X(:,i)+a(i)*d(:,i);g1=[g1 subs(subs(g,x1,X(1,i+1)),x2,X(2,i+1))];m=norm(g1(:,i+1));i=i+1;endcase'CD'while m>=ek(i-1)=g1(:,i)'*g1(:,i)/(d(:,i-1)'*(-g1(:,i-1)));d(:,i)=-g1(:,i)+k(i-1)*d(:,i-1);a(i)=-(d(:,i)'*g1(:,i))/(d(:,i)'*G*d(:,i));X(:,i+1)=X(:,i)+a(i)*d(:,i);g1=[g1 subs(subs(g,x1,X(1,i+1)),x2,X(2,i+1))];i=i+1;endcase'WYL'while m>=ek(i-1)=g1(:,i)'*(g1(:,i)-(m/m1)*g1(:,i-1))/(m1^2);d(:,i)=-g1(:,i)+k(i-1)*d(:,i-1);a(i)=-(d(:,i)'*g1(:,i))/(d(:,i)'*G*d(:,i)); %a(i)=-((X(:,i)'*G*d(:,i) +b'*d(:,i))/(d(:,i)'*G*d(:,i)));X(:,i+1)=X(:,i)+a(i)*d(:,i);g1=[g1 subs(subs(g,x1,X(1,i+1)),x2,X(2,i+1))];m1=m;m=norm(g1(:,i+1));i=i+1;endendfv=subs(subs(f,x1,X(1,i)),x2,X(2,i));endl1=X(1,i);l2=X(2,i);w1=X(1,1);w2=X(2,1);v1=min(l1,w1)-abs(l1-w1)/10:abs(l1-w1)/10:max(l1,w1)+abs(l1-w1)/10;v2=min(l2,w2)-abs(l2-w2)/10:abs(l2-w2)/10:max(l2,w2)+abs(l2-w2)/10; [x,y]=meshgrid(v1,v2);s=size(x);z=zeros(size(x));for i=1:s(1)for j=1:s(2)z(i,j)=1/2*[x(i,j),y(i,j)]*G*[x(i,j);y(i,j)]+b'*[x(i,j);y(i,j)]+c;endend[px,py] = gradient(z,.2,.2);contour(v1,v2,z), hold on, quiver(v1,v2,px,py)[C,h] = contour(x,y,z);set(h,'ShowText','on','TextStep',get(h,'LevelStep')*2)x1=X(1,:);y1=X(2,:);plot(x1,y1,'r*:');五、计算结果如图所示,输入>> G=[2,-1;-1,2];>> b=[2;-4];>> c=0;X=[1;1];e=1e-3;method='FR';表示正定矩阵为G,b为一次元系数矩阵,c为常数0,X是初始迭代点,e 为精度,method为共轭梯度的公式方法。
共轭梯度实验报告

共轭梯度实验报告共轭梯度实验报告引言:共轭梯度是一种常用的优化算法,广泛应用于数值计算和机器学习等领域。
本实验旨在探究共轭梯度算法的原理和应用,并通过实验验证其在解决线性方程组和最小二乘问题中的有效性和优越性。
一、共轭梯度算法的原理共轭梯度算法是一种迭代法,用于求解对称正定矩阵的线性方程组。
其基本思想是通过选择一组互相共轭的搜索方向,以最小化目标函数的二次型形式。
共轭梯度算法的核心步骤包括初始化、计算搜索方向、计算步长和更新解向量等。
二、共轭梯度算法在线性方程组求解中的应用共轭梯度算法在求解线性方程组方面具有独特的优势。
相比于传统的直接求解方法,共轭梯度算法不需要存储整个矩阵,仅需存储向量和少量中间变量,节省了内存空间。
同时,共轭梯度算法具有较快的收敛速度,能够在有限的迭代次数内得到较精确的解。
三、共轭梯度算法在最小二乘问题中的应用最小二乘问题是一类常见的优化问题,广泛应用于数据拟合和参数估计等领域。
共轭梯度算法在最小二乘问题中的应用主要体现在正规方程法和QR分解法的改进上。
通过共轭梯度算法,可以有效地求解最小二乘问题,得到更准确的拟合结果。
四、实验设计与结果分析本实验选择了一组线性方程组和最小二乘问题进行测试,分别使用共轭梯度算法和传统直接求解方法进行比较。
实验结果表明,共轭梯度算法在求解线性方程组和最小二乘问题时,具有更快的收敛速度和更高的精度。
尤其在大规模问题上,共轭梯度算法的优势更加明显。
结论:共轭梯度算法是一种有效的优化算法,适用于求解对称正定矩阵的线性方程组和最小二乘问题。
通过选择互相共轭的搜索方向,共轭梯度算法能够在有限的迭代次数内得到较精确的解。
在实际应用中,共轭梯度算法具有较快的收敛速度和较高的精度,是一种值得推广和应用的算法。
总结:通过本次实验,我们深入了解了共轭梯度算法的原理和应用,并通过实验验证了其在线性方程组和最小二乘问题中的有效性和优越性。
共轭梯度算法作为一种常用的优化算法,在数值计算和机器学习等领域具有广泛的应用前景。
共轭梯度算法分析与实现

共轭梯度算法分析与实现
梯度下降是一种常用的优化算法,用于求解优化问题。
它通过迭代的
方式不断沿着梯度的反方向更新参数,以最小化损失函数。
然而,梯度下
降算法在处理大规模数据时会变得非常慢,因为它需要计算全部训练样本
的梯度。
为了解决这个问题,共轭梯度算法被提出。
共轭梯度算法是一种适用于解决对称正定矩阵形式下的线性方程组的
优化算法。
它在每一步更新参数时,会按照预先选择好的方向进行更新。
这些方向通常是互相共轭的,这意味着每一个方向都是相对于其他方向来
说是正交的。
共轭梯度算法的原理是,通过每次迭代选择共轭方向来加速
梯度下降算法的收敛速度。
具体而言,共轭梯度算法中的每一步迭代可以分为四个部分:初始化、步长、更新参数和计算残差。
首先,在初始化阶段设定初始参数和初始残差,并选择一个适当的共轭方向。
然后,在步长阶段,通过线方法选择一
个合适的步长。
接下来,在更新参数阶段,根据步长和共轭方向更新参数。
最后,在计算残差阶段,计算新的残差,并检查是否达到停止条件。
如果
没有达到停止条件,那么就继续迭代进行和更新。
共轭梯度算法相对于梯度下降算法有几个优点。
首先,它不需要计算
全部训练样本的梯度,这样可以加速算法的收敛速度。
其次,它可以解决
对称正定矩阵形式下的线性方程组,这在很多实际问题中非常常见。
最后,共轭梯度算法在存储以及计算量上都比较少,所以可以处理大规模数据。
共轭梯度法求解线性方程组

实验1 共轭梯度法求解线性方程组1.算法原理2.程序框图3.程序使用说明。
本程序使用MATLAB来求解线性方程组Ax b源程序文件“gongetidu1.m”为共轭梯度法源程序,x为方程组的解,k为迭代次数,A为方程组的系数矩阵,b为方程组的右端项,ep为精度。
定义A, b,ep后,在命令窗口输入[x,k] = gongetidu1(A,b,ep),回车后即可算出方程组的解和迭代次数。
源程序文件“gongetidu2.m”为共轭梯度算例3.2中构造A,b矩阵的程序。
定义阶数n的数值后,在命令窗口输入[A,b] = gongetidu2(n)即可算出A, b矩阵。
4.算例计算结果此算例为课本113页计算实习3.2.首先,设定MATLAB的数值格式为“long”。
当n=100时,在命令窗口中输入“[A,b]=gongetidu2(100)”,回车后可得到A 和b的矩阵;假设精度ep = 10-3,然后在命令窗口输入“[x,k] = gongetidu1(A,b,10^-3)”即可算出方程组的解x和迭代次数k。
x=( 0.999999999999988,0.999999999999995,1.000000000000009,···0.9999 99999999997,0.999999999999998 )T(x向量一共有100个元素)k=49.同理,可以算出n=200,400的结果。
n=200时,同样假设精度ep = 10-3,结果为:x=( 0.999999999999974,1.000000000000023,0.999999999999935,···1.000000 000000029, 0.999999999999987)T (x向量一共有200个元素)k=99.n=400时,同样假设精度ep = 10-3,结果为:x=( 1.000000000000017,0.999999999999846,1.000000000000039,···0.99999999 9999881,1.000000000000062)T (x向量一共有400个元素)k=199。
共轭梯度法matlab程序

共轭梯度法matlab程序共轭梯度法是一种用于求解无约束优化问题的迭代算法。
以下是一个简单的MATLAB 程序示例,用于实现共轭梯度法:matlab复制代码function[x, fval, iter] = conjugate_gradient(A, b, x0, tol,max_iter)% A: 矩阵% b: 向量% x0: 初始解% tol: 容忍度% max_iter: 最大迭代次数r = b - A*x0;p = r;x = x0;fval = A*x - b;iter = 0;while (norm(r) > tol) && (iter < max_iter)Ap = A*p;alpha = dot(p, r) / dot(p, Ap);x = x + alpha*p;r = r - alpha*Ap;if iter == 0fval_new = dot(r, r);elsebeta = dot(r, r) / dot(p, Ap);p = r + beta*p;fval_new = dot(r, r);endif fval_new < fvalfval = fval_new;enditer = iter + 1;endend该程序接受一个矩阵A、一个向量b、一个初始解x0、一个容忍度tol和一个最大迭代次数max_iter作为输入,并返回最终解x、目标函数值fval和迭代次数iter。
使用该函数时,您需要将要优化的目标函数转换为矩阵形式,并调用该函数来找到最优解。
例如,假设您要最小化一个函数f(x),可以将该函数转换为矩阵形式A*x - b,其中A是目标函数的雅可比矩阵,b是目标函数的常数项向量。
然后,您可以调用该函数来找到最优解,例如:matlab复制代码A = jacobian(f); % 计算目标函数的雅可比矩阵b = [1, 2, 3]; % 目标函数的常数项向量x0 = [0, 0, 0]; % 初始解向量tol = 1e-6; % 容忍度max_iter = 1000; % 最大迭代次数[x, fval, iter] = conjugate_gradient(A, b, x0, tol, max_iter); % 调用共轭梯度法函数求解最优解。
共轭梯度算法分析与实现

编号:_ 09《最优化方法》课程设计题目:共轭梯度算法分析与实现院系:数学与计算科学学院专业:数学与应用数学姓名学号:指导教师:日期:2013 年12 月23 日摘要在最优化计算中,共轭梯度法是非常重要的一种方法。
共轭梯度法是一种改进的最速下降法,介于最速下降法与牛顿法之间的一种无约束优化算法,是为求解目标函数为二次函数的问题而设计的一类算法。
它利用目标函数的梯度逐步产生共轭方向并将其作为搜索方向的方法,收敛速度快。
共轭梯度法仅需利用一阶导数信息,避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,具有二次终止性。
关键词:共轭梯度法;牛顿法;二次函数;无约束优化AbstractIn the calculation of optimization method, conjugate gradient method is a very important one. The conjugate gradient method is a unconstrained optimization method between the steepest descent method and Newton method, and sove the objective function for the original quadratic function problems and design for a class of algorithm. Conjugate gradient method using only first derivative information, to avoid the Newton method requires storage and computing the inverse Hesse matrix and shortcomings, this method has the quadratic termination.Keywords: Conjugate gradient method; Newton method;Unconstrained optimization目录1、引言 (1)2、共轭梯度算法的描述 (1)2.1 无约束优化问题概述 (1)2.2 共轭方向 (1)2.3 共轭梯度法 (1)2.4 共轭梯度算法的步骤 (2)3、数值实验 (2)3.1 代码实现 (2)3.2 算法测试 (3)3.3 结果分析 (5)4、算法比较 (5)4.1 最速下降法描述 (6)4.1.1最速下降方向 (6)4.1.2 最速下降法 (6)4.2 最速下降法实现 (6)4.3 最速下降法测试 (7)4.4共轭梯度法与最速下降法比较 (8)5、总结 (8)5.1 总结概括 (8)5.2 个人感言 (9)6、参考文献: (9)1、引言共轭梯度法最早是由Hesternes 和Stiefle(1952)提出来的,用于解正定系数矩阵的线性方程组,在这个基础上,Fletcher 和Reeves(1964)首先提出了解非线性最优化问题的共轭梯度法。
第二节共轭梯度法

Page 1§3.4 共轭梯度法基本思想Page 2利用目标函数在当前迭代点处的负梯度方向与上一步的搜索方向的适当线性组合,构造下一步的搜索方向,要求这些搜索方向是一系列共轭方向。
由Taylor公式知,一个函数在一点附近的性态与二次函数是很接近的,因此,为了建立有效算法,往往选用二次模型,即先针对正定二次函数建立有效的算法,然后再推广到一般函数上去。
Page 3一、共轭方向及其性质注:若,Q I =则是正交的,因此共轭是正交的推广.定义1:如果:()0,T ij d Q d i j =≠则称m d d d ,,,21"是关于Q 共轭的.设m d d d ,,,21"是nR 中任一组非零向量,n nQ R×∈是n 阶实正定矩阵,Page 4定理1:设Q 为n 阶正定阵,非零向量组m d d d ,,,21"关于Q 共轭,则必线性无关.推论1:设Q 为n 阶正定阵,非零向量组n d d d ,,,21"关于Q 共轭,则它们构成nR 的一组基.n 则推论2:设Q 为阶正定阵,非零向量组n d d d ,,,21"关于Q 共轭.若向量v 与n d d d ,,,21"均正交,.0=vPage 5定理2:设为阶正定阵,向量组Q n 12,,kd d d "关于Q 共轭,对正定二次函数()12T Tf x x Qx b x c =++,由任意1x 开始,1,1,2,,i ii i xx d i k α+=+="则:(1)1()0,1,2,k T if x d i k+∇=="(2)当k n =时,1n x +为f(x)在n R 上的极小点.后得沿k 次精确线搜索依次进行i dPage 6启发:用迭代法求解正定二次函数极小:()12T TMin f x x Qx b x c=++转化为构造关于Q共轭的n个方向问题.如何构造n个关于Q共轭的方向?一种做法是借助迭代点处的负梯度方向来构造共轭梯度法Page 7二、求解正定二次函数的共轭梯度法令11(),.k k kk k df xd λλ++=−∇+为待定组合系数1()()()kTk k k T kd Q f x d Q dλ+∇=左乘(),kTd Q 并使1()0,kTk d Q d+=得:1. 构造共轭方向—用待定系数法1,:,k k kk k x x d αα+=+精确线搜得步长进而得索取:0()d f x =−∇令0;k =Page 8不仅如此, 还可以证明:1()0,1,2,,j Tk d Qdj k+=="12,,,nd d d "可见, 若中途不停机的话, 按上述方法得到的关于Q 是两两共轭的.n 个方向Page 92. 正定二次函数的共轭梯度法算法Step2:如果(),kf xε∇<停止迭代;令1.k k kk xx d α+=+Step3:令1,k k =+转Step2.0()()argmin ()()k T k k kk k T kd f x f x d d Qd ααα>∇=+=−否则沿精确线搜索求步长:kd 111()()(),()k T k k k kk k k T kd Q f xd f x d d Qdλλ+++∇=−∇+=其中并计算:Step1:给出0,(),01,0.nx R d f x k ε∈=−∇≤<<=Page 1012,,,nd d d "可以证明, 若中途不停机的话, 这样得到的关于Q 是两两共轭的.n 个方向再结合定理2, 因此1n x+一定是所求的最优解.3. 收敛性1()()()kTk k k T kd Q f x d Q dλ+∇=(Hestenes-Stiefel 公式)组合系数的选取:可见,该公式中里面含有Hessen矩阵Q, 不能直接应用于求解一般非正定二次函数情形.Page 114. 组合系数的其他形式(1)FR 公式212()()k k kf xf x λ+∇=∇(1964)(2)DM 公式21()-()()k k k Tkf xd f x λ+∇=∇(Fletcher-Reeves 公式)(Dixon-Myers 公式)Page 12组合系数的其他形式(3)PRP 公式()12()()()()k Tk kk kf x f xf x f x λ+∇∇−∇=∇(1969)(Polak-Ribiere-Polyak 公式)Page 13三、求解一般函数的FR 共轭梯度法Step1:给出0,(),01,0.nx R d f x k ε∈=−∇≤<<=否则,由精确线搜索求步长:Step3:0argmin ().k kk f x d ααα>=+进而得1.k k kk x x d α+=+返回Step2.Step2:如果(),kf x ε∇<*;kx x =取停,()21112()()k k k kkf xdf x df x +++∇=−∇+∇以及1,k k =+令Page 14FR 共轭梯度法收敛定理定理4:假定()x f 在有界水平集()(){}nL x R f x f x=∈≤上连续可微,且有下界,那么采用精确线搜索下的FR 共轭梯度法产生的点列{}kx 至少有一个聚点是驻点,即:(1)当{}kx 是有穷点列时,其最后一个点是()x f 的驻点.(2)当{}kx 是无穷点列时,它必有聚点,且任一聚点都是()x f 的驻点.Page 15例2:用共轭梯度法求解:()()22012min 4,1,1Tf x x x x =+=取又由()f x 可看出()()1122201,208x f x x x x ⎛⎞⎛⎞=⎜⎟⎜⎟⎝⎠⎝⎠2008Q ⎛⎞=⎜⎟⎝⎠是一个正定二次函数, 其中解:因共轭梯度法的第一步迭代与最速下降法相同,故由上一节例1知分析:由例1知该函数的极小点是(0,0).Tx ∗=因此在求最优步长和组合系数时,有两种方法.Page 16()01,1:Tx =得()()2,8Td f x=−∇=−−(1) 由令00()0:0.13077df x d d ααα+==得由于较大, 因此还需迭代下去.()1f x ∇10120.738460.13077180.04616x x d α⎛⎞⎛⎞⎛⎞=+=−=⎜⎟⎜⎟⎜⎟−⎝⎠⎝⎠⎝⎠进而有:()()()111.47692,0.36923,1.52237Tf xf x ∇=−∇=Page 17()110d f x dλ=−∇+(2) 先构造下一个搜索方向110()1.476922 1.545080.034080.3692380.09659d f x dλ=−∇+−−−⎛⎞⎛⎞⎛⎞=+=⎜⎟⎜⎟⎜⎟−⎝⎠⎝⎠⎝⎠于是有21020()0.03408()f x f x λ∇===∇"01000()()17.723040.03408()520TT d Q f x d Qd λ∇===="或其中, 组合系数Page 18沿搜索方向用精确线搜索求步长:21110.73846 1.5450800.477940.046160.096590x x d α−⎛⎞⎛⎞⎛⎞=+=+=⎜⎟⎜⎟⎜⎟−⎝⎠⎝⎠⎝⎠于是有令111()0:0.47794df x d d ααα+==得为此, 先计算出表达式11()f x d α+所以迭代终止,因()20,f x ∇=最优点为:()20,0.Tx x ∗==可见: 对于例1, 用共轭梯度法经两次迭代求得最优解.优点:Page 19(1)克服了最速下降法的慢收敛性.(2)建立在二次模型上,对正定二次模型具有二次终止性.(3)算法简单,易于编程,需存储空间小等优点,是求解大规模问题的重要方法.Page 20。
FR共轭梯度法实验及其程序代码

实验报告2FR共轭梯度法1 实验目的掌握外法函数法2 实验内容外罚函数法3 算法设计①编写主函数:function [min,answ]=OuterPenaltyFunction(x0,eps)实现外罚函数法②定义function y=PFun(x)用以实现求目标函数的一阶导数;③定义测试函数: function y=Fun(x)。
4 程序代码(一)外罚函数法程序代码function [min,answ]=OuterPenaltyFunction(x0,eps)%% ---- 该程序用以实现外罚函数法%% Input:% x0 ---- 初始点% eps ---- 搜索精度%% output:% min ---- 目标函数最优值% answ ---- 最优搜索点syms x1 x2xk=x0;c=10; %罚因子放大系数33deta=0.1; %罚因子while (1)fun=Fun([x1 x2])+deta*PFun([x1,x2]); %惩罚函数f=inline(fun);[min,answ]=FR_Conjugate_gradient(f, xk,eps);%调用FR迭代法函数求确定罚函数最优解if double(deta*PFun(answ))<epsbreakenddeta=c*deta;xk=answ;endansw=xk;min=double(Fun(xk));function y=PFun(x)%% ---- 该函数用以定义惩罚项函数%% Input:% x ---- 自变量%% output:% y ---- 因变量syms x1 x2syms x1 x2x1=x(1);% x2=x(2);y=(x1+1)^2;function y=Fun(x)%% ---- 该函数用以定义测试函数%% Input:% x ---- 自变量%% output:% y ---- 因变量syms x1 x2x1=x(1);x2=x(2);y=x1^2+x2^2;(二)FR共轭梯度法程序代码:function [min,answ]=FR_Conjugate_gradient(Fun, x0,eps)%% ---- 改程序用以实现FR共轭梯度法%% Input:% x0 ---- 初始点% eps ---- 搜索精度%% output:% min ---- 目标函数最优值% answ ---- 最优搜索点syms beta alphk=1;%迭代次数xk=x0;temp=1;while(norm(DFun(Fun,xk))>eps)if (k==1)pk=-DFun(Fun,xk);elsebeta=DFun(Fun,xk)'*DFun(Fun,xk)/temp;pk=-DFun(Fun,xk)+beta*pk;endtemp=DFun(Fun,xk)'*DFun(Fun,xk);temp2=xk+alph*pk';fun=Fun(temp2(1),temp2(2));fun=inline(fun);[min,answ]=OneDimentionSearch(fun,0,0.08,eps);%调用精确一维搜索求步长xk=xk+answ*pk';%answ即为所求的步长k=k+1 ;endansw=xk;min=double(Fun(xk(1),xk(2)));function y=DFun(Fun,x)%% ---- 改函数用以实现求目标函数的一阶导数%% Input:% x ---- 求导点%% output:% y ---- 目标函数的一阶导数在x点的值syms x1 x2f=Fun(x1,x2);f1=diff(f,x1);f2=diff(f,x2);f1=subs(f1,{x1,x2},x);f2=subs(f2,{x1,x2},x);y=[double(f1),double(f2)]';(三)精确一维搜索程序代码:function [min,answ]=OneDimentionSearch(Fun,x0,step,eps) %% ---- 改程序用以实现一维搜索算法%% Input:% Fun ---- 一维精确搜索函数% x0 ---- 初始点% step ---- 搜索步长% eps ---- 搜索精度%% output:% min ---- 目标函数最优值% answ ---- 最优搜索点%%% 求初始区间[a,b]=AdvanceAndRetreat(Fun,x0,step);%黄金分割法实现一维搜索[min,answ] =GoldSection(Fun,a,b,eps);function [min,answ] =GoldSection(Fun,a,b,eps)%% ---- 改函数用以实现黄金搜索法%% Input:% Fun ---- 一维精确搜索函数% a ---- 搜索区间的左端点% b ---- 搜索间隔的右端点% eps ---- 搜索精度%% output:% min ---- 目标函数最优值% wnsw ---- 最优搜索点%%format longx1=a+.382*(b-a);x2=a+.618*(b-a);while(abs(b-a)>eps)f1=Fun(x1);f2=Fun(x2);% 比较判断两个分割点处的函数值,进而缩短区间长度if(f1>f2)a=x1; x1=x2;x2=a+.618*(b-a);elseif(f1==f2)a=x1; b=x2;x1=a+.382*(b-a);x2=a+.618*(b-a);elseb=x2;x2=x1;x1=a+.382*(b-a);endend% 返回搜索点和搜索值answ=(a+b)/2;min=Fun(answ);function [a,b]=AdvanceAndRetreat(Fun,x0,step)%% ---- 改函数用以实现进退法求初始区间%% Input:% Fun ---- 一维精确搜索函数% x0 ---- 初始点% step ---- 搜索间隔%% output:% a ---- 搜索区间的左端点% b ---- 搜索间隔的右端点x1=x0+step;if Fun(x1)<=Fun(x0)while(1)step=2*step;x2=x1+step;if Fun(x1)<=Fun(x2)break;else x0=x1;x1=x2;endenda=x0;b=x2;elsewhile(1)step=2*step;x2=x0-step;if Fun(x0)<=Fun(x2)break;else x1=x0;x0=x2;endenda=x2;b=x1;end5 运行结果测试函数为:01..)(min 12221=++=x t s x x x f该函数是教材第147页例4.2.2,其结果与书上的结果近似相等(因为存在微小迭代误差)。
(完整word版)共轭梯度法程序及调试结果分析

1、设计题目用共轭梯度法求二次函数的极小点及极小值。
2、运行与程序(1)运行:打开matlab,确定conjugate_grad_2d.m文件夹为当前目录。
在命令窗中输入:f=conjugate_grad_2d([1,1],0.001)选择不同的初始点坐标[0,0],[0,1],[1,0],和迭代精度0.01,0.0001,进行运行时,需要多次调用conjugate_grad_2d函数。
(2)程序及说明:function f=conjugate_grad_2d(x0,t)%用共轭梯度法求已知函数f(x1,x2)=x1^2+2*x2^2-4*x1-2*x1*x2的极值点%已知初始点坐标:x0%已知收敛精度:t%求得已知函数的极值:fx=x0;syms xi yi a; %定义自变量,步长为符号变量f=xi^2+2*yi^2-4*xi-2*xi*yi; %创建符号表达式ffx=diff(f,xi); %求表达式f对xi的一阶求导fy=diff(f,yi); %求表达式f对yi的一阶求导fx=subs(fx,{xi,yi},x0); %代入初始点坐标计算对xi的一阶求导实值fy=subs(fy,{xi,yi},x0); %代入初始点坐标计算对yi的一阶求导实值fi=[fx,fy]; %初始点梯度向量count=0; %搜索次数初始为0while double(sqrt(fx^2+fy^2))>t %搜索精度不满足已知条件s=-fi; %第一次搜索的方向为负梯度方向if count<=0s=-fi;elses=s1;endx=x+a*s; %进行一次搜索后的点坐标f=subs(f,{xi,yi},x); %构造一元搜索的一元函数φ(a)f1=diff(f); %对函数φ(a)进行求导f1=solve(f1); %得到最佳步长aif f1~=0ai=double(f1); %强制转换数据类型为双精度数值elsebreak %若a=0,则直接跳出循环,此点即为极值点endx=subs(x,a,ai); %得到一次搜索后的点坐标值f=xi^2+2*yi^2-4*xi-2*xi*yi;fxi=diff(f,xi);fyi=diff(f,yi);fxi=subs(fxi,{xi,yi},x);fyi=subs(fyi,{xi,yi},x);fii=[fxi,fyi]; %下一点梯度向量d=(fxi^2+fyi^2)/(fx^2+fy^2);s1=-fii+d*s; %下一点搜索的方向向量count=count+1; %搜索次数加1fx=fxi;fy=fyi; %搜索后终点坐标变为下一次搜索的始点坐标endx,f=subs(f,{xi,yi},x),count %输出极值点,极小值以及搜索次数3、运行结果及分析选择不同的初始点坐标[0,0],[0,1],[1,0],和迭代精度0.01,0.0001,(1)f=conjugate_grad_2d([1,1],0.001)此程序运行1秒后终止,结果如下:X =[ 4, 2] %极小点坐标f = -8 %极小值数值count = 2 %迭代次数f =-8(2)f=conjugate_grad_2d([0,1],0.001)此程序运行1秒后终止,结果如下:X =[ 4, 2] %极小点坐标f = -8 %极小值数值count = 2 %迭代次数f =-8分析可得:(1)由结果看出,程序经过2次迭代,得到二次函数的极小值坐标[4,2],极小值-8;表明共轭梯度法收敛速度较快,计算量较小,稳定性高。
最优化问题共轭梯度法法代码

最优化问题共轭梯度法法代码x本文介绍了最优化问题共轭梯度法法的代码实现,以及如何使用代码解决最优化问题。
一、共轭梯度法简介共轭梯度法是一种常用的最优化算法,它是一种经典的迭代方法,用于求解凸函数的极值问题。
其基本思想是:在每一步,沿着梯度下降的方向迭代,直到梯度为零就停止迭代。
共轭梯度法的迭代公式为:$$x_{k+1}=x_k+alpha_k p_k$$其中,$alpha_k$ 是步长参数,$p_k$ 是当前搜索方向,$x_k$ 是当前点的位置。
二、代码实现1.函数定义```python# 共轭梯度法# 入参:函数func,梯度函数grad,初始点x0,步长参数alpha,精度epsilon# 出参:求解的最优点xdef conjugate_gradient_method(func, grad, x0, alpha, epsilon):```2.初始化搜索方向```python# 初始化搜索方向p_k = -grad(x_k)```3.更新迭代点```python# 更新迭代点x_k = x_k + alpha * p_k```4.更新搜索方向```python# 更新搜索方向beta_k = (grad(x_k) * grad(x_k)) / (grad(x_k_prev) * grad(x_k_prev))p_k = -grad(x_k) + beta_k * p_k_prev```5.检查终止条件```python# 检查终止条件if np.linalg.norm(grad(x_k)) < epsilon:break```6.完整代码```python# 共轭梯度法# 入参:函数func,梯度函数grad,初始点x0,步长参数alpha,精度epsilon# 出参:求解的最优点xdef conjugate_gradient_method(func, grad, x0, alpha, epsilon):x_k = x0p_k = -grad(x_k)while np.linalg.norm(grad(x_k)) > epsilon:x_k_prev = x_kp_k_prev = p_kline_search = line_search_method(func, grad, p_k, x_k, alpha)x_k = x_k + line_search * p_kbeta_k = (grad(x_k) * grad(x_k)) / (grad(x_k_prev) * grad(x_k_prev))p_k = -grad(x_k) + beta_k * p_k_prevreturn x_k```三、如何使用代码解决最优化问题1.确定问题首先,我们需要确定最优化问题,即构造一个函数,其中包含我们想要优化的目标函数以及约束条件。
计算方法——共轭梯度法求解线性方程组

n-1 do
k
r r ; k T k d Ad
x
k 1
x k d ;
k k
1
1 共轭梯度法求解线性方程组
③
r
k 1
b Ax
k 1
k 1
;
④ 若 || r k 1 || 或 k 1 n ,则输出近似解 x(k+1),停止;否则,转⑤; ⑤ ⑥
18 9 27 9 1 18 45 0 45 2 ,b A 9 16 0 126 9 27 45 9 135 8
由于该方程组的系数矩阵以及右端项都比较简单,因此采用从 matlab 命令窗口手 动输入的方式来输入数据,取计算精度为 10-6,运行过程及结果如图 2 和图 3(由于迭 代的初始值为随机产生,因此每次得到的残量图会有所不同,但最终都趋于 0) :
|| r ||2 k k 22 ; || r ||2
d
k 1
r
k 1
k d ;
k
end do
图 1 共轭梯度法求解线性方程组程序框图
1.2 程序使用说明 共轭梯度法求解线性方程组的 matlab 程序见附录 1,该程序可以求解系数矩阵为 对称正定矩阵的线性方程组。在使用该程序时,可将程序复制到 matlab 命令窗口中直 接运行或者复制到编辑窗口中保存运行,运行时刻根据提示输入,直至得到结果。 开始运行程序时,会出现提示“请选择系数矩阵、右端项以及系数矩阵阶数的输
图 4 命令窗口显示的运行结果
1.6 1.4 1.2 1
残量
0.8 0.6 0.4 0.2 0 0 20 40 60 80 100
数值分析11(共轭梯度法)

非零向量 p0, p1 ,· · · , pn-1 ∈Rn
p0, p1 ,· · · , pn-1 关于 A 共轭
11:51
p0, p1 ,· · · , pn-1 线性无关
22/41
—— 共轭 ——
更加整体地考虑搜索方向的选择, 选择一组 关于A共轭的向量: n 个向量 p0, p1 ,· · · , pn-1 共轭:
1 f ( x ) ( Ax , x ) (b, x ) 2 的极小值点 x 是线性方程组 Ax = b 的解。 证明: 设 u 是 Ax = b的解 1 Au = b f ( u) ( Au, u) 2 对任意 x∈R n , 只须证明 f (x) – f (u) ≥ 0 1 1 f ( x ) f ( u) ( Ax , x ) (b, x ) ( Au, u) 2 2
11:51
4 x12 x2 x3
4/41
预备知识 III
泰勒展式:
f ( x ) f ( x k ) f ( x k )( x x k ) f ( x k )( x x k )2 R
f ( x) f ( x )
k
f ( x k ) x1
( x1 x )
11:51
20/41
The Best of the 20th Century: Editors Name Top 10 Algorithms, SIAM News
现代迭代方法: Krylov子空间方法 共轭梯度法的关键是构造一组两两共 轭的方向(即一组线性无Байду номын сангаас向量)。巧妙的 是, 共轭方向可以由上次搜索方向和当前的 梯度方法之组合来产生。
2 4 x1 x2 x3 2 2 x12 x3 2 4 x1 x2 x3 2 4 x1 x2 x3 2 2 x12 x2
共轭梯度实验报告

竭诚为您提供优质文档/双击可除共轭梯度实验报告篇一:共轭梯度法实验报告数值代数实验报告一、实验名称:用共轭梯度法解线性方程组。
二、实验目的:进一步熟悉理解掌握共轭梯度法解法思路,提高matlab编程能力。
三、实验要求:已知线性方程矩阵,应用共轭梯度法在相关软件编程求解线性方程组的解。
四、实验原理:1.共轭梯度法:考虑线性方程组Ax?b的求解问题,其中A是给定的n阶对称正定矩阵,b是给定的n维向量,x是待求解的n维向量.为此,定义二次泛函?(x)?xTAx?2bTx.定理1设A对称正定,求方程组Ax?b的解,等价于求二次泛函?(x)的极小值点.定理1表明,求解线性方程组问题就转化为求二次泛函?(x)的极小值点问题.求解二次函数极小值问题,通常好像盲人下山那样,先给定一个初始向量x0,确定一个下山方向p0,沿着经过点x0而方向为p0的直线x?x0??p0找一个点x1?x0??0p0,使得对所有实数?有??x0??0p0x0??p0?,即在这条直线上x1使?(x)达到极小.然后从x1出发,再确定一个下山的方向p1,沿着直线x?x1??p1再跨出一步,即找到?1使得??x?在x2?x1??1p1达到极小:??x1??1p1x1??p1?.重复此步骤,得到一串?0,?1,?2,x?xk??pk上确定步长?k使和p0,p1,p2,,称pk为搜索方向,?k为步长.一般情况下,先在xk点找下山方向pk,再在直线??xk??kpkxk??pk?,最后求出xk?1?xk??kpk.然而对不同的搜索方向和步长,得到各种不同的算法.由此,先考虑如何确定?k.设从xk出发,已经选定下山方向pk.令fxk??pk???xk??pk?A?xk??pk??2bT?xk??pk?T??2pkApk?2?rkTpkxk?,T其中rk?b?Apk.由一元函数极值存在的必要条件有Tf2?pkApk?2rkTpk?0所确定的?即为所求步长?k,即步长确定后,即可算出此时,只要rkTpk?0,就有rkTpk.?k?TpkApkxk?1?xk??kpk.??xk?1xkxk??kpkxk?TApk?2?krkTpkk2pk?rkTpk?2即??xk?1xk?.TpkApk?0再考虑如何确定下山方向pk.易知负梯度方向是?(x)减小最快的方向,但简单分析就会发现负梯度方向只是局部最佳的下山方向,而从整体来看并非最佳.故采用新的方法寻求更好的下山方向——共轭梯度法.下面给出共轭梯度法的具体计算过程:给定初始向量x0,第一步仍选用负梯度方向为下山方向,即p0?r0,于是有r0Tr0?0?T,x1?x0??0p0,r1?b?Ax0.p0Ap0对以后各步,例如第k+1步(k?1),下山方向不再取rk,而是在过点由向量rk和pk?1所张成的二维平面?2?{x|x?xk??rk??pk?1,?,??R}内找出使函数?下降最快的方向作为新的下山方向pk.考虑?在?2上的限制:,?(xk??rk??pk?1)?(xk??rk??pk?1)TA(xk??rk??pk?1)?2bT(xk??rk??pk?1).??计算?关于?,??2??rTAr??rTAp?rTr?,kkkk?1kk????TTT?2?rAp??p?kk?1k?1Apk?1?,r其中最后一式用到了rkpk?1,这可由的定义直接验证.令0k????0,即知?在?2内有唯一的极小值点????x?xk??0rk??0pk?1,其中?0和?0满足??0rkTArk??0rkTApk?1?rkTrk,?TT??0rkApk?1??0pk?1Apk?1?0.1由于rk?0必有?0?0,所以可取pk?作为新的下山方向.显然,这是在平面?2内可得的最佳下山方向.令?k?1?得?0?x?xk??rk??0p?0k?1?0,则可?0rkTApk?1?k?1??T.pk?1Apk?1T注:这样确定的pk满足pkApk?1?0,即pk与pk?1是相互共轭的.总结上面的讨论,可得如下的计算公式:rkTpk,xk?1?xk??kpk,?k?TpkApkrk?1?b?Axk?1,rkT?1Apk,pk?1?rk?1??kpk.?k??TpkApk在实际计算中,常将上述公式进一步简化,从而得到一个形式上更为简单而且对称的计算公式.首先来简化rk?1的计算公式:rk?1?b?Axk?1?b?A(xk??kpk)?rk??kApk.因为Apk在计算?k是已经求出,所以计算rk?1时可以不必将xk?1代入方程计算,而是从递推关系rk?1?b??kApk 得到.再来简化?k和?k的计算公式.此处需要用到关系式rkTrk?1?rkTpk?1?rkT?1pk?0,k?1,2,从而可导出1rkT?1??rkT?1rk?1,,1T?k1TTpkApk?pk?rk?rk?1??pkrk??k1Tk1?rk?rk??k?1pk?1??rkTrk..由此可得?k?krkTrkrkT?1rk?1?k?T,,?k?T..pkApkrkrk从而有求解对称正定方程组的共轭梯度法算法如下:x0?初值r0?b?Ax0;k?0whilerk?0k?k?1ifk?1p0?r0else?k?2?rkT?1rk?1rkT?2rk?2pk?1?rk?1??k?2pk?2endT?k?1?rkT?1rk?1pk?1Apk?1xk?xk?1??k?1pk?1rk?rk?1??k?1Apk?1endx?xk注:该算法每迭代一次仅需要使用系数矩阵A做一次矩阵向量积运算.定理2由共轭梯度法得到的向量组?ri?和?pi?具有如下基本性质:(1)piTrj?0,0?i?j?k;(2)riTrj?0,i?j,0?i,j?k;(3)piTApj?0,i?j,0?i,j?k;(4)span{r0,其中,rk}?span{p0,,pk}??(A,r0,k?1),?(A,r0,k?1)?span{r0,Ar0,,Akr0},通常称之为Krylov子空间.下面给出共轭梯度法全局最优性定理:定理3用共轭梯度法计算得到的近似解xk满足??xk??minx?:x?x0??(A,r0,k)?或xk?x*A?min?x?x*A:x?x0??(A,r0,k)?,其中xA?x*是方程组Ax?b的解,?(A,r0,k)是由所定义的Krylov 子空间.定理2表明,向量组r0,,rk和p0,,pk分别是Krylov 子空间?(A,r0,k?1)的正交基和共轭正交基.由此可知,共轭梯度法最多n步便可得到方程组的解x*.因此,理论上来讲,共轭梯度法是直接法.然而实际使用时,由于误差的出现,使rk之间的正交性很快损失,以致于其有限步终止性已不再成立.此外,在实际应用共轭梯度法时,由于一般n很大,以至于迭代o?n?次所耗费的计算时间就已经使用户无法接受了.因此,实际上将共轭梯度法作为一种迭代法使用,而且通常是rk是否已经很小及迭代次数是否已经达到最大允许的迭代次数kmax来终止迭代.从而得到解对称正定线性方程组的实用共轭梯度法,其算法如下:x?初值k?0;r?b?Ax;??rTrwhile??b2?and?k?kmax?k?k?1ifk?1p?relse;p?r??pend??Ap;pT?;x?x??pr?r;;??rTrend算法中,系数矩阵A的作用仅仅是用来由已知向量p产生向量??Ap,这不仅可以充分利用A的稀疏性,而且对某些提供矩阵A较为困难而由已知向量p产生向量??Ap又十分方便的应用问题是十分有益的。
实验报告

问题2运用两种不同的方法求解非线性最小二乘问题 42min ||()||x RF x ,其中问题分析和解决框架:上述问题属于无约束最优化问题,具体又为其中应用很广的一类问题,即非线性最小二乘问题,可看作无约束极小化的特殊情形。
我们既可以采用一般的无约束最优化问题的典型算法,如牛顿法,拟牛顿法,共轭梯度法求解,也可采用根据目标函数的特殊结构,对一般的无约束最优化问题进行改造得到的一些针对非线性最小二乘问题的特殊方法,如高斯-牛顿法,Levenberg-Marquardt 法,最小非线性二乘的拟牛顿法等。
本次试验我采用了一般无约束最优化问题的共轭梯度法,拟牛顿法(DFP )和针对非线性最小二乘的高斯牛顿法。
由于刚开始用的共轭梯度法和拟牛顿法(DFP ),没有采用解决非线性最小二乘的典型算法,觉得有些缺憾,故加上高斯-牛顿法,共采用三种方法,以求对具体算法有更进一步的认识。
由于要求的停机准则和求解一般无约束最优化问题的共轭梯度法,拟牛顿法(DFP )有些差异,我对停机准则作了些修改,采用规定的表达式来确定停机与否。
对一维搜索求步长,采用的进退法(确定搜索步长区间)和黄金分割法(0.618法)。
具体程序和运行结果:共轭梯度法:共轭梯度法(Conjugate Gradient method )是介于最速下降法与牛顿法之间的一种方法,是典型的共轭方向法,它的每一个搜索方向是互相共轭的,而这些搜索方向d 仅仅是负梯度方向与上一次迭代搜索方向的组合,因此,存储量少,计算方便。
它仅需利用一阶导数信息,克服了最速下降法收敛慢(“之”字形搜索)的缺点,又避免了牛顿法需要存储和计算Hesse 矩阵并求逆的缺点。
而且共轭梯度法不需要矩阵存储,且有较快的收敛速度和二次终止性等优点。
程序:%% conjugate gradient methodclc;clear;format long;error=1e-5; %停机门限syms x1 x2 x3 x4 r;P=(x1+10*x2)^2+(sqrt(5)*(x3-x4))^2+((x2-2*x3)^2)^2+(sqrt(10)*(x1-x4)^2)^2;f = [ x1+10*x2; 5^(1/2)*(x3-x4); (x2-2*x3)^2; 10^(1/2)*(x1-x4)^2]; v=[x1 x2 x3 x4];x=[3;-1;0;1];j=jacobian(f,v); %求jacobian行列式g=jacobian(P,v); %求目标函数梯度向量g=g';J=subs(j,v,x); %初值带入表达式F=subs(f,v,x);G=subs(g,v,x);k=0;ticwhile (sum((J'*F).^2))^(1/2)>error %判断停机与否if k==0d=-G; %初始搜索方向为最速下降方向,即负梯度方向elsebeta=G_new'*G_new/(G_old'*G_old);d=-G_new+beta*d; %从x(k)出发搜索方向介于从x(k-1)出发搜索方向和点x(k)负梯度方向之间endy=subs(P,v,x+r*d);interval=jintuifa(y,r);step=gold(y,r,interval); %一维搜索确定步长G_old=subs(g,v,x); %前一点x(k-1)梯度x=x+step*d;G_new=subs(g,v,x); %新一点x(k)梯度J=subs(j,v,x); %新的迭代点数值带入表达式F=subs(f,v,x);k=k+1; %迭代次数加1end;tocdisp('Conjugate gradient method');kxsigma=(sum((J'*F).^2))^(1/2)F=(sum(F.^2))^(1/2) %显示迭代次数,变量取值,停机表达式值,目标函数值%%运行结果:由运行结果可知,对非线性最小二乘问题,共轭梯度法由于没有包含二阶导数信息,所需迭代次数多,收敛慢,这是一个主要缺点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、设计题目
用共轭梯度法求二次函数的极小点及极小值。
2、运行与程序
(1)运行:打开matlab,确定conjugate_grad_2d.m文件夹为当前目录。
在命令窗中输入:f=conjugate_grad_2d([1,1],0.001)
选择不同的初始点坐标[0,0],[0,1],[1,0],和迭代精度0.01,0.0001,
进行运行时,需要多次调用conjugate_grad_2d函数。
(2)程序及说明:
function f=conjugate_grad_2d(x0,t)
%用共轭梯度法求已知函数f(x1,x2)=x1^2+2*x2^2-4*x1-2*x1*x2的极值点
%已知初始点坐标:x0
%已知收敛精度:t
%求得已知函数的极值:f
x=x0;
syms xi yi a; %定义自变量,步长为符号变量
f=xi^2+2*yi^2-4*xi-2*xi*yi; %创建符号表达式f
fx=diff(f,xi); %求表达式f对xi的一阶求导
fy=diff(f,yi); %求表达式f对yi的一阶求导
fx=subs(fx,{xi,yi},x0); %代入初始点坐标计算对xi的一阶求导实值
fy=subs(fy,{xi,yi},x0); %代入初始点坐标计算对yi的一阶求导实值
fi=[fx,fy]; %初始点梯度向量
count=0; %搜索次数初始为0
while double(sqrt(fx^2+fy^2))>t %搜索精度不满足已知条件
s=-fi; %第一次搜索的方向为负梯度方向
if count<=0
s=-fi;
else
s=s1;
end
x=x+a*s; %进行一次搜索后的点坐标
f=subs(f,{xi,yi},x); %构造一元搜索的一元函数φ(a)
f1=diff(f); %对函数φ(a)进行求导
f1=solve(f1); %得到最佳步长a
if f1~=0
ai=double(f1); %强制转换数据类型为双精度数值
else
break %若a=0,则直接跳出循环,此点即为极值点
end
x=subs(x,a,ai); %得到一次搜索后的点坐标值
f=xi^2+2*yi^2-4*xi-2*xi*yi;
fxi=diff(f,xi);
fyi=diff(f,yi);
fxi=subs(fxi,{xi,yi},x);
fyi=subs(fyi,{xi,yi},x);
fii=[fxi,fyi]; %下一点梯度向量
d=(fxi^2+fyi^2)/(fx^2+fy^2);
s1=-fii+d*s; %下一点搜索的方向向量
count=count+1; %搜索次数加1
fx=fxi;
fy=fyi; %搜索后终点坐标变为下一次搜索的始点坐标
end
x,f=subs(f,{xi,yi},x),count %输出极值点,极小值以及搜索次数
3、运行结果及分析
选择不同的初始点坐标[0,0],[0,1],[1,0],和迭代精度0.01,0.0001,
(1)f=conjugate_grad_2d([1,1],0.001)
此程序运行1秒后终止,结果如下:
X =[ 4, 2] %极小点坐标
f = -8 %极小值数值
count = 2 %迭代次数
f =-8
(2)f=conjugate_grad_2d([0,1],0.001)
此程序运行1秒后终止,结果如下:
X =[ 4, 2] %极小点坐标
f = -8 %极小值数值
count = 2 %迭代次数
f =-8
分析可得:
(1)由结果看出,程序经过2次迭代,得到二次函数的极小值坐标[4,2],极小值-8;
表明共轭梯度法收敛速度较快,计算量较小,稳定性高。
(2)选择不同的初始点坐标[0,0],[0,1],[1,0],[1,1],都是经过2次迭代得到一致
的结果;表明共轭梯度法初始点的选择不影响收敛结果。
(3)选择迭代精度0.0001,程序将近运行4秒才结束;可知迭代精度越高时,程序
运行的时候越长,所以在实际应用中选择适当的迭代精度,有利于提高计算的
效率。
(4)从共轭梯度法的计算过程可以看出,第一个搜索方向取作负梯度方向,这就是
最速下降法。
其余各步的搜索方向是将负梯度偏转一个角度,也就是对负梯度
进行修正。
所以共轭梯度法实质上是对最速下降法进行的一种改进,故它又被
称作旋转梯度法。