南理工高等数值分析课程设计张军.docx_第1页
南理工高等数值分析课程设计张军.docx_第2页
南理工高等数值分析课程设计张军.docx_第3页
南理工高等数值分析课程设计张军.docx_第4页
南理工高等数值分析课程设计张军.docx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

南京理工大学课程考核论文课程名称: 高等数值分析 论文题目: 求解线性方程组Ax=b的极 小化方法比较 姓 名: 学 号: 成 绩: 任课教师评语: 签名: 年 月 日摘要本文对求解线性方程组Ax=b的极小化方法进行了理论上的阐述,并且选取三种具有代表性的方法:最速下降法、共轭梯度法(CG)、预处理共轭梯度法(PCG),使用Matlab编程并分别求解相同的线性方程组,在准确性和收敛速度方面进行比较。结果表明,如果预处理矩阵选择得当,使用预处理共轭梯度法(PCG)效果最好。1、 极小化方法极小化方法的基本原理是变分原理。设A对称正定,求解的方程组为其中,。考虑2次函数,定义为有如下性质 对一切, 对一切, 设为(1.1)的解,则而且对一切,有则有定理:设A对称正定,则为(1.1)解的充分必要条件是满足求,使取最小,这就是求解等价于方程组(1.1)的变分问题。求解的方法一般是构造一个向量序列,使。1.1 最速下降法可通过求泛函的极小点来获得式(1.1)的解。为此,可以从任一出发,沿着泛函在处下降最快的方向搜索下一个近似点,使得在该方向上达到极小值。由多元微积分知识,在处下降最快的方向是在该点的负梯度方向,经过简单计算,得:,此处,也称为近似点对应的残量。取,确定的值使取得极小值。由式(1.4),令,得从上式求出并记为:综合上述推导过程,可得最速下降法的算法描述: 给定初始点,容许误差,置。 计算,若,停算,输出作为近似解。 按式(1.6)计算步长因子,置,转步骤。最速下降法在理论上是可以收敛的,但是收敛可能会比较缓慢,而且由于舍入误差存在,实际算出的与理论上的最速下降方向可能有很大差别,使计算时出现数值不稳定性。最速下降法在现代科学与工程中不再具有实用价值。1.2 共轭梯度法(CG)当线性方程组Ax=b的系数矩阵A是对称正定矩阵,可以采用共轭梯度法对该方程组进行求解,可以证明,式(1.7)所示的n元二次函数取得极小值点x*是方程Ax=b的解。共轭梯度法是把求解线性方程组的问题转化为求解一个与之等价的二次函数极小化的问题。从任意给定的初始点出发,沿一组关于矩阵A的共轭方向进行线性搜索,在无舍入误差的假定下,最多迭代n次(其中n为矩阵A的阶数),就可求得二次函数的极小点,也就求得线性方程组Ax = b的解。其迭代格式为公式(1.8)。共轭梯度法中关键的两点是迭代格式(21)中最佳步长和搜索方向的确定。其中可以通过一元函数极小化来求得,其表达式为公式(22);取,则,要求满足,可得到的表达式(23).经过一系列的证明和简化,最终可得共轭梯度法的计算过程如下 给定初始点,容许误差,计算,置。 计算步长因子置,。 若,停算,输出作为近似解。 计算置,转步骤。1.3 预处理共轭梯度法(PCG)由于计算机存在舍入误差,故前述的共轭梯度法得到的向量会逐渐失去正交性,因而不大可能在n步之内得到原方程组的精确解。此外,遇到求解大规模的线性方程组,即使能够在n步收敛,收敛速度也不尽如人意。可以采用预处理技术改善收敛性质,加快收敛速度。预处理就是对原方程组进行显式或隐式的修正,使得修正后的方程组能够更有效地求解。即构造一个预处理矩阵M,然后用迭代法求解如下的同解方程组或相应得到的算法分别称为左预处理迭代法或右预处理迭代法。将预处理技术和共轭梯度法结合,可以得到预处理共轭梯度法,算法如下: 给定初始点,容许误差,计算,置。 计算步长因子置,。 若,停算,输出作为近似解。 计算置,转步骤。预处理共轭梯度法成功与否,关键在于预处理矩阵M 是否选得合适。一个好的预处理矩阵应该具有如下特征: M 对称正定; M 与A 的稀疏性相近; 方程组MSI = rI 易于求解; 的特征值分布比较“ 集中”,使较小。预处理矩阵的构造方法有很多,这里介绍本次实验使用的两种方法。 对角预处理法若A 是严格对角占优的矩阵,则可以选择为预处理矩阵,若A是严格分块对角占优矩阵,则可以选择为预处理矩阵;但是这样简单的选择,往往不能带来很好的加速收敛效果。 矩阵分裂方法此方法的基本思想是将A 分裂为:;通过矩阵和来构造预处理矩阵M,一般的做法是取线性稳定迭代法中相应的A 的分裂。比如:Jacobi 分裂(),Gauss - Seidei 分裂(,L 是A 的严格下三角部分),SSOR 分裂等,下面介绍SSOR分裂。将A分裂为,其中,为严格下三角矩阵,它的元素是由A 相应部分元素取负号以后构成的。取:其中()是参数,一般取为1,本次实验中也取为1。则预处理矩阵为:从理论上讲,此预处理矩阵可以使等于的平方根。2 实验与分析对于线性方程组,首先使用matlab编写最速下降法程序,并且随机生成的对称正定系数矩阵A和的矩阵b。多次运行之后得到可以求出收敛解的矩阵并保存,则分别使用最速下降法、共轭梯度法、预处理共轭梯度法解决同一个线性方程组。以下是矩阵部分截图,由于矩阵太大,不方便放在论文中,但是生成矩阵的程序在第三章中。图1 系数矩阵A图2 矩阵b2.1 最速下降法的实验结果由于结果矩阵x为的矩阵,在本文无法展示出截取计算出的最终收敛的结果,故截取前5个和后5个数值如下表:次数12345值14.87552312-0.8003489527.756162756-13.515619242.269187643次数9969979989991000值-0.365809486-3.156700386-1.693021867-3.51036690528.94290631表1 最速下降法的部分结果图3 Matlab显示的工作区 可以看出,使用最速下降法,迭代1821次之后得到收敛的结果。2.2 共轭梯度法的实验结果用共轭梯度法解同样的线性方程组,截取部分结果如下:次数12345值14.8755299-0.8003463517.75615781-13.51562692.269183581次数9969979989991000值-0.365803328-3.156700613-1.693023993-3.51037006628.94290597表2 共轭梯度法的部分结果图4 Matlab显示的工作区可以看出,使用共轭梯度法,迭代112次之后得到收敛的结果。2.3 预处理共轭梯度法的实验结果首先将预处理矩阵M设为矩阵A的对角阵,得到数据如下:次数12345值14.87553095-0.8003460187.75615762-13.515628692.269182867次数9969979989991000值-0.365803808-3.156700618-1.693025329-3.51036995928.94290566表3 M为A的对角阵时预处理共轭梯度法的部分结果图5 Matlab显示的工作区再用第二种方法:用SSOR分裂法得到预处理矩阵M,部分结果如下:次数12345值14.87552976-0.8003463097.756158157-13.515627432.269183319次数9969979989991000值-0.36580421-3.156700787-1.69302531-3.51036962328.94290593表4 用SSOR分裂法得到M的预处理共轭梯度法的部分结果图6 Matlab显示的工作区可以看出,使用预处理共轭梯度法,若预处理矩阵M取A的对角阵,需迭代123次之后得到收敛的结果;若预处理矩阵M用SSOR分裂法取得,需迭代90次之后得到收敛的结果。比较上述解线性方程组的三种方法:最速下降法法是以残向量作为解的修正方向,收敛速度可能很慢。若对应系数矩阵A的最大、最小特征值,当时,收敛很慢;而且当很小时,因舍入误差影响,计算会不稳定。由实验也可以看出,最速下降法需要的迭代次数最多。共轭梯度法属于变分方法的范围,要求系数矩阵A对称正定。使用CG法求解n阶方程组,理论上最多n步便可得到精确解。实验也证明,只需要112步便可得到精确解,比最速下降法快得多。 PCG法的使用效果,在于预处理矩阵的选择;若预处理矩阵为系数矩阵的对角阵,用此方法效果可能不尽如人意,比如实验中迭代次数为123次,比CG法还慢些;而使用SSOR法对矩阵进行预处理,再用CG法求解方程组会比较快,实验也可看出,90步迭代后,便可得到达到精确度要求的解。3 实验用到的matlab程序3.1 生成随机矩阵的程序N=1000;D = diag(rand(N,1);U = orth(rand(N,N);B = U * D * U ;save(date_A.mat,B);b = rand(N,1);3.2 最速下降法程序A 最速下降法主程序 load date_A.matload date_b.matx,iter = mgrad(B,b);B 最速下降法模块%最速下降法function x,iter=mgrad(A,b,x,ep,N)%用途:用最速下降法解线性方程组Ax=b%格式:x,iter=mgrad(A,b,x,ep,N) 其中A为系数矩阵,b为右端向量,x为初始向量%(默认零向量),ep为精度(默认 1e-6),N为最大迭代次数(默认1000次),返回参数%x,iter分别为近似解向量和迭代次数if nargin5, N=1e12;endif nargin4,ep=1e-6;endif nargin3,x=zeros(size(b);endfor iter=1:N r=b-A*x; if norm(r)ep,break;end a=r*r/(r*A*r); x=x+a*r; iter xend3.3 共轭梯度法程序A 共轭梯度法主程序load date_A.matload date_b.matx,iter=mcg(B,b)B 共轭梯度法模块function x,iter=mcg(A,b,x,ep,N)%用途:用共轭梯度法解线性方程组Ax=b%格式:x,iter=mcg(A,b,x,ep,N)其中A为系数矩阵,b为右端向量,x为初始向量(默认%零向量)ep为精度(默认1e-6),N为最大迭代次数(默认10000次),返回参数x,iter%分别为近似解向量和迭代次数if nargin 5, N=10000;endif nargin4, ep=1e-6;endif nargin3,x=zeros(size(b);endr=b-A*x;for iter=1:N rr=r*r; if iter=1 p=r; else beta=rr/rr1; p=r+beta*p; end q=A*p; alpha=rr/(p*q); x=x+alpha*p; r=r-alpha*q; rr1=rr; if (norm(r)ep),break; endend3.4 预处理共轭梯度法程序A 得到预处理矩阵M的程序 M为A的对角矩阵load date_A.matM=diag(diag(B);save(date_juzhenM1.mat,M); M由SSOR分裂法得到load date_A.matD=diag(diag(B);CL=tril(-B);L=(D-CL)*D)1/2;M=L*L;save(date_juzhenM.mat,M);B 预处理共轭梯度法主程序load date_A.matload date_b.matx,iter=mpcg(B,b)C 预处理共轭梯度法模块function x,iter=mpcg(A,b,x,ep,N)%用途:用预处理共轭梯度法解线性方程组Ax=b%格式:x,iter=mpcg(A,b,x,ep,N)其中A为系数矩阵,b为右端向量,x为初始向量(默认%零向量)ep为精度(默认1e-6),N为最大迭代次数(默认10000次),返回参数x,iter%分别为近似解向量和迭代次数load date_juzhenM.m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论