您好,欢迎访问三七文档
共轭梯度法求解线性方程组一.共轭梯度法共轭梯度法是求解正定系数矩阵线性方程组()1AxbA为对称正定矩阵的一种迭代方法,该方法的好处是可以用于求解病态问题,大大减少了计算误差。求解方程组(1)的本质是求二次函数12()2TTxxAxbx的极小值点。由于极值的必要条件,在极小点*x处,函数()x的梯度满足()03xAxb即极小点*x是方程(1)的解,因此线性方程组的解转化为一个求极值问题。二.共轭的几何意义从本质上来讲,共轭的方向就是某种意义下的正交方向。当A为单位阵时,共轭就是通常意义下的正交。为了便于理解,考虑二维(2n)情况,函数123TTxxbx的等值线为一族同心圆,而式(2)表示的函数()x的等值线是一族同心椭圆。从直观上来讲,圆的切线与切点到圆心的连线正交,那么,椭圆的切线与切点到椭圆中心的连线是共轭。图1给出了共轭的几何意义。(a)正交方向(b)共轭方向图1正交与共轭的几何意义从图1可以看出,如果能找到两个共轭方向,那么沿一个方向前进,找到极小点后,再沿另一个方向继续前进,找到极小点,这个极小点就是椭圆的重心,即二次函数的极小点。对于n维问题,只要能找到n个相互共轭的非零方向,从某一点出发,沿每个方向前进,找到一维极小点,然后再从这个点出发,沿第2个方向前进找极小点,当n个方向都完成这一动作后,就能够得到n维二次函数的极小点。三.共轭梯度算法程序流程1.输入数据,Ab,置(0)(0)rbAx,(0)(0)dr,精度要求和0k;2.计算()()(1)()()(1)()()()()(),,;()kTkkkkkkkkkkkTkrrxxdrrAddAd3.若(1)()1,kkxxkn或则停止计算((1)kx作为方程组的解);否则,计算(1)(1)(1)(1)()11()()(),;()kTkkkkkkkTkrrdrdrr4.置1kk,转第2步。四.共轭梯度算法的调用及应用1.程序内容function[x,k]=cgg(A,b,ep)b=b';ifnargin3,ep=1e-5;endn=length(A);x=zeros(n,1);r=b;d=r;k=0;whileknalpha=(r'*r)/(d'*A*d);r1=r;s=alpha*d;x=x+s;r=r-A*s;ifnorm(s)epbreak;endbeta=(r'*r)/(r1'*r1);d=r+beta*d;k=k+1;end其中输入项:A为待求解方程组的系数矩阵,b为方程左端常数项,ep为计算精度,输出项:x为方程组的解,k为迭代次数。直接在matlab命令框里输入命令[x,k]=cgg(A,b,ep)即可。2.实际应用用共轭梯度法求如下解线性方程组,Axb,其中2111210,1210121Ab其中A的阶数n分别取100,200,400,指出计算结果是否可靠。解:在matlab里产生相关系数矩阵,将精度设置为1e-9,调用共轭算法得出100阶,200阶,400阶的方程组解和对应的迭代次数为100200400(1,1,,1,1),50(1,1,,1,1),100(1,1,,1,1),200TTTxkxkxk由计算结果可知计算结果是可靠的,用共轭梯度算法求解时,随着方程组的阶数增大,方程组的解是稳定的,而且迭代次数只为对应方程组阶数的一半,远小于方程组的阶数,计算速度很快。
本文标题:共轭梯度实验报告
链接地址:https://www.777doc.com/doc-2665206 .html