实验三 线性方程组的迭代法
求解线性方程组的迭代解法
(4 - 1)
简记为:
an1 x1 an2 x2 ann xn bn
n
aij x j bi
j 1
(i 1,2,, n)
其系数矩阵A非奇异,不妨设aii≠ 0 (1,2,…,n)可将上式 改写为等价方程组:
x1 (
a12 x2 a13x3 a1n xn b1) / a11
但在Jacobi迭代过程中, 对已经算出来的信息未 加充分利用,
即在计算x2(k 1)时, x1(k 1)已经算出, 计算xi(k 1)时, x1(k 1) , x2(k 1) ,, xi(k11) 已经算出,这些前面的最新分量未 被利用,从直观上看,在收敛的
情况下, 这些新值x1(k 1) , x2(k 1) ,, xi(k11)应比旧值x1(k) , x2(k) ,, xi(k1)更 好,更准确一些.因此,如果每计算出一个新的 分量便立即用它取代 对应的旧分量进行迭代 ,可能收敛更快并且只需 要存贮一个近 似解向量即可, 据此想法构造的迭代法 称为高斯 塞德尔 (Gauss Seidel)迭代法,其迭代格式为 :
(3 8)
M ( D L) U x(k1) n
1 ann
(an1x1(k 1)
an2 x2(k 1)
1
a x(k 1) nn1 n1
bn )
其分量形式为
x(k 1) i
1 aii
i 1
(
a x(k 1) ij j
j 1
n
n维点列收敛的一种等价描述是其对应坐标序列均
收敛,向量序列也有类似的结论。
定理1
Rn中的向量序列 x(k) 收敛于Rn中的
线性方程组迭代法收敛性分析
lim Ak 0 .
k
(2.27)
由定理 2.5 知,
( A k ) Ak ,
即
( A)
由(2.27) 和(2.28)可得
k
Ak .
(2.28)
lim ( A) 0
k k
再由矩阵谱半径的定义可知一定有 ( A) 1 . (必要性) 若 ( A) 1 ,则有定理 2.5 的推论可知至少存在一个 0 使得一种范数
若有
lim x ( k ) x* , 即 lim xi( k ) xi* ,
k k
则有 lim x ( k ) x*
k 2
0.
常见的向量范数有: ① 1-范数
x 1 xi ;
i 1
n
② ∞-范数
x
max xi ;
1 i n
③ 2-范数
x 2 ( x ) ;
lim x x* lim G k x x* 0 ,
k
0
k
k
再由向量范数的定义可知
lim x k x* 0 ,
k
即迭代过程收敛. (必要性) 若迭代公式(2.20)收敛,即满足
lim x x* 0
k k
由此推论可知当 ( A) 1 时,至少存在一种范数 A 1 .
定 理 2.6 设 A R nn , 则 lim Ak 0 的 充 要 条 件 为 ( A) 1 . ( 其 中
k
Ak AA A)
k
证明: (充分性) 若 lim Ak 0 ,则由矩阵范数的定义可知
实验3求解线性方程组迭代法与插值法
数值分析实验报告三求解线性方程组的迭代方法和插值法(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);}四实验收获与教师评语利用计算机实现了线性方程组的简单迭代法,赛德尔迭代法以及不等距节点下的牛顿插值公式以及拉格朗日插值公式。
【分析】数值分析迭代法
【关键字】分析数值分析实验报告(3)学院:信息学院班级:计算机0903班姓名:王明强学号:课题三线性方程组的迭代法一、问题提出1、设线性方程组=x= ( 1, -1, 0, 1, 2, 0, 3, 1, -1, 2 )2、设对称正定阵系数阵线方程组=x = ( 1, -1, 0, 2, 1, -1, 0, 2 )3、三对角形线性方程组=x= ( 2, 1, -3, 0, 1, -2, 3, 0, 1, -1 )试分别选用Jacobi 迭代法,Gauss-Seidol迭代法和SOR方法计算其解。
二、要求1、体会迭代法求解线性方程组,并能与消去法做以比较;2、分别对不同精度要求,如由迭代次数体会该迭代法的收敛快慢;3、对方程组2,3使用SOR方法时,选取松弛因子=0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;4、给出各种算法的设计程序和计算结果。
三、目的和意义1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较;gauss消去法是一种规则化的加减消元法。
它的基本思想是:通过逐次消元计算把需要求求解的线性方程转化成上三角形方程组,也就是把线性方程组的系数矩阵转化为上三角矩阵,从而使一般线性方程组求解转化为等价(同解)的上三角方程组的求解。
消去法是直接方法的一种。
优点:对于简单的方程组可以很快得出结果,计算中如果没有舍入误差,在稳定的方程组中容易得到精确解,理论上可以求解任何可以求出解得方程组。
缺点:数值有的时候不稳定(可采用列主元gauss消去法),既要消去,又要回代,算法实现起来比较复杂,不适用于大规模方程组。
迭代法是从某一取定的初始向量x(0)出发,按照一个适当的迭代公式,逐次计算出向量x(1),x(2),......,使得向量序列{ x(k)}收敛于方程组的精确解,这样,对于适当大的k,可取x(k)作为方程组的近似解。
优点:算法简单,程序易于实现,特别适用求解庞大稀疏线性方程组。
数值分析实验3
实验三 解线性方程组的迭代法实验目的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结果分析:不管用哪种迭代法,改变初始向量,右端向量,用有限的迭代次数,都能得到收敛结果且满足误差要求。
数值方法线性方程组的迭代法
迭代法的特点
若在求解过程中 xkx*(k) ,由 xk+1=(xk)产生的迭代 xk 向x*的逼近 ,在数次迭代求解 之后,由于机器跳动产生的xk 值误差或是有效数字产生的舍 入误差,都会在第k+1次迭代 计算中自动弥补过来或逐步纠 正过来。因此,在 迭代求解 过程中产生的各种误差是可以 忽略的,即迭代求解无累积误 差,实际上, xk只是解的一个 近似,机器的舍入误差并不改 变它的此性质。
x ( k ) x* B k ( x ( 0) x*) 由 x ( k ) x * B k ( x ( 0) x*) B k x ( 0) x * B k x ( 0) x *
lim
k
x(k ) x *
定理2:若||B||<1,则迭代法
对矩阵也有类似的结论
下一页
如果 矩阵 A=(aij)满足 n |aii|> |aij|
j=1,ji
i=1,2,……n,
则称方阵A是严格(行)对角占优的.
U
A=
a11 a21 … an1
a12 a13 … a22 a23 … … … … an3 an4 …
-4 2 1 1 -9 7 2 -6 10
定理1:对任意初始向量x(0)及任意右段向量 g,由此产生的迭代向 量序列{x(k)}收敛的充要条件是
B 1
证明:必要性:设{x(k)}收敛,其极限为 x*
x * Bx* g
,则
x ( k ) x * B x ( k 1) x * B k x ( 0 ) x * 两边取极限
引言
• 直接法是通过有限步运算后得到线性方程组的 解,解线性方程组还有另一种解法,称为迭代 法,它的基本思想是将线性方程组 Ax=b 化为 • x=Bx+f • 再由此构造向量序列{x (k)}: • x(k+1)=Bx (k)+f • 若{x (k)}收敛至某个向量x *,则可得向量x *就是 所求方程组 AX=b 的准确解. • 线性方程组的迭代法主要有Jocobi迭代法、 Seidel迭代法和超松弛(Sor)迭代法.
解线性方程组的迭代法
0.9906
0.0355
5 1.01159 0.9953
1.01159 0.01159
6 1.000251 1.005795 1.000251 0.005795
7 0.9982364 1.0001255 0.9982364 0.0017636
可见,迭代序列逐次收敛于方程组的解, 而且迭代7次得到精确到小数点后两位的近似解.
a11x1 a12x2 a13x3 b1 a21x1 a22x2 a23x3 b2 a31x1 a32x2 a33x3 b3
从而得迭代公式
x1
a12 a11
x2
a13 a11
x3
b1 a11
x2
a21 a22
x1
a23 a22
x3
b2 a22
x3
a31 a33
M 00.8 00..75
但(M)=0.8<1,所以迭代法 x(k+1)=Mx(k)+g 是收敛的.
由(3.5)式可见,‖M‖越小收敛越快,且当‖x (k) -x(k-1) ‖很小时,‖x(k) –x*‖就很小,实际中用‖x (k) x(k-1) ‖<作为
迭代终止的条件。 例如,对例1中的Jacobi迭代计算结果
+‖x(k+1) –x*‖‖M‖‖x(k) –x(k-1)‖+‖M‖‖x(k) –x*‖ 从而得‖x(k) –x*‖‖M‖‖x (k) -x(k-1) ‖/(1- ‖M‖)
(3.5) (3.6)
估计式(3.5)得证。利用(3.5)式和
‖x(k+1) 得到
-x(k)
‖‖M‖‖x
(k)
-x(k-1)
‖
解线性方程组 的迭代法
数值计算方法实验报告
本科实验报告课程名称:计算机数值方法实验项目:计算机数值方法实验实验地点: 506 专业班级:学号:学生姓名:指导教师:2012 年 6 月 20 日太原理工大学学生实验报告b=c;printf("%f\n",b);}printf("X的值为:%f\n",c);}五、实验结果与分析二分法割线法分析:由程序知,使用二分法和割线法均能计算出方程的根,但利用割线法要比二分法计算的次数少,并且能够较早的达到精度要求。
相比之下,割线法程序代码量较少,精简明了。
六、讨论、心得本次数值计算方法程序设计实验从习题练习中跳脱出来,直接面对实用性较强的程序代码编写。
效果很好,不仅加深对二分法、割线法的理解,还加强了实际用运能力。
将理论知识成功地转化成实践结果。
实验地点北区多学科综合楼4506指导教师太原理工大学学生实验报告x[i] = y[i];for(j=i+1;j<=n;++j){x[i]-=u[i][j]*x[j];}x[i]/= u[i][i];}for(i=1;i<=n;++i){printf("%\n",x[i]);}return 0;}五、实验结果与分析完全主元素消元法:列主元素消元法:LU分解法:分析:对于两种高斯解方程,完全主元素跟列主元素都是先消元、再回代,由程序段可以发现,始终消去对角线下方的元素。
即,为了节约内存及时效,可以不必计算出主元素下方数据。
列主元素消元法的算法设计上优于完全主元素消元法,它只需依次按列选主元素然后换行使之变到主元素位置,再进行消元即可。
列主元素消元法的耗时比完全主元素法少很多,常采用之。
对于LU分解法,分解矩阵为单位下三角阵L与上三角阵U的乘积,然后解方程组Ly=b,回代,解方程组Ux=y。
其中的L为n阶单位下三角阵、U为上三角阵.六、讨论、心得本次试验中,感觉是最难的一次,完全主元素消元法程序编写过程相对来说花了好长时间。
数值分析实验报告--实验6--解线性方程组的迭代法
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。
线性方程组的直接解法迭代解法
广东金融学院实验报告课程名称:数值分析实验目的及要求实验目的:题一:通过数值实验,从中体会解线性方程组选主元的必要性和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 ,即分解结果正确。
线性方程组的迭代解法及收敛分析
1.9583
0.8468
0.2974
9
1.0975
2.0954
2.8217
1.9788
0.8847
0.2533
10
1.0850
2.0738
2.8671
1.9735
0.8969
0.2041
11
1.0673
2.0645
2.8802
1.9843
0.9200
0.1723
12
1.0577
2.0509
2.9077
1.9828
0.9303
0.1400
13
1.0463
2.0437
2.9191
1.9887
0.9448
0.1174
14
1.0392
2.0350
2.9363
1.9886
0.9527
0.0959
15
1.0318
2.0297
2.9451
1.9920
0.9620
0.0801
16
1.0267
2.0241
Keywords:MATLAB,Mathematical model,Iterative method,ConvergenceSystem of linear equations
1
在实际生活中,存在着大量求解线性方程组的问题。这些方程组具有数据量大,系数矩阵稀疏,在一定精度保证下,只需要求解近似解等特点。线性方程组的迭代解法特别适合于这类方程组的求解,它具有程序设计简单,需要计算机的贮存单元少等特点,但也有收敛性与收敛速度问题。因此,研究线性方程组的迭代解法及收敛分析对于解决实际问题具有非常重要的作用。
线性代数方程组迭代法PPT课件
超松弛法
收敛速度快
总结词
总结词
计算量较大
ABCD
详细描述
超松弛法具有较快的收敛速度,尤其对于大型线 性方程组,能够显著减少迭代次数。
详细描述
由于超松弛法的计算量较大,因此在实际应用中 可能需要考虑计算效率的问题。
CHAPTER 04
迭代法的实现步骤
初始化
设置初值
为方程组的解向量设定一个初始值。
迭代法的应用场景
当方程组的系数矩阵难以直接求解时 ,迭代法可以作为一种有效的替代方 案。
在科学计算、工程技术和经济领域中 ,许多问题可以转化为线性代数方程 组求解,而迭代法在这些领域有广泛 的应用。
迭代法的优缺点
优点
迭代法通常比直接法更加灵活和通用,对于大规模和高维度的线性代数方程组, 迭代法更加高效。
缺点
迭代法需要选择合适的迭代公式和参数,并且需要满足收敛条件,否则可能无 法得到正确的解。此外,迭代法的计算过程比较复杂,需要较高的计算成本。
CHAPTER 02
迭代法的基本原理
迭代法的数学模型
迭代法是一种求解线性代数方程组的数值方法,通过不断迭代逼近方程的 解。
迭代法的数学模型通常表示为:$x_{n+1} = T(x_n)$,其中$x_n$表示第 $n$次迭代时的近似解,$T(x)$表示迭代函数。
03
非线性方程组的迭代法在求解优化问题、控制问题 等领域有广泛应用。
在优化问题中的应用
01
迭代法在优化问题中也有广泛应用,如求解无约束优化问题、 约束优化问题和多目标优化问题等。
02
常见的优化问题迭代法包括梯度下降法、牛顿法和共轭梯度法
等。
这些方法通过不断迭代来逼近最优解,广泛应用于机器学习、
3线性方程组的迭代解法
三、逐次超松弛法(SOR方法)
逐次超松弛法(Successive Over Relaxation Method)可 看成是Gauss-Seidel方法的加速,Seidel迭代法是SOR方法的 特例。将Seidel方法的迭代公式
改写为
x(k1) i
1 aii
(bi
i 1
a x(k 1) ij j
k
0
1
2
3
4
5
6
x1
0
2.5000 2.9773 3.0098 2.9998 2.9999 3.0000
x2
0
2.0909 2.0289 1.9968 1.9997 2.0001 2.0000
x3
0
1.2273 1.0041 0.9959 1.0002 1.0001 1.0000
可见Gauss-Seidel迭代法比Jacobi迭代法收敛要快一些。
x(k 1) BJ x(k ) f J
0
其中
a21
a22
BJ D1(L U )
an1 ann
a12 a11 0
an2 ann
a13 a11
a23 a22
7
a1n1 a11
a2n1 a22
ann1 ann
a1n
a11
a2 n
a22 , fJ D1b
0
二、 Gauss-Seidel 迭代法
x(k ) i
xi(k )
x(k ) i
1 aii
bi
i 1
a x(k 1) ij j
j 1
n
aij
x(jk
)
j i
为加快收敛,在增量 xi(k ) 前加一个因子
线性方程组的迭代法
1 20 D 1b
1 8
24 1.2 12 1.5 1 15 30 2
x1( k 1) 0 0.1 0.15 x1( k ) 1.2 ( k 2) x ( k ) 1.5 0 0.125 2 x2 0.125 ( ( x3k 1) 0.133 3 0.2 0 x3k ) 2.0
将方程组AX=b的系数A分解成 A=D+L+U 其中D=diag(a11,a22,,ann) ,L和U分别是A的 对角线下方元素和上方元素组成的严格下三角 阵与严格上三角阵. 即
0 0 a2 1 0 A a n1 an 2
0 a1 1 0 0 0 a1 2 0 0 a2 2 0 0 0 0 0 0 an n 0 0
k 1 r k 1 0 0 (k )
所以Gauss-Seidel迭代 法收敛.
定理 超松弛法收敛的必要条件为 0<<2
证 设其迭代矩阵G的特征值为1,2,, n , 由于迭代收敛,故有 max i 1 1 i n 从而 det G 12 n (max i ) n 1
a
j 1 j i
n
ij
aii
n
(i 1,2, , n )
aij aii 1
故
GJ
max
1i n j 1 j i
从而Jacobi迭代收敛
* * * * 设方程组的精确解为 X ( x1 , x2 , xn )
数值计算方法第三章 线性方程组迭代法
0,1,2,
取x1(0) 0, x2(0) 0,计算结果如下:
k0
x (k) 1
0
x (k) 2
0
1
2
3
4
0.66667 0.50000 0.61111 0.58333
0.50000 0.16667 0.25000 0.19445
5
6
7
8
9
0.60185 0.59722 0.60031 0.59954 0.6005
从而得迭代式 x(k1) (D L)1Ux (k) (D L)1 b, (k 0,1,2, )
上式中矩阵 M (D L)1U 为Gauss-Seidel迭代矩阵。
输入:A,b, n,
置初值: k 0; xi 0(i 1,L , n)
k k 1;e 0
3xx1 12xx22
2 1
精确到3位有效数字。
解 Gauss Siedel迭代格式为
x (k 1) 1
x (k 1) 2
(2 x2(k) ) / 3 (1 x1(k1) ) / 2
,
k
0,1,
2,L
取x1(0)
0,
x (0) 2
0, 计算结果如下:
0
101
0
1
10
2
1 0 0 101 1 1 5
0 0.1 0.2 0.1 0 0.2
0.2 0.2 0
取初值x (0) (0,0,0)T 代入迭代式
x(1) Bx (0) g (7.2,8.3,8.4)T x(2) Bx(1) g (9.17,10.70,11.50)T ,如此下去, x(9) Bx (1) g (10.9994 ,11.9994 ,12.9992 )T
雅克比迭代法与高斯-赛德尔
实验三 线性方程组的迭代法班级:**计本 ** 班 姓名:** 座号: ** 时间:2010/6/2一、 实验目的(1) 熟悉VC++开发平台和开发语言。
(2) 掌握雅可比及高斯-塞德尔迭代法解方程组的迭代法,并能根据给定的精度要求计算(包括迭代过程);比较两种方法的优劣。
(3) 培养编程和上机调试能力。
二、 实验设备一台PC 机,XP 操作系统,VC++软件三、 实验内容用雅可比迭代法和高斯-塞德尔迭代法解方程组1231231238322041133631236x x x x a x x x x x -+=⎧⎪+-=⎨⎪++=⎩,其精度为10-5。
四、 算法描述1. 雅克比迭代法公式:X[0][k+1] = ( 1 / a[0][0] )*[ b[0] –a[0][1]*X[1][k] – a[0][2]*X[2][k] ]; X[1][k+1] = ( 1 / a[1][1] )*[ b[1] –a[0][0]*X[0][k] – a[0][2]*X[2][k] ]; X[2][k+1] = ( 1 / a[2][2] )*[ b[2] –a[0][0]*X[0][k] – a[0][1]*X[1][k] ];2. 高斯-赛德尔迭代法公式:X[0][k+1] = ( 1 / a[0][0] )*[ b[0] –a[0][1]*X[1][k] – a[0][2]*X[2][k] ]; X[1][k+1] = ( 1 / a[1][1] )*[ b[1] –a[0][0]*X[0][k+1] – a[0][2]*X[2][k] ]; X[2][k+1] = ( 1 / a[2][2] )*[ b[2] –a[0][0]*X[0][k+1] – a[0][1]*X[1][k+1] ];3. 流程图雅克比流程图高斯-赛德尔流程图五、程序代码/*雅克比方法类Jacobi.h*/#ifndef A#define A#define MAX_SIZE 50class Jacobi{public:void Solve(int n,double a[MAX_SIZE][MAX_SIZE],double b[MAX_SIZE],intMAX_XunHuan,double e,int pre);};#endif/*雅克比方法类方法实现Jacobi.cpp*/#ifndef B#define B#include "Jacobi.h"#include "iostream"#include "math.h"#include "iomanip"using namespace std;double X[MAX_SIZE][MAX_SIZE]={0};double E[MAX_SIZE];void Jacobi::Solve(int n,double a[MAX_SIZE][MAX_SIZE],double b[MAX_SIZE],int MAX_XunHuan,double e,int pre){int i,j=1,z;double s=0;int flag=1;cout<<"请输入初始值X[i][0]:";for (i=0;i<n;i++){cin>>X[i][0];}for (j=1;j<MAX_XunHuan&&flag;j++){flag=0;for (i=0;i<n;i++){s=0;for (z=0;z<n;z++){if (i!=z){s+=a[i][z]*X[z][j-1];}}X[i][j]=1.0/a[i][i]*(b[i]-s);}E[j]=fabs(X[0][j]-X[0][j-1]);for (i=1;i<n;i++){if(fabs(X[i][j]-X[i][j-1])>E[j])E[j]=fabs(X[i][j]-X[i][j-1]);}if (E[j]>e){flag=1;}}if(flag==0){for (i=0;i<n;i++){cout<<" X"<<i<<"(k) ";}cout<<" 误差"<<endl;for (i=0;i<j;i++){cout<<setiosflags(ios::left)<<setiosflags(ios::fixed)<<setprecision(pre)<<X[0][i]<<" "<<X[1][i]<<" "<<X[2][i]<<" ";if(i>0){if(i!=j-1)cout<<E[i]<<endl;elsecout<<E[i]<<" < "<<e<<endl;}elsecout<<" ∞"<<endl;}}elsecout<<"没有结果,最大循环次数不够\n";cout<<"迭代次数为"<<j<<endl;}#endif/*/*高斯-赛德尔方法类Gauss.h*/#ifndef C#define C#define MAX_SIZEG 50class Gauss{public:void Solve(int n,double a[MAX_SIZEG][MAX_SIZEG],double b[MAX_SIZEG],int MAX_XunHuan,double e,int pre);};#endif/*高斯-赛德尔方法类方法实现Gauss.cpp*/#ifndef D#define D#include"Gauss.h"#include "math.h"#include "iostream"#include "iomanip"using namespace std;double XG[MAX_SIZEG][MAX_SIZEG]={0};double EG[MAX_SIZEG];void Gauss::Solve(int n,double a[MAX_SIZEG][MAX_SIZEG],double b[MAX_SIZEG],int MAX_XunHuan,double e,int pre){int i,j=1,z;double s=0;int flag=1;cout<<"请输入初始值XG[i][0]:";for (i=0;i<n;i++){cin>>XG[i][0];}for (j=1;j<MAX_XunHuan&&flag;j++){flag=0;for (i=0;i<n;i++){s=0;for (z=0;z<n;z++){if (i!=z){if(z>i)s+=a[i][z]*XG[z][j-1];elses+=a[i][z]*XG[z][j];}}XG[i][j]=1.0/a[i][i]*(b[i]-s);}EG[j]=fabs(XG[0][j]-XG[0][j-1]);for (i=1;i<n;i++){if(fabs(XG[i][j]-XG[i][j-1])>EG[j])EG[j]=fabs(XG[i][j]-XG[i][j-1]);}if (EG[j]>e){flag=1;}}if(flag==0){for (i=0;i<n;i++){cout<<" XG"<<i<<"(k) ";}cout<<" 误差"<<endl;for (i=0;i<j;i++){cout<<setiosflags(ios::left)<<setiosflags(ios::fixed)<<setprecision(pre)<<XG[0][i]<<" "<<XG[1][i]<<" "<<XG[2][i]<<" ";if(i>0){if(i!=j-1)cout<<EG[i]<<endl;elsecout<<EG[i]<<" < "<<e<<endl;}elsecout<<" ∞"<<endl;}}else cout<<"没有结果,最大循环次数不够\n";cout<<"迭代次数为"<<j<<endl;}#endif/*主函数Main*/#include "iostream"#include "Jacobi.h"#include "Jacobi.cpp"#include "Gauss.h"#include "Gauss.cpp"using namespace std;int main(){Jacobi J;Gauss G;int key;int i,j;int pre;double a[MAX_SIZE][MAX_SIZE]={0};double b[MAX_SIZE]={0};int n,MAX_XunHuan;double e;do{cout<<"请输入方程组的阶数:";cin>>n;cout<<"请输入系数矩阵A:";for (i=0;i<n;i++){for (j=0;j<n;j++){cin>>a[i][j];}}cout<<"请输入常数矩阵B:";for (i=0;i<n;i++){cin>>b[i];}cout<<"请输入最大循环次数:";cin>>MAX_XunHuan;cout<<"请输入最小误差:";cin>>e;cout<<"请输入精度输出控制(小数点后的位数)"; cin>>pre;cout<<"结束0:\n雅克比迭代法求解1:\n高斯-赛德尔求解2:";cin>>key;if (key==1){J.Solve(n,a,b,MAX_XunHuan,e,pre);}if (key==2){G.Solve(n,a,b,MAX_XunHuan,e,pre);}} while (key);return 0;}六、实验结果1.这次试验很简单,主要是公式问题,做得很顺利。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5实验三 线性方程组的迭代法、代数插值
5.1实验目的
① 掌握解线性方程组的迭代算法;
② 培养编程与上机调试能力.
③ 掌握拉格朗日插值算法
5.2算法步骤
5.2.1迭代法的基本思想
根据方程组Ax b = 设计出一个迭代公式,然后将任意选取的一初始向量(0)x 代入迭代公式,求出(1)x ,再以(1)x 代入同一迭代公式,求出(2)x ,如此反复进行,
得到向量序列(){}k x .当(){}k x 收敛时,其极限即为原方程组的解.
5.2.2雅可比(Jacobi )迭代法解方程组
设方程组Ax b = 的系数矩阵对角线元素0(1,2,...,)ii a i n ≠=,M 为最大迭代次
数,ε为容许误差. 雅可比(Jacobi )迭代法解方程组算法步骤如下:
① 取初始向量(0)(0)(0)12(,,...,)T n x x x x = ,令0k =.
② 对1,2,...,i n =,计算
(1)
(
)11()n k k i i ij j j ii j i
x b a x a +=≠=-∑ . ③ 如果(1)()1n
k k i i i x x ε+=-<∑,则输出(1)k x + ,结束;否则执行④
④ 如果k M ≥,则不收敛,终止程序;否则1k k ←+,转②
5.3实验题目及参考结果:
题目
应用迭代法解线性方程组1231231
2352828321361x x x x x x x x x ++=⎧⎪+-=⎨⎪--=⎩
参考结果:
雅可比迭代法迭代次数20次,结果如下:
[0] 1.000000
[1] 2.000000[2] 1.000000
x x x =+=+=-if
5.4程序源代码:
#define n 3
#include "math.h"
void shuru(a,b)
float a[n][n],b[n];
{int i,j;
printf ("\ninput the a[i][j] and b[i]:\n"); for (i=0;i<n;i++)
{for (j=0;j<n;j++)
scanf("%f",&a[i][j]);
scanf("%f",&b[i]);
}
for (i=0;i<n;i++)
{for (j=0;j<n;j++)
printf("%11.6f",a[i][j]);
printf("%11.6f\n",b[i]);
}
}
int zhanyou(a)
float a[n][n];
{int i,j;
float s;
for (i=0;i<n;i++)
{s=0;
for (j=0;j<n;j++)
{if (i!=j) s=s+fabs(a[i][j]);}
if((i==j) &&(s>=fabs(a[i][j])) )return(-1); }
return(1);
}
void diedai(a,b)
float a[n][n],b[n];
{int i,j;
float x[n],esp,p,q,s;
printf("\ninput esp=");
scanf("%f",&esp);
printf("\nesp=%f\n\n",esp);
printf("input x0[i]\n");
for (i=0;i<n;i++)
scanf("%f",&x[i]);
for (i=0;i<n;i++)
printf("x0[%d]=%f\n",i+1,x[i]);
p=1+esp;
while (p>esp)
{p=0;
for (i=0;i<n;i++)
{s=0;
for (j=0;j<n;j++)
{if (i!=j) s=s+a[i][j]*x[j];}
for (j=0;j<n;j++)
{ if(i==j) s=(b[i]-s)/a[i][j]; } q=fabs(x[i]-s);
if (q>p) p=q;
x[i]=s;
}
}
for (i=0;i<n;i++)
printf("\nx[%d]=%f",i+1,x[i]);
}
main()
{int k;
float a[n][n],b[n];
shuru(a,b);
k=zhanyou(a);
if(k==1)diedai(a,b);
else printf("\n****fail****\n");
}
拉格朗日插值源程序:
main()
{int i,j,n;
float x1,y1,l,x[20],y[20];
printf("input n:\nn=");
scanf("%d",&n);
printf("%d\n",n);
printf("input x[i],y[i]:\n");
for (i=0; i<=n;i++)
{scanf ("%f,%f,",&x[i],&y[i]); printf ("%f,%f\n",x[i],y[i]); }
printf ("input x:=\nx=");
scanf ("%f",&x1);
printf("%f\n",&x1);
y1=0;
for(i=0;i<=n;i++)
{l=1;
for(j=0;j<=n;j++)
{if (j==i) continue;
l=l*(x1-x[j])/(x[i]-x[j]);
}
y1=y1+l*y[i];
}
printf("y(%f)=%f\n",x1,y1); }。