实验解线性方程组的基本迭代法实验
- 格式:docx
- 大小:57.52 KB
- 文档页数:22
第1篇一、实验目的1. 理解雅各比迭代法的原理和应用。
2. 掌握雅各比迭代法的计算步骤和实现方法。
3. 通过实验验证雅各比迭代法在求解线性方程组中的有效性和收敛性。
二、实验原理雅各比迭代法是一种求解线性方程组的迭代方法。
对于形如Ax=b的线性方程组,其中A是n×n的系数矩阵,x是n维未知向量,b是n维常数向量,雅各比迭代法的基本思想是将方程组Ax=b转化为一系列的简单方程进行迭代求解。
设A为对角占优矩阵,则雅各比迭代法的迭代公式为:x_{k+1} = (D - L)^{-1}(b - Ux_k)其中,D是A的对角矩阵,L是A的非对角元素中下三角矩阵,U是A的非对角元素中上三角矩阵。
三、实验内容1. 准备实验环境:安装MATLAB软件,创建实验文件夹。
2. 编写实验程序:(1)定义系数矩阵A和常数向量b。
(2)计算对角矩阵D、下三角矩阵L和上三角矩阵U。
(3)初始化迭代变量x_0。
(4)设置迭代次数N和容许误差ε。
(5)进行雅各比迭代计算,并输出每一步的迭代结果。
(6)判断迭代是否收敛,若收敛则输出最终结果,否则输出未收敛信息。
3. 运行实验程序,观察迭代过程和结果。
四、实验步骤1. 创建实验文件夹,打开MATLAB软件。
2. 编写实验程序,保存为“雅各比迭代法实验.m”。
3. 运行实验程序,观察迭代过程和结果。
4. 分析实验结果,验证雅各比迭代法的有效性和收敛性。
五、实验结果与分析1. 运行实验程序,得到以下迭代过程和结果:迭代次数 | 迭代结果---------|---------1 | x_1 = [0.3333, 0.3333]2 | x_2 = [0.3333, 0.3333]3 | x_3 = [0.3333, 0.3333]...N | x_N = [0.3333, 0.3333]2. 分析实验结果:(1)从实验结果可以看出,雅各比迭代法在求解线性方程组时,经过有限次迭代即可收敛。
浙江大学城市学院实验报告课程名称 科学计算实验项目名称 线性方程组的求解-迭代法实验成绩 指导老师(签名 ) 日期 2012-4-6一. 实验目的和要求1. 掌握Jacobi 迭代方法.Gauss-Seidel 迭代方法.SOR 迭代方法的编程思想.能够分别用分量形式和矩阵形式编写相关程序。
2. 观察SOR 迭代法中松弛因子变化情况对收敛的影响。
3. 了解Hilbert 矩阵的病态性和作为线性方程组系数矩阵的收敛性。
二. 实验内容和原理编程题2-1要求写出Matlab 源程序(m 文件).并有适当的注释语句;分析应用题2-2.2-3.2-4要求将问题的分析过程、Matlab 源程序和运行结果和结果的解释、算法的分析写在实验报告上。
2-1 编程注释 设11121121222212,n n n n nn n a a a b a a a b A b a a a b ⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥==⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦对下述求解线性方程组的Matlab 程序添上注释语句.其中A 和b 分别为线性方程组的系数矩阵和右端向量;0x 为迭代初始向量(0)X;max N 为容许迭代最大次数.eps 为迭代终止条件的精度(容许误差).终止条件为前后两次迭代解的差的向量2-范数。
1) Jacobi 迭代:Jacobimethod(A,b,x0,Nmax,eps)2) Gauss-Seidel 迭代:GaussSeidelmethod(A,b,x0,Nmax,eps)3) 松弛迭代:SORmethod(A,b,x0,Nmax,eps,w)2-2 分析应用题利用2-1中的程序来分析用下列迭代法解线性方程组:123456410100014101050141012101410501014120010146x x x x x x --⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥----=⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥----⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦ 的收敛性.并求出使(1)()20.0001k k X X +-≤的近似解及相应的迭代次数.其中取迭代初始向量(0)X 为零向量。
实验五 线性方程组的迭代法实验一. 实验目的(1)深入理解线性方程组的迭代法的设计思想,学会利用系数矩阵的性质以保证迭代过程的收敛性,以及解决某些实际的线性方程组求解问题。
(2)熟悉Matlab 编程环境,利用Matlab 解决具体的方程求根问题。
二. 实验要求建立Jacobi 迭代公式、Gauss-Seidel 迭代公式和超松弛迭代公式,用Matlab 软件实现线性方程组求解的Jacobi 迭代法、Gauss-Seidel 迭代法和超松弛迭代法,并用实例在计算机上计算。
三. 实验内容1. 实验题目(1)分别利用Jacobi 迭代和Gauss-Seidel 迭代求解下列线性方程组,取()T 0,0,0,0,0,0=x ,要求精度510-=ε:⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡---------------626050410100141010014001100410010141001014654321x x x x x x ①Jacobi 迭代:②Gauss-Seidel迭代:(2)分别取1ω、1.05、1.1、1.25和1.8,用超松弛法求解上面的方程组,要求精度=为5ε。
=10-超松弛迭代代码如下所示:运行时初始化如下:分别以不同的松弛因子代入,W=1:W=1.05W=1.1:W=1.25W=1.8:当最大迭代次数增加时,我们可以看到,x向量的各个元素都变无穷大了,迭代发散2. 设计思想要求针对上述题目,详细分析每种算法的设计思想。
求解线性方程组的迭代法,其实质是将所给的方程组逐步地对角化或三角化,即将线性方程组的求解过程加工成对角方程组或三角方程组求解过程的重复。
⑴Jacobi迭代:将一般形式的线性方程组归结为对角方程组求解过程的重复;⑵Gauss-Seidel迭代:将一般形式的线性方程组的求解归结为下三角方程组求解过程的重复;⑶超松弛法:选择合适的松弛因子,利用旧值生成新值,使迭代加速;四.实验体会对实验过程进行分析总结,对比求解线性方程组的不同方法的优缺点,指出每种方法的设计要点及应注意的事项,以及自己通过实验所获得的对线性方程组求解问题的各种解法的理解。
西京学院数学软件实验任务书实验四实验报告一、实验名称:线性方程组的J-迭代,GS-迭代,SOR-迭代。
二、实验目的:熟悉线性方程组的J-迭代,GS-迭代,SOR-迭代,SSOR-迭代方法,编程实现雅可比方法和高斯-赛德尔方法求解非线性方程组12123123521064182514x x x x x x x x +=⎧⎪++=⎨⎪++=-⎩的根,提高matlab 编程能力。
三、实验要求:已知线性方程矩阵,利用迭代思想编程求解线性方程组的解。
四、实验原理:1、雅可比迭代法(J-迭代法):线性方程组b X A =*,可以转变为:迭代公式(0)(1)()k 0,1,2,....k k J XXB X f +⎧⎪⎨=+=⎪⎩ 其中b M f U L M A M I B J 111),(---=+=-=,称J B 为求解b X A =*的雅可比迭代法的迭代矩阵。
以下给出雅可比迭代的分量计算公式,令),....,()()(2)(1)(k n k k k X X X X =,由雅可比迭代公式有b XU L MXk k ++=+)()1()(,既有i ni j k i iji j k iij k iij b X aXa X a +--=∑∑+=-=+1)(11)()1(,于是,解b X A =*的雅可比迭代法的计算公式为⎪⎩⎪⎨⎧--==∑∑-=+=+)(1),....,(111)()()1()0()0(2)0(1)0(i j n i j k j ij k j ij i ii k iTn X a X a b a X X X X X 2、 高斯-赛德尔迭代法(GS-迭代法):GS-迭代法可以看作是雅可比迭代法的一种改进,给出了迭代公式:⎪⎩⎪⎨⎧--==∑∑-=+=+++)(1),....,(111)1()1()1()0()0(2)0(1)0(i j n i j k j ij k j ij i ii k iTn X a X a b a X X X X X 其余部分与雅克比迭代类似。
实验4 解线性方程组的迭代法一、稀疏矩阵的生成和运算实验内容:稀疏矩阵相关命令的熟悉。
实验要求:1、熟悉sparse、full、nnz、spy等命令的使用方法.(实验报告)注意:spy使用时要加上输入参数,直接运行spy会出现与本课程无关的结果。
2、了解sprand命令的用法。
3、熟悉speye、condest、normest、spdiags等命令的使用方法,并生成107阶的三对角矩阵:(实验报告)二、大型稀疏线性方程组的求解实验内容:用不同的迭代法求解n阶大型稀疏矩阵Ax=b(n=1e+4)。
实验要求:(1)数学问题的生成:(a)使用sprand命令生成,稀疏度0.001,并通过spy观察矩阵的结构;(b)运行PPT第21页的两段代码,分别生成A,运行结果有什么区别?注意:如果用稠密方式生成矩阵,可能会导致内存不够。
(2)增大矩阵阶数到1e+6,使用MATLAB自带的pcg与“\”运算,以及分别Gauss消去法、Jacobi迭代法和Gauss-Seidel迭代法分别求解以下Sx=b,看看运算时间对比:(实验报告)b为全1向量,S为以下代码所生成:m=1000,n=m*m;eone=ones(m,1);s=spdiags([-eone,8*eone,-eone],[-1,0,1],m,m);E=speye(m);a1=blkdiag(kron(E,s));a2=spdiags([ones(n,1)],[m],n,n);A=a1-a2-a2';注意:pcg命令只适用于对称正定矩阵三、病态的线性方程组的求解实验内容:考虑方程组Hx=b的求解,其中系数矩阵H为Hilbert矩阵,首先给定解(例如取为各个分量均为1)再计算出右端b的办法给出确定的问题。
实验要求:(1)设定n=6,分别用Gauss消去法、Jacobi迭代法和Gauss-Seidel迭代法求解方程组,其各自的结果如何?各方法的误差比较如何?(实验报告)(2)逐步增大问题的维数100、1000、3000,仍然用上述的方法来解它们,计算的结果如何?计算的结果说明了什么?(实验报告)。
数值分析实验报告三求解线性方程组的迭代方法和插值法(2学时)班级专业 信科3 姓名 梁嘉城 学号201130760314日期一 实验目的1.掌握求解线性方程组的简单迭代法; 2. 掌握求解线性方程组的赛德尔迭代法。
3. 掌握不等距节点下的牛顿插值公式以及拉格朗日插值公式。
二 实验内容1.使用简单迭代法求解方程组(精度要求为610-=ε):⎪⎩⎪⎨⎧=+-=++=++301532128243220321321321x x x x x x x x x 2.使用赛德尔迭代法求解上述方程组(精度要求为610-=ε): 3.已知函数表:用拉格朗日插值公式计算01.54.1==y x 以及所对应的近似值。
4. 已知函数表:用牛顿插值公式求)102(y 的近似值。
三 实验步骤(算法)与结果1#include<stdio.h>main(){float a[3][4]={20,2,3,24,1,8,1,12,2,-3,15,30};for(int i=0;i<=2;i++){for(int j=0;j<=2;j++){a[i][j]=(-1)*a[i][j];}}a[0][0]=20;a[1][1]=8;a[2][2]=15;float x=0,y=0,z=0;float X,Y,Z;for(int q=0;q<=1000;q++){X=(y*a[0][1]+z*a[0][2]+a[0][3])/a[0][0];Y=(x*a[1][0]+z*a[1][2]+a[1][3])/a[1][1];Z=(x*a[2][0]+y*a[2][1]+a[2][3])/a[2][2];x=X;y=Y;z=Z;}printf("方程组的解是X=%9.6f,Y=%9.6f,Z=%9.6f\n",X,Y,Z); }2#include<stdio.h>main(){float a[3][4]={20,2,3,24,1,8,1,12,2,-3,15,30};for(int i=0;i<=2;i++){for(int j=0;j<=2;j++){a[i][j]=(-1)*a[i][j];}}a[0][0]=20;a[1][1]=8;a[2][2]=15;float x=0,y=0,z=0;for(int q=0;q<=1000;q++){x=(y*a[0][1]+z*a[0][2]+a[0][3])/a[0][0];y=(x*a[1][0]+z*a[1][2]+a[1][3])/a[1][1];z=(x*a[2][0]+y*a[2][1]+a[2][3])/a[2][2];}printf("方程组的解是X=%9.6f,Y=%9.6f,Z=%9.6f\n",x,y,z); }3.#include<stdio.h>main(){float x[3]={1.14,1.36,1.45};float y[3]={5.65,4.15,3.14};float Y;Y=(1.4-x[2])*y[1]/(x[1]-x[2])+(1.4-x[1])*y[2]/(x[2]-x[1] );float X;X=(5.01-y[1])*x[0]/(y[0]-y[1])+(5.01-y[0])*x[1]/(y[1]-y[ 0]);printf("由拉格朗日插值公式得当X=1.4时,Y=%f,当Y=5.01时,X=%f\n",Y,X);}4.#include<stdio.h>main(){float x[5]={93.0,96.2,100.00,104.2,108.7};float y[5]={11.38,12.80,14.70,17.07,19.91};float dy1,dy2,dy3,dy4;float ddy1,ddy2,ddy3;float dddy1,dddy2;float ddddy;dy1=(y[0]-y[1])/(x[0]-x[1]);dy2=(y[1]-y[2])/(x[1]-x[2]);dy3=(y[2]-y[3])/(x[2]-x[3]);dy4=(y[3]-y[4])/(x[3]-x[4]);ddy1=(dy1-dy2)/(x[0]-x[2]);ddy2=(dy2-dy3)/(x[1]-x[3]);ddy3=(dy3-dy4)/(x[2]-x[4]);dddy1=(ddy1-ddy2)/(x[0]-x[3]);dddy2=(ddy2-ddy3)/(x[1]-x[4]);ddddy=(dddy1-dddy2)/(x[0]-x[4]);float Y;Y=y[3]+(102-x[3])*dy3+(102-x[3])*(102-x[2])*ddy2+(1002-x [3])*(102-x[2])*(102-x[1])*dddy1;printf("由牛顿插值公式得当X=102时,Y=%f\n",Y);}四实验收获与教师评语利用计算机实现了线性方程组的简单迭代法,赛德尔迭代法以及不等距节点下的牛顿插值公式以及拉格朗日插值公式。
仿真平台与工具应用实践Jacobi迭代法求解线性方程组实验报告院系:专业班级:姓名:学号:指导老师:一、实验目的熟悉Jacobi迭代法原理;学习使用Jacobi迭代法求解线性方程组;编程实现该方法;二、实验内容应用Jacobi迭代法解如下线性方程组:, 要求计算精度为三、实验过程(1)、算法理论迭代格式的引出是依据迭代法的基本思想: 构造一个向量系列, 使其收敛至某个极限, 则就是要求的方程组的准确解。
Jacobi迭代将方程组:在假设, 改写成如果引用系数矩阵, 及向量, , ,方程组(1)和(2)分别可写为: 及, 这样就得到了迭代格式用迭代解方程组时, 就可任意取初值带入迭代可知式, 然后求。
但是, 比较大的时候, 写方程组和是很麻烦的, 如果直接由, 能直接得到, 就是矩阵与向量的运算了, 那么如何得到, 呢?实际上, 如果引进非奇异对角矩阵将分解成:要求的解, 实质上就有而是非奇异的, 所以存在, 从而有我们在这里不妨令就得到迭代格式:(2)算法框图(3)、算法程序m 文件:function x=jacobi(A,b,P,delta,n)N=length(b); %返回矩阵b的最大长度for k=1:nfor j=1:Nx(j)=(b(j)-A(j,[1:j-1,j+1:N])*P([1:j-1,j+1:N]))/A(j,j);enderr=abs(norm(x'-P)); %求(x'-P)模的绝对值P=x';if(err<delta) %判断是否符合精度要求break;endendE=eye(N,N); %产生N行N列矩阵D=diag(diag(A));f=A*inv(D); %f是A乘D的逆矩阵B=E-f;Px=x';k,errBMATLAB代码:>> clear allA=[4, -1, 1;4, -8, 1;-2, 1, 5];b=[7, -21, 15]';P=[0,0,0]';x=jacobi(A,b,P,1e-7,20)(4)、算法实现用迭代法求解方程组:正常计算结果是2, 3, 4 , 下面是程序输出结果:P =2.00004.00003.0000k =17err =9.3859e-008B =0 -0.1250 -0.2000-1.0000 0 -0.20000.5000 0.1250 0x =2.00004.00003.0000四、实验体会五、MATLAB是非常实用的软件, 能够避免大量计算, 简化我们的工作, 带来便捷。
实验三 解线性方程组的迭代法实验目的1. 深入理解Jacobi 迭代法和Gauss-Seide 迭代法2. 通过对两种迭代法的程序设计,提高程序设计能力3. 应用编写的程序解决具体问题,掌握两种基本迭代法的使用,通过结果的分析 了解每一种迭代法的特点实验要求(1) 认识迭代法收敛的含义以及迭代初值和方程组系数矩阵性质对收敛速度的 影响。
(2) 迭代法收敛速度试验、病态的线性方程组的求解实验题目3.1用迭代法求解方程组Ax 二b ,其中A R 20 20,它的每条对角钱元素是常数,(1)选取不同的初始向量x (0)和不同的方程组右端项向量 b ,给定迭代误差要 求,用Jacobi 迭代法和Gauss-Seide 迭代法计算,观测得到的迭代向量序列是否 均收敛?若收敛;记录迭代次数,分析计算结果并得出你的结论;(2)取定右端向量b 和初始向量x (0),将A 的主对角线元素成倍增长若干次, 非主对角线元素不变,每次用Jacobi 迭代法计算,要求迭代误差满足 ||x (k1) -x (k)||L :10°。
比较收敛速度,分析现象并得出你的结论。
(1) 1.选取初始向量为x (0)=zeros(20,1), 右端向量b=o nes(20,1),eps=1.0e-5;①实验程序(Jacobi 迭代法)fun ctio n [x, n]=jacobi(A,b,xO,eps,M) %A 为方程组得系数矩阵 %b 为方程组得右端项-1/2 -1/43 -1/2 -1/4-1/23-1/2++* +-1/4-1/4-1/2 3 -1/2-1/4-1/233 -1/2 -1/4 A =%x0为初始向量%eps为精度要求%册最大迭代次数%x为方程组的解%n为迭代次数eps=1.0e-5; %精度要求M=200; %最大迭代次数A=zeros(20,20);for i=1:1:20A(i,i)=3;endfor i=1:1:20for j=1:1:20if abs(i-j)==1A(i,j)=-1/2;endendendfor i=1:1:20for j=1:1:20if abs(i-j)==2A(i,j)=-1/4;endendendb=o nes(20,1);x0=zeros(20,1);D=diag(diag(A)); %取A 的对角阵L=-tril(A,-1); %取A 的下三角阵U=-triu(A,1); %取A 的上三角阵B=D\(L+U);f=D\b;x=B*xO+f;n=1;disp(['第’,num2str(n),'步求解结果为:’]);disp(x);while no rm(x-x0)>=epsx0=x;x=B*x0+f;n=n+1;disp([ '第’,num2str(n),'步求解结果为:’]);disp(x);if (n>=M)disp( 'Warni ng: 迭代次数太多,可能不收敛r);return ;endenddisp('最终结果为:’);disp( 'x=');disp(x);disp([ 'n=' ,nu m2str( n)]);实验结果最终结果为:x=0.48160.57340.63280.65210.66090.66430.66570.66630.66650.66660.66660.66650.66630.66570.66430.66090.65210.63280.57340.4816n=18②实验程序(Gauss-Seide迭代法)function [x,n]=gauseidel(A,b,x0,eps,M)%A为方程组得系数矩阵%b为方程组得右端项%x0为迭代初始向量%eps为精度要求%册最大迭代次数%x为方程组的解%n为迭代次数eps=1.0e-5; %精度要求M=200; %最大迭代次数A=zeros(20,20);for i=1:1:20A(i,i)=3;endfor i=1:1:20for j=1:1:20if abs(i-j)==1A(i,j)=-1/2;endendendfor i=1:1:20for j=1:1:20if abs(i-j)==2A(i,j)=-1/4;endendendb=o nes(20,1);x0=zeros(20,1);D=diag(diag(A)); %取A 的对角阵L=-tril(A,-1); %取A 的下三角阵U=-triu(A,1); %取A 的上三角阵B=D\(L+U);f=D\b;x=B*xO+f;n=1;disp(['第’,num2str(n),'步求解结果为:’]);disp(x);while no rm(x-x0)>=epsx0=x;x=B*x0+f;n=n+1;disp([ '第’,num2str(n),'步求解结果为:’]);disp(x);if (n>=M)disp( 'Warning: 迭代次数太多,可能不收敛r );return ;endenddisp('最终结果为:’);disp( 'x=');disp(x);disp([ 'n=' ,nu m2str( n)]);实验结果最终结果为:x=0.48160.57340.63280.65210.66090.66430.66570.66630.66650.66660.66660.66650.66630.66570.66430.66090.65210.63280.57340.4816n=182. 选取初始向量为x(0)=zeros(20,1) ,右端向量b=1.001*ones(20,1),eps=1.0e-5①实验程序(Jacobi迭代法)修改:b=1.001*ones(20,1),其余同上实验结果最终结果为:x=0.48210.57400.63340.65280.66160.66500.66640.66690.66720.66720.66720.66720.66690.66640.66500.66160.65280.63340.57400.4821n=18②实验程序(Gauss-Seide迭代法)同上实验结果最终结果为:x=0.48210.57400.63340.65280.66160.66500.66640.66690.66720.66720.66720.66720.66690.66640.66500.66160.65280.63340.57400.4821n=18(0)3. 选取初始向量为x =ones(20,1) ,右端向量b=ones(20,1),eps=1.0e-5 ;①实验程序(Jacobi迭代法)修改:x(0)= ones(20,1) ,b=ones(20,1),其余同1实验结果最终结果为:x=0.48160.57340.63280.65210.66090.66430.66570.66630.66650.66660.66660.66650.66630.66570.66430.66090.65210.63280.57340.4816n=17②实验程序(Gauss-Seide迭代法)同上实验结果最终结果为:x=0.48160.57340.65210.66090.66430.66570.66630.66650.66660.66660.66650.66630.66570.66430.66090.65210.63280.57340.4816 n=17结果分析:不管用哪种迭代法,改变初始向量,右端向量,用有限的迭代次数,都能得到收敛结果且满足误差要求。
线性⽅程组的J-迭代,GS-迭代,SOR-迭代,SSOR-迭代⽅法西京学院数学软件实验任务书【实验课题】雅克⽐迭代、⾼斯—赛德尔迭代、超松弛迭代【实验⽬的】学习和掌握线性代数⽅程组的雅克⽐迭代、⾼斯—赛德尔迭代、超松弛迭代法,并且能够熟练运⽤这些迭代法对线性⽅程组进⾏求解。
【实验内容】 1、问题重述:对于线性⽅程组A b X =,即:1111221n 12112222n 21122nn n n n n n na x a x a xb a x a x a x b a x a x a x b +++=??+++=??+++= (1),其中,111212122111 0 - - 0 - 0 0 () - - - 0 n ij n nn n nn nn a a a a a a a a a a ?--A ==--??0n D L U≡--()1,n b b b T=如何运⽤雅克⽐迭代、⾼斯—赛德尔迭代、超松弛迭代法对线性⽅程组进⾏求解。
2、⽅法原理: 2.1雅克⽐迭代迭代思想:⾸先通过A b X =构造形如()x f x =的等式,然后给定⼀个初值(0)(0)(0)(0)12(,,)n x x x X = ,再通过(1)()()k k f +X =X 进⾏迭代。
step1 :对(1)相应第i ⾏中的i x ⽤其它元素表⽰为:11111121111122,12211111()()11()()11()()n nj j j j j j n ni i ij ji j j j i j i j iin nn n nj j n n nj j j j nn nn x b a x x b a x a a x b a x x b a x a a x b a x x b a x a a ===≠=-==?=-=+-??=-=+-??=-=+-∑∑∑∑∑∑即:()D b L U X =-+XStep 2 :进⾏迭代(0)(0)(0)(0)12(1)11()(,,)()n k k x x x D b D L U +--?X =?X=-+X ? ,0,1,2k = ,取它的判断条件为()(1)k k -X -X ⼩于⼀个确定的误差值ε,跳出循环。
1 / 8数值分析实验六:解线性方程组的迭代法2016113 张威震1 病态线性方程组的求解1.1 问题描述理论的分析表明,求解病态的线性方程组是困难的。
实际情况是否如此,会出现怎样的现象呢?实验内容:考虑方程组Hx=b 的求解,其中系数矩阵H 为Hilbert 矩阵,,,1(),,,1,2,,1i j n n i j H h h i j n i j ⨯===+-这是一个著名的病态问题。
通过首先给定解(例如取为各个分量均为1)再计算出右端b 的办法给出确定的问题。
实验要求:(1)选择问题的维数为6,分别用Gauss 消去法、列主元Gauss 消去法、J 迭代法、GS 迭代法和SOR 迭代法求解方程组,其各自的结果如何?将计算结果与问题的解比较,结论如何?(2)逐步增大问题的维数(至少到100),仍然用上述的方法来解它们,计算的结果如何?计算的结果说明了什么?(3)讨论病态问题求解的算法1.2 算法设计首先编写各种求解方法的函数,Gauss 消去法和列主元高斯消去法使用实验5中编写的函数myGauss.m 即可,Jacobi 迭代法函数文件为myJacobi.m ,GS 迭代法函数文件为myGS.m ,SOR 方法的函数文件为mySOR.m 。
1.3 实验结果1.3.1 不同迭代法球求解方程组的结果比较选择H 为6*6方阵,方程组的精确解为x* = (1, 1, 1, 1, 1, 1)T ,然后用矩阵乘法计算得到b ,再使用Gauss 顺序消去法、Gauss 列主元消去法、Jacobi 迭代法、G-S 迭代法和SOR 方法分别计算得到数值解x1、x2、x3、x4,并计算出各数值解与精确解之间的无穷范数。
Matlab 脚本文件为Experiment6_1.m 。
迭代法的初始解x 0 = (0, 0, 0, 0, 0, 0)T ,收敛准则为||x(k+1)-x(k)||∞<eps=1e-6,SOR方法的松弛因子选择为w=1.3,计算结果如表1。
实验 高斯——赛德尔迭代法一·实验目的1·熟悉求解线性方程组的有关理论和方法;2·能编程实现雅可比及高斯-塞德尔迭代法、列主元高斯消去法、约当消去,追赶法;3·通过测试,进一步了解各种方法的优缺点;4·根据不同类型的方程组,选择合适的数值方法。
二·实验内容高斯赛德尔迭代法用C 语言在计算机表达出来。
三·实验原理无论是三次样条还是拟合问题最终都归结为线性方程组,求解线性方程组在数值分析中非常重要,在工程计算中也不容忽视。
线性方程组大致分迭代法和直接法。
只有收敛条件满足时,才可以进行迭代。
雅可比及高斯-塞德尔是最基本的两类迭代方法,最大区别是迭代过程中是否引用新值进行剩下的计算。
消元是最简单的直接法,并且也十分有效的,列主元高斯消去法对求解一般的线性方程组都适用,同时可以用来求矩阵对应的行列式。
约当消去实质是经过初等行变换将系数矩阵化为单位阵,主要用来求矩阵的逆。
在使用直接法,要注意从空间、时间两方面对算法进行优化。
高斯-塞德尔迭代:⎪⎪⎭⎫ ⎝⎛--=∑∑+=-=++n i j k j ij i j k j ij i ii k i x a x a b a x 1)(11)1()1(1 n i ,...,2,1= 四·程序代码#include "iostream.h"#include "iomanip.h"int main(){int i,j,k=0,m,n;double t1,t2,e1,e2=0.0;cout<<"请输入精度e :";cin>>e1;cout<<"请输入系数矩阵行数:";cin>>m;cout<<"请输入系数矩阵列数:";cin>>n;cout<<endl;double (**a)=new double *[m];for(i=0;i<=m;i++){a[i]=new double[n];}double (*b)=new double [m];double (*x)=new double [n];cout<<"请输入系数矩阵:"<<endl;cout<<"------------------------------------------------------------------------"<<endl;for(int num1=0;num1<m;num1++){for(int num2=0;num2<n;num2++){cin>>a[num1][num2];}cout<<endl;}cout<<"输入的系数矩阵为:"<<endl;for (int num3=0;num3<m;num3++){for(int num4=0;num4<n;num4++){cout<<a[num3][num4]<<" ";}cout<<endl;}cout<<"------------------------------------------------------------------------"<<endl;cout<<"请输入矩阵b:"<<endl;cout<<"------------------------------------------------------------------------"<<endl;for(int num5=0;num5<m;num5++){cin>>b[num5];}cout<<"输入的矩阵b为:"<<endl;for(int num6=0;num6<m;num6++){cout<<b[num6]<<" ";}cout<<endl;cout<<"------------------------------------------------------------------------"<<endl;for(int num7=0;num7<n;num7++){x[num7]=0.0000;}do{cout<<"第"<<k<<"次迭代值:";e2=0.0;for(i=0;i<m;i++){double sum=0.0;for(j=0;j<n;j++){if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]-sum)/a[i][i];e2=(x[i])-t1>=0?(x[i])-t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<<setprecision(8)<<x[i]<<" ";}cout<<endl;k++;}while(e2>=e1&&k<30);cout<<"共迭代了"<<k<<"次";delete[]a;delete[]b;delete[]x;return 0 ;}五·运算结果六·总结考虑线性方程组Ax=b,(1)其中A=(ai j)n×n∈n×n为n阶方阵,x∈n和b∈n是n维向量.对系数矩阵A作A=M?N的分裂,M为非奇异矩阵,则对应方程组(1)的基本迭代形式为:x(k+1)=M?1 Nx(k)+M?1b,k=0,1,2,,n(2)其中称M?1N为方程(1)的迭代矩阵,迭代格式(2)是否收敛取决于迭代矩阵M?1N.一般地,对线性方程组(1)的系数矩阵A做如下的分裂A=D?L?U,(3)其中D为非奇异对角矩阵、L为严格下三角矩阵、U为严格上三角矩阵.为讨论方便,当A可逆时,通过初等变换把A的对角元都化简为1,因此A=I?L?U.对于形如式(3)的系数矩阵,Gauss-Seidel迭代法的迭代矩阵为:G=(I?L)?1U.虽然迭代法是求解线性方程组的主要方法,但是当系数矩阵的条件数较大时,系数矩阵对于求解线性方程组是病态的,此时迭代法会出现不收敛和收敛速度慢的情况;对于迭代法收敛速度慢的问题,采用适当的预处理技术,可以使系数矩阵的特征值分布更加集中,降低矩阵的条件数,改良矩阵的病态特性.。
广东金融学院实验报告课程名称:数值分析实验目的及要求实验目的:题一:通过数值实验,从中体会解线性方程组选主元的必要性和LU分解法的优点,以及方程组系数矩阵和右端向最的微小变化对解向最的影响。
比较各种直接接法在解线性方程组中的效果;题二:认识齐种迭代法收敛的含义、影响齐迭代法收敛速度的因素。
实验要求:题一:(1)在MATLAB中编写程序用列主元高斯消去法和LU分解求解上述方程组,输出曲b中矩阵A 及向量b和A二LU分解中的L及U, detA及解向量X.(2)将方程组中的2. 099999改为2. 1, 5. 900001改为5. 9,用列主元高斯消去法求解变换后的方程组,输出解向最x及detA,并与(1)中的结果比较。
(3)用MATLAB的内部函数inv求出系数矩阵的逆矩阵,再输入命令x=inv(A)*b,即可求出方程组的解。
请与列主元高斯消公法和LU分解法求出的解进行比较,体会选主元的方法具有良好的数值稳定性。
用MATLAB的内部曲数det求出系数行列式的值,并与(1)、(2)中输出的系数行列式的值进行比较。
(4)比较以上各种直接解法在解线性方程组中的效果。
题二:(1)选取不同的初始向M:X(0)及右端向最b,给泄迭代误差要求,用Jacobi迭代法和Gauss-Seidel迭代法求解,观察得到的序列是否收敛?若收敛,记录迭代次数,分析计算结果并得出你的结论。
列岀算法清单。
(2)用SOR迭代法求上述方程组的解,松弛系数血取1<69<2的不同的三个值,在< 10"5时停止迭代,记录迭代次数,分析计算结呆与松弛系数血的关系并得出你的结论。
(3)用MATLAB的内部函数inv求出系数矩阵的逆矩阵.再输入命令^inv(A)*b>即可求出上述各个方程组的解.并与上述三种方法求出的解进行比较。
请将比较结果列入卜表。
方程组的解X1 Xr■迭代次数误差楮确解Jacibi解法Gause・seidel 解法SOR 解法00= 60= 60=实验环境及相关情况(包含使用软件、实验设备、主要仪器及材料等)1. Win72. Mat lab 7.0实验内容及步骤(包含简要的实验步骤流程) 实验内容:题一:解卜列线性方程组'10 -7‘X 】、(8、-3 2.099999 62Xr5.9000015-1 5 -15、12> 0< 1 >题二研究解线性方程组 做=b 迭代法的收敛性、收敛速度以及SOR 方法中/佳松弛因子的选取问题, 用迭代法求解做二b,其中・4 -1r■7 A=4 -81 ,b =-21-2 ■1515实验结果(包括程序或图表、结论陈述.数据记录及分析等,可附页)题一:直接解法解线性方程组(1)列主兀高斯消去法与LU 分解求解列主元高斯消去法:编写matalab 程序(见附录gaosi.m ),输出矩阵10.000 -7.000 0.000= 0.000 2.5000-5.000一 0.000 0.0006.0000020.000 0.000 0.000向量8 b =1 8.300 L5.0800J解向量:X = (0 ・-1 , 1 r I )7 其中系数行列式的值det (A )=762.00009LU 分解求解:编J matalab 程序(见附录zhjLU. m 和LU ・m ),执行输出:-1.5 2.300 5.080-3.0001.000000.00000.5000 -25000001.0000 0.2000 -24000000.9600 10.0000 -7.0000 0.0000 1.0000n = 0.0000-0.0000010.0000 2.3000 —0.0000 0.000015000000 57500000.0000 0.0000 0.0000 5.0800在matlab 命令窗II 输入L*U ,可以得到A 二L*U ,即分解结果正确。
实验报告一一、实验目的理解线性方程组直接法与迭代法思想,掌握常用算法的设计,掌握用MATLAB 实现的数值解法。
二、实验题目实验一 线性方程组迭代法实验 1、 迭代法的收敛速度用迭代法分别对n=20,n=200解方程组,b Ax =其中nn A ⨯⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛------------------=431513143151513143151513143151513143151314(1) 选取不同的初值0x 和不同的右端向量b,给定迭代误差,用两种迭代法计算,观测得到的迭代向量并分析计算结果给出结论;(2) 取定初值0x 和右端向量b,给定迭代误差,将A 的主对角元成倍放大,其余元素不变,用Jacobi 迭代法计算多次,比较收敛速度,分析计算结果并给出结论。
2、 SOR 迭代法松弛因子的选取用逐次超松弛(SOR )迭代法求解方程组,b Ax =其中 .5555551221212211212212121221121221212200199198321⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛----------=x x x x x x A (1) 给定迭代误差,选取不同的超松弛因子1>ω进行计算,观测得到的近似值向量并分析计算结果,给出你的结论;(2) 给定迭代误差,选取不同的低松弛因子1<ω进行计算,观测得到的近似值向量并分析计算结果,给出你的结论。
三、实验原理Jacobi 迭代法算法:步1 取初始点()0x ,精度要求ε,最大迭代次数N ,置0:=k ;步 2 由()n i x a b a x ni j j j ij i ii k i,,1,1,11 =⎪⎪⎭⎫⎝⎛-=∑≠=+ 或()b D x A D D x k 111)(--++-= 计算()1+k x ; 步3 若()()ε≤-∞+k k xx1,则停算,输出()1+k x作为方程组的近似解; 步4 若N k =,则停算,输出迭代失败信息;否则置1+=k k ,转布2。
迭代法实验报告 一. 实验目的:掌握迭代方法的用处 二. 实验环境:Cfree5.0 三. 实验时间:2013年6月20日 四. 实验地点:电子信息楼1201教室 五. 实验内容:运用编程实现迭代方法可以更好的解线性方程组,得到线性方程的解。
六. 实验理论依据:高斯-赛德尔(Gauss-Seidel )迭代公式我们注意到在雅可比迭代法中并没有对新算出的分量11k x +,12k x +,,11k i x +-进行充分利用.不妨设想,在迭代收敛的条件下,我们把(1)()()()11211331111(1)()()()22112332222(1)()()()1122,111()1(1(k k k k n n k k k k n n k k k k n n n n n n nn x a x a x a x b a x a x a x a x b a x a x a x a x b a +++--⎧=---+⎪⎪⎪=---+⎪⎨⎪⎪⎪=---+⎪⎩式中第一个方程算出的11k x +立即投入到第二个方程中,代替()1k x 进行计算,当12k x +算出后代替()2k x 马上投入到第三个方程中计算,依次进行下去,这样也许会得到更好的收敛效果.根据这种思路建立的一种新的迭代格式,我们称为高斯-赛德尔(Gauss-Seidel )迭代公式,高斯=赛德尔迭代法的分量形式:(1)()()()11211331111(1)(1)()()22112332222(1)(1)(1)(1)1122,111()1(1(k k k k n n k k k k n n k k k k n n n n n n nn x a x a x a x b a x a x a x a x b a x a x a x a x b a +++++++--⎧=---+⎪⎪⎪=---+⎪⎨⎪⎪⎪=---+⎪⎩高斯-赛德尔迭代法的矩阵形式:(1)(),(0,1,2,)k k x Bx f k +=+=其中1()B D L U -=-,1()f D L b -=- B 称为高斯-赛德尔迭代矩阵,f 称为高斯-赛德尔迭代常量..七. 运行代码如下:#include"stdio.h"#include"math.h"int main(){bool pan1=true;int n,n1,n2=0,k=0;doublenum[100][100],L[100][100],U[100][100],x[100],y[100],num1=0,b[100],D[100][100],x1[200][200],x2[200][200];printf("\n");printf("*******************************高斯迭代法解如下********************************");printf("输入要输入矩阵的阶数为(按Enter 输入矩阵数字):");//输入矩阵的阶数scanf("%d",&n1);for(int i=0;i<n1;i++)//输入矩阵的数{printf("输入第%d行数字为(按Enter进入下一行的输入):",i+1);for(int j=0;j<n1;j++){scanf("%lf",&num[i][j]);}}//输入矩阵的数结束for(int i=0;i<n1;i++)//求解对角线上的矩阵数{for(int j=0;j<n1;j++){if(i==j){D[i][j]=num[i][j];L[i][j]=0;U[i][j]=0;}if(i>j){L[i][j]=-num[i][j];}if(i<j){U[i][j]=-num[i][j];}}}//求解对角线上的矩阵数结束printf("=================================输出D的矩阵为==================================");for(int i=0;i<n1;i++)//输出D矩阵 {for(int j=0;j<n1;j++){printf("%10lf",D[i][j]);}printf("\n");}printf("\n");printf("=================================输出L的矩阵为==================================");for(int i=0;i<n1;i++)//输出L矩阵{for(int j=0;j<n1;j++){printf("%10lf",L[i][j]);}printf("\n");}printf("\n");printf("=================================输出U的矩阵为==================================");for(int i=0;i<n1;i++)//输出U矩阵{for(int j=0;j<n1;j++){printf("%10lf",U[i][j]);}printf("\n");}printf("输入矩阵右端常数为(以空格隔开,按回车进行下一步):");//输入b的值for(int i=0;i<n1;i++){scanf("%lf",&b[i]);}//输入b的值结束printf("输入初始化x(0)的矩阵值(以空格隔开,按回车得到结果):");//输入x的值for(int i=0;i<n1;i++){scanf("%lf",&x2[0][i]);}while(pan1)//高斯迭代法的for语句部分 {for(int i=0;i<n1;i++){for(int j=0;j<i;j++){num1+=num[i][j]*x2[k+1][j];}for(int j1=i+1;j1<n1;j1++){num1+=num[i][j1]*x2[k][j1];}x2[k+1][i]=(b[i]-num1)/num[i][i];num1=0;}for(int i=0;i<n1;i++) {if(fabsf(x2[k+1][i]-x2[k][i])<0.002) {n2++;}}if(n2==n1){pan1=false; }else{k++;pan1=true; }}//高斯迭代法的for语句部分结束printf("迭代次数k的值为:%d\n",k);//输出迭代次数printf("输出的迭代法解的结果为:\n"); for(int i=0;i<n1;i++)//输出x的解{printf("第%d个x的值为:%lf\n",i+1,x2[k][i]);}printf("\n");}八.运行结果如下:九.实验心得:高斯=赛德尔迭代法其系数矩阵是严格对角占优的,所以高斯=赛德尔迭代法有很好的收敛性。
数值分析实验报告0 a 12K a1,n 1K a2,n 1UOM则有:第一步: Jacobi 迭代法a1n a2nM , 则有: A D L Uan 1,nAx bA A x D b L U(D L U)x b Dx (L U)x b x D (L U)x D b令J D (L U)则称 J 为雅克比迭代矩阵f D b由此可得雅克比迭代的迭代格式如下:x (0) , 初始向量x (k 1)Jx (k)f ,k 0,1,2,L第二步Gauss-Seidel 迭代法Ax b(D L U )x b (D L)x Ux b x (D L) Ux (D L) b A D L Ua 11a12 La1n a11Aa 21a 22 La2na22M MMMOan1a n2 Lanna11得到 Da22Oann由a 21 0MMOan 1,1 an 1,2L 0anna n1an2La n,na21LMMOan 1,1 an 1,2Lan1an2Lan,n 1a12K a1,n 1 a1n0 Ka 2,n 1a2nOM Man 1,n10令G (D L) U,则称G为Gauss-Seidel 迭代矩阵 f (D L) b由此可得 Gauss-Seidel 迭代的迭代格式如下:x (0) ,初始向量第三步SOR 迭代法w0ADLU1(D1 wL ((1 w)D wU ))(D 1wL)((1 w)D wU )www令Mw1(D wL), N1((1 w)D wU )则有:AMNwwAx bAMLWNM (M N )x b Mx Nx b x MNx M bNM,令Wf Mb带入 N 的值可有L W ((1 w)D wU)(D wL) 1((1 w)D wU) (D wL)f 1bw 1(D wL) 1b1(D wL) w称 L W 为 SOR 迭代矩阵,由此可得 SOR 迭代的迭代格式如下:x(0) ,初始向量二、算法程序Jacobi 迭代法的 M 文件: function [y,n]=Jacobi(A,b,x0,eps) %*************************************************%函数名称 Jacobi 雅克比迭代函数 %参数解释 A系数矩阵 % b常数项 %x0估计解向量x(k 1)Gx (k) f ,k 0,1,2,L(k 1)f,k 0,1,2,L误差范围%eps%返回值解向量%y迭代次数%n%函数功能实现线性方程组的Jacobi 迭代求解%*************************************************n=length(A);if nargin<3error(' 输入错误,最少要输入三个参数'); return;endif nargin==3eps=1e-6;endD=diag(diag(A));L=-tril(A,-1);U=-triu(A,1);M=D;N=L+U;B=M\N;f=M\b;if max(abs(eig(B)))>=1disp(' 谱半径大于等于1,迭代不收敛,无法进行'); return;endn=1;for i=1:1:nif sum(A(i,i)~=n)~=nerror(' 输入的A 矩阵的对角线元素不能为0'); return;endendy=B*x0+f;while norm(y-x0)>=eps&n<100x0=y;y=B*x0+f;n=n+1;endGauss-Seidel 迭代法的M 文件和function[y,n]=GaussSeidel(A,b,x0,eps) %************************************************* %函数名称GaussSeidel高斯赛德尔迭代函数系数矩阵%参数解释A常数项%b%x0估计解向量%eps误差范围%返回值解向量%y迭代次数%n%函数功能实现线性方程组的Jacobi 迭代求解n=1;for i=1:1:nif sum(A(i,i)~=n)~=n0');error(' 输入的A 矩阵的对角线元素不能为return;endendy=B*x0+f;while norm(y-x0)>=eps&n<100x0=y;y=B*x0+f;n=n+1;endSOR 迭代法的M 文件function [y,n]=SOR(A,b,x0,w,eps)%*************************************************%函数名称SOR松弛迭代函数系数矩阵%参数解释A松弛因子%w常数项%b估计解向量%x0误差范围%eps%返回值%y解向量迭代次数endend y=B*x0+f;while norm(y-x0)>=eps&n<100x0=y;y=B*x0+f;n=n+1;end三、数值计算1)首先编写如下程序实现输入大矩阵A:A=zeros(20,20);for i=1:1:20A(i,i)=3;endfor i=1:1:20for j=1:1:20if abs(i-j)==1A(i,j)=-1/2;endendendfor i=1:1:20for j=1:1:20if abs(i-j)==2A(i,j)=-1/4;endend第一次给定初始向量为20 行一列的0,end右端面项向量b=20 行一列的1迭代误差要求0.005Jacobi 迭代法求解:A=zeros(20,20);for i=1:1:20A(i,i)=3;endfor i=1:1:20for j=1:1:20if abs(i-j)==1A(i,j)=-1/2;endendendfor i=1:1:20for j=1:1:20if abs(i-j)==2A(i,j)=-1/4;endendend>> b=ones(20,1);>> x0=zeros(20,1);>> eps=0.005;>> [y,n]=Jacobi(A,b,x0,eps) y =0.48130.57290.63210.65130.66000.66320.66460.66510.66530.66530.66530.66530.66510.66460.66320.66000.65130.63210.57290.4813 n =9>>在Command Window 中输入:Gauss-Seidel 迭代法求解:在Command Window 中输入:A=zeros(20,20);for i=1:1:20A(i,i)=3;endfor i=1:1:20for j=1:1:20if abs(i-j)==1A(i,j)=-1/2;endendendfor i=1:1:20for j=1:1:20if abs(i-j)==2A(i,j)=-1/4;endendend>> b=ones(20,1);>> x0=zeros(20,1);>> eps=0.005;>> [y,n]=GaussSeidel(A,b,x0,eps) y =0.48140.57320.63250.65180.66060.66400.66540.66600.66620.66630.66630.66630.66610.66560.66420.66090.65210.63280.57340.4816 n =7>>第二次给定初始向量为20 行一列的0 右端面项向量b=20 行一列的1.001 迭代误差要求0.005 Jacobi 迭代法求解:在Command Window 中输入A=zeros(20,20);for i=1:1:20A(i,i)=3;endfor i=1:1:20for j=1:1:20if abs(i-j)==1A(i,j)=-1/2;endendend>>>> b=1.001*ones(20,1);>> x0=zeros(20,1);>> eps=0.005;>> [y,n]=Jacobi(A,b,x0,eps) y =0.41460.48560.49780.49990.50020.50030.50030.50030.50030.50030.50030.50030.50030.50030.50030.50020.49990.49780.48560.41467>>Gauss-Seidel 迭代法求解:在Command Window 中输入A=zeros(20,20); for i=1:1:20A(i,i)=3;endfor i=1:1:20for j=1:1:20if abs(i-j)==1A(i,j)=-1/2;endendend>> b=1.001*ones(20,1);>> x0=zeros(20,1);>> eps=0.005;>> [y,n]=GaussSeidel(A,b,x0,eps)y =0.41450.48560.49780.49990.50030.50030.50030.50030.50030.50030.50030.50030.50030.50030.50030.50030.50000.49800.48580.4146n =5观察计算结果得到的序列可以看出其是收敛,在较少的迭代次数下即可的到满足误差要求的解。
2)第一次给定初始向量为20 行一列的0,右端面项向量b=20 行一列的1 迭代误差要求0.00005 松弛因子为1.5 在Command Window 中输入A=zeros(20,20);for i=1:1:20A(i,i)=3;endfor i=1:1:20for j=1:1:20if abs(i-j)==1A(i,j)=-1/2;endendendfor i=1:1:20for j=1:1:20if abs(i-j)==2A(i,j)=-1/4;endendend>> b=ones(20,1);>> x0=zeros(20,1);>> w=1.5;>> eps=1e-5;>> [y,n]=SOR(A,b,x0,w,eps) y =1.0e+012 *-0.5082-0.9690-1.5400-2.1738-2.8767-3.6356-4.4375-5.2635-6.0901-6.8885-7.6243-8.2578-8.7437-9.0319-9.0675-8.7940-7.0831-5.4598-3.5651n =100第二次给定初始向量为20 行一右端列的0,面项向量b=20 行一列的1 迭代误差要求0.00005 松弛因子为1.2在Command Window 中输入A=zeros(20,20);for i=1:1:20A(i,i)=3;endfor i=1:1:20for j=1:1:20if abs(i-j)==1A(i,j)=-1/2;endendend>> b=ones(20,1);>> x0=zeros(20,1);>> w=1.2;>> eps=1e-5;>> [y,n]=SOR(A,b,x0,w,eps)y =0.27920.32460.33190.33310.33330.33330.33330.33330.33330.33330.33330.33330.33330.33330.33330.33340.33310.33480.324621 / 220.387419分析结果:通过对迭代次数及其迭代结果的分析,我的得出的结论是松驰系数ω在SOR 迭代中起着相当重要的作用,不同的松驰系数ω,可能对迭代结果带来很大的影响,恰当的松驰系数ω可以加速收敛,得到较为良好的迭代结果,而不恰当的松驰系数ω选取,则可能会得导致无法获得理想的结果,甚至还可能影响到迭代的收敛性。