文档介绍:共轭梯度实验报告
篇一:共轭梯度实验报告
共轭梯度法求解线性方程组
共轭梯度法是求解正定系数矩阵线性方程组
Ax?b(A为对称正定矩阵)1
的一种迭代方法,该方法的好处是可以用于求解病态问题,大大减少了计算误差。求解方程组(1)的本质是求二次函数
TT?(x)?1xAx?bx2
的极小值点。由于极值的必要条件,在极小点x*处,函数?(x)的梯度满足
??(x)?Ax?b?03
即极小点x*是方程(1)的解,因此线性方程组的解转化为一个求极值问题。
从本质上来讲,共轭的方向就是某种意义下的正交方向。当A为单位阵时,共轭就是通常意义下的正交。为了便于理解,考虑二维(n?2)情况,函数
TT??1
xx?bx3
的等值线为一族同心圆,而式(2)表示的函数?(x)的等值线是一族同心椭圆。从直观上来讲,圆的切线与切点到圆心的连线正交,那么,椭圆的切线与切点到椭圆中心的连线是共轭。图1给出了共轭的几何意义。
(a) 正交方向(b)共轭方向
图 1(转载自: 范文网:共轭梯度实验报告) 正交与共轭的几何意义
从图1可以看出,如果能找到两个共轭方向,那么沿一个方向前进,找到极小点后,再沿另一个方向继续前进,找到极小点,这个极小点就是椭圆的重心,即二次函数的极小点。
对于n维问题,只要能找到n个相互共轭的非零方向,从某一点出发,沿每个方向前进,找到一维极小点,然后再从这个点出发,沿第2个方向前进找极小点,当n个方向都完成这一动作后,就能够得到n维二次函数的极小点。
1. 输入数据A,b ,置r(0)?b?Ax(0),d(0)?r(0),精度要求?和k?0;
2. 计算
(r(k))Tr(k)
?k?(k)T(k),x(k?1)?x(k)??kd(k),r(k?1)?r(k)??kAd(k); (d)Ad
3. 若x(k?1)?x(k)??或k?n?1,则停止计算(x(k?1)作为方程组的解);否则,计算
(r(k?1))Tr(k?1)
(k?1)(k?1)(k)?k?1?,d?r??d; k?1(k)T(k)(r)r
4. 置k?k?1,转第2步。
1. 程序内容
function [x,k] = cgg(A,b,ep )
b=b';
if nargin n=length(A);
x=zeros(n,1);
r=b;d=r;k=0;
while k alpha=(r'*r)/(d'*A*d);
r1=r;
s=alpha*d;
x=x+s;
r=r-A*s;
if norm(s) beta=(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. 实际应用
用共轭梯度法求如下解线性方程组,Ax?b,其中
?2?1???1??????12?1???0??,b??? A???????12?1???0????1??12?????
其中A的阶数n分别取100,200,400,指出计算结果是否可靠。
解:在matlab里产生相关系数矩阵,将精度设置为1e-9,调用共轭算法得出100阶,200阶,400阶的方程组解和对应的迭代次数为
x100?(?1,?1,
x200?(?1,?1,
x400?(?1,?1,,?1,?1)T,k?50,?1,?1)T,k?100 ,?1,?1)T,k?200
由计算结果可知计算结果是可靠的,用共轭梯度算法求解时,随着方程组的阶数增大,方程组的解是稳定的,而且迭代次数只为对应方程组阶数的一半,远小于方程组的阶数,计算速度很快。
篇二:共轭梯度法实验报告
数值代数实验报告
一、实验名称:用共轭梯度法解线性方程组。
二、实验目的:进一步熟悉理解掌握共轭梯度法解法思路,提高matlab编程能力。三、实验要求:已知线性方程矩阵,应用共轭梯度法在相关软件编程求解线性方程组的解。四、实验原理:
:
考虑线性方程组
Ax?b
的求解问题,其中A是给定的n阶对称正定矩阵,b是给定的n维向量,,定义二次泛函
?(x)?xTAx?2bTx.
定理1 设A对称正定,求方程组Ax?b的解,等价于求二次泛函?(x)的极小值点. 定理1表明,求