雅可比迭代实验报告
雅可比迭代法求解线性方程组的实验报告
一、实验题目
分别利用雅可比迭代法和高斯-塞德尔迭代法求解以下线性方程组:
使得误差不超过 0.00001。
二、实验引言
1.实验目的
①掌握用迭代法求解线性方程组的基本思想和步骤,熟悉计算机fortran语言;
②了解雅可比迭代法在求解方程组过程中的优缺点。
2.实验意义
雅克比迭代法就是众多迭代法中比较早且较简单的一种,求解方便实
用。
三、算法设计
1.雅可比迭代法原理:
设有线性方程组Ax=b 满足0iia, 将方程组变形为: x=Bx+f, 则雅可比(Jacobi)
迭代法是指fBxXkk)1(,即 由初始解逐步迭代即可得到方程组的解。
算法步骤如下:
步骤1.给定初始值)0()0(2)0(1,,,nxxx,精度e,最大容许迭代次数M,令k=1
。
步骤2.对i=1,2,…,n依次计算
)0()1(
)0()1(
11||)n,2,1,0(/)(iiiiiiiiijnijjijjxxxxeiaaxabx
,
步骤3.求出}{max1iniee,若e,则输出结果)n,,2,1()0(ixi,停止计算
。
否则执行步骤4.
2.453.82102.7210321321321xxx
xxx
xxx
步骤4.若,1,kkMk转步骤2继续迭代。若,Mk表明迭代失败,停止计
算。
2.算法流程图
四、程序设计
program jacobi
implicit none
integer::i,j
integer::k
save k
real,parameter::e=0.001
integer,parameter::n=3
real::x(n),y(n),b(n)
data b/7.2,8.3,4.2/
real::D
real::a(n,n)
open (unit=10,file='1.txt')
data a/10,-1,-1,-1,10,-1,-2,-2,5/
write(10,*)"**********矩阵A的形式为**********"
write(10,"(1x,3f6.2,/)")a
forall(i=1:n)
x(i)=0
end forall
k=0
100 D=0
do i=1,n
y(i)=b(i)
do j=1,n
if(i/=j) y(i)=y(i)-a(i,j)*x(j)
end do
y(i)=y(i)/a(i,i)
end do
do j=1,n
D=abs(x(j)-y(j))
end do
forall(i=1:n)
x(i)=y(i)
end forall
if(D>=e) then
k=k+1
write(10,*)"迭代次数为:",k
goto 100
else
goto 200
end if
200 write(10,*)"****************************************"
write(10,*)"用jacobi方法解得的结果X[t]为:"
write(10,"(1x,3f6.2,/)")x(:)
stop
end program
五、结果及讨论
1.实验结果
**********矩阵A的形式为**********
10.00 -1.00 -1.00
-1.00 10.00 -1.00
-2.00 -2.00 5.00
迭代次数为: 1
迭代次数为: 2
迭代次数为: 3
迭代次数为: 4
迭代次数为: 5
迭代次数为: 6
迭代次数为: 7
****************************************
用jacobi方法解得的结果X[t]为:
1.10 1.20 1.30
2.讨论分析
(1)误差
从上述输出结果中可以看出,当迭代次数k增大时,迭代值x1,y1,z1
会越来越逼近方程组的精确解x=1.0,y=1.2,z=1.3。
(2)收敛性
在本题目中, 用雅可比迭代法和高斯-塞德尔迭代法分别求解该线性方程组,得
到的近似根是收敛的
六、算法评价
优点:迭代法算法简单,编制程序比较容易。
缺点:迭代法要求方程组的系数矩阵有某种特殊性质(譬如是所谓对角占优阵)
以保证过程的收敛性。高斯—塞德尔迭代法比雅可比迭代法收敛快(达到同样的
精度所需迭代次数少),但这个结论,在一定条件下才是对的,甚至有这样的方程
组,雅可比方法收敛,而高斯—塞德尔迭代法却是发散的。在雅可比迭代法求解
线性方程组时,只要误差截断设计的合理,原则上可以得到很正确的解。而通常
我们选取设计误差限或设计最大迭代次数的方法来控制。由于它的准确性,故在
实际应用中比较常见,对于解一般线性方程组非常有效准确。通过该算法以及编
程对求解的过程,我们不难发现,雅克比迭代法的优点明显,计算公式简单,每
迭代一次只需计算一次矩阵和向量的乘法,且计算过程中原始矩阵A始终不变,
比较容易并行计算。然而这种迭代方式收敛速度较慢,而且占据的存储空间较大,
所以工程中一般不直接用雅克比迭代法,而用其改进方法。
附:
高斯—赛德尔程序
program G-S
implicit none
integer::i,j
integer::k
save k
real,parameter::e=0.001
integer,parameter::n=3
real::x(n),y(n),b(n)
data b/7.2,8.3,4.2/
real::D
real::a(n,n)
open (unit=10,file='1.txt')
data a/10,-1,-1,-1,10,-1,-2,-2,5/
write(10,*)"**********矩阵A的形式为**********"
write(10,"(1x,3f6.2,/)")a
forall(i=1:n)
x(i)=0
end forall
k=0
100 D=0
do i=1,n
y(i)=b(i)
do j=1,n
if(i
end do
y(i)=y(i)/a(i,i)
end do
do j=1,n
D=abs(x(j)-y(j))
end do
forall(i=1:n)
x(i)=y(i)
end forall
if(D>=e) then
k=k+1
write(10,*)"迭代次数为:",k
goto 100
else
goto 200
end if
200 write(10,*)"****************************************"
write(10,*)"用Gauss-seidel方法解得的结果X[t]为:"
write(10,"(1x,3f6.2,/)")x(:)
stop
end program
**********矩阵A的形式为**********
10.00 -1.00 -1.00
-1.00 10.00 -1.00
-2.00 -2.00 5.00
迭代次数为: 1
迭代次数为: 2
迭代次数为: 3
迭代次数为: 4
****************************************
用Gauss-seidel方法解得的结果X[t]为:
1.10 1.20 1.30
东北大学数值分析实验报告
数值分析实验班级 姓名 学号实验环境: MATLAB实验一 解线性方程组的迭代法(1)一、实验题目 对以下方程组分别采用Jacobi 迭代法, Gaaus-Seidel 迭代法求解和SOR 迭代法求解。
(2)线性方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡--------------------------13682438141202913726422123417911101610352431205362177586832337616244911315120130123122400105635680000121324⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡10987654321x x x x x x x x x x =⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡-2119381346323125 (2)对称正定线性方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡----------------------1924336021411035204111443343104221812334161206538114140231212200420424⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡87654321x x x x x x x x =⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡---4515221123660(3)三对角线性方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡------------------4100000000141000000001410000000014100000000141000000001410000000014100000000141000000001410000000014⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡10987654321x x x x x x x x x x =⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡----5541412621357 二、实验要求(1)应用迭代法求线性方程组, 并与直接法作比较。
雅克比迭代法求线性方程组的根
实验二 雅可比迭代法求线性方程组的根一、实验目的学习用雅可比迭代法求线性方程组的解。
二、实验题目求线性方程组⎪⎩⎪⎨⎧=++=++=-+11054722156851627321321321x x x x x x x x x的根,精确到0.0001。
三、实验原理将方程组按雅可比方法写成⎪⎪⎪⎩⎪⎪⎪⎨⎧+--=+--=++-=275554154152415252278527192213312321x x x x x x x x x 由此可以得到迭代公式:⎪⎪⎪⎩⎪⎪⎪⎨⎧+--=+--=++-=+++275554154152415252278527192)(2)(1)1(3)(3)(1)1(2)(3)(2)1(1n n n n n n n n n x x x x x x x x x n = 0, 1, 2, …四、实验内容取初始向量为:0)0(1=x ,0)0(2=x ,0)0(3=x 运行程序,记录计算结果。
五、源程序(Matlab)clearclcn=input('n=');A=input('A=');b=input('b=');x0=input('x0=');x0=zeros(n,1);x=x0;epsilon=input('\n 精度=');N=input('\n 最大迭代次数N=');fprintf('\n %d:',0);for i=1:nfprintf('%f',x0(i));end%以下是迭代过程for k=1:N%这是第k步迭代,迭代前的向量在x0[]中,迭代后的向量在x[]中;normal=0;for i=1:nx(i)=b(i);for j=1:nif j~=ix(i)=x(i)-A(i,j)*x0(j);endendx(i)=x(i)/A(i,i);temp=abs(x(i)-x0(i));% 求范数与迭代在同一个循环中;if temp>normalnormal=temp; %这里用的是无穷范数endend%第i不迭代结束fprintf('\n %d: ',k);for i=1:nx0(i)=x(i); %为下一步迭代准备初值;fprintf('%f',x(i));%输出迭代过程endif normal<epsilonreturnendendfprintf('\n \n 迭代% d 次后仍未求得满足精度的解\n',N);六、实验结果计算结果如下:k )(1kx)(2kx)(3kx0 0.000000 0.000000 0.0000001 3.148148 4.800000 2.0370372 2.156927 3.269136 1.8898493 2.491668 3.685249 1.9365544 2.400928 3.545126 1.9226505 2.431552 3.583275 1.9269256 2.423232 3.570456 1.9256517 2.426034 3.573954 1.9260438 2.425271 3.572781 1.9259269 2.425527 3.573101 1.92596210 2.425458 3.572994 1.92595111 2.425481 3.573023 1.925955七、实验结果分析运算结果能够满足精度要求。
jacobi迭代法和Gauss-Seidel迭代法
1数值计算方法实验报告五班级地信10801序号姓名实验题目jacobi迭代法和gaussseidel迭代法实验学时
数值计算方法实验报告(五)
班级: 地信 10801
序号:
一、实验题目:jacobi 迭代法和 Gauss-Seidel 迭代法
姓名:
二、实验学时: 2 学时
Hale Waihona Puke 三、实验目的和要求:1.掌握迭代法的基础原理。
times++; Nx=0; if(times>=M){cout<<"发散"<<endl; for(int i=1;i<=N;i++)
break;}
1
{ float sum=0; for(int j=1;j<=N;j++) if(i!=j)sum+=xk[j]*a[i][j]; x[i]=(a[i][N+1]-sum)/a[i][i]; if(fabs(x[i]-xk[i])<e)Nx++;
数值分析实验报告--解线性方程组的迭代法及其并行算法
disp('请注意:高斯-塞德尔迭代的结果没有达 到给定的精度,并且迭代次数已经超过最大迭 代次数max1,方程组的精确解jX和迭代向量X 如下: ') X=X';jX=jX' end end X=X';D,U,L,jX=jX'
高斯-塞德尔的输入为:
A=[10 2 3;2 10 1;3 1 10]; b=[1;1;2]; X0=[0 0 0]'; X=gsdddy(A,b,X0,inf, 0.001,100) A=[10 2 3;2 10 1;3 1 10]; 请注意:因为对角矩阵 D 非奇异,所以此方程组有解.
0.0301 0.0758 0.1834
8.心得体会:
这已经是第三次实验了, 或多或少我已经对 MATLAB 有了更多的了 解与深入的学习。通过这次实验我了解了雅可比迭代法和高斯- 塞德尔迭代法的基本思想,虽然我们不能熟练编出程序,但还是 能看明白的。运行起来也比较容易,让我跟好的了解迭代法的多 样性,使平常手算的题能得到很好的验证。通过这次实验让我对 MATLAB 又有了更深一层的认识,使我对这门课兴趣也更加浓厚。
运行雅可比迭代程序输入: A=[10
b=[1;1;2];X0=[0 0 0]'; X=jacdd(A,b,X0,inf,0.001,100)
2 3;2 10 1;3 1 10];
结果为:
k= 1 X=
0.1000 k= 2 X= 0.0200 k= 3 X= 0.0400 k= 4 X= 0.0276 k= 5 X= 0.0314 k= 6 X= 0.0294 k= 7 X= 0.0301 k= 8 X= 0.0297
6、 设计思想:先化简,把对角线的项提到左边,其它项
实验五矩阵的LU分解法雅可比迭代
实验五矩阵的LU分解法,雅可比迭代实验报告学院:计算机科学与软件学院班级:116班姓名:薛捷星学号:112547一、目的与要求:熟悉求解线性方程组的有关理论和方法;会编制列主元消去法、LU 分解法、雅可比及高斯—塞德尔迭代法德程序;通过实际计算,进一步了解各种方法的优缺点,选择合适的数值方法。
二、 实验内容:会编制列主元消去法、LU 分解法、雅可比及高斯—塞德尔迭代法德程序,进一步了解各种方法的优缺点。
三、 程序与实例列主元高斯消去法算法:将方程用增广矩阵[A ∣b ]=(ij a )1n (n )+⨯表示1) 消元过程对k=1,2,…,n-1①选主元,找{}n ,,1k ,k i k +∈使得k ,i k a =ik a ni k max ≤≤ ②如果0a k ,i k =,则矩阵A 奇异,程序结束;否则执行③。
③如果k i k ≠,则交换第k 行与第k i 行对应元素位置,j i kj k a a ↔ j=k,┅,n+1④消元,对i=k+1, ┅,n 计算kk ik ik a a l /=对j=l+1, ┅,n+1计算kj ik ij ij a l a a -=2) 回代过程①若0=nn a ,则矩阵A 奇异,程序结束;否则执行②。
②nn n n n a a x /1,+=;对i=n-1, ┅,2,1,计算ii ni j j ij n i i a x a a x /11,⎪⎪⎭⎫ ⎝⎛-=∑+=+程序与实例例1 解方程组⎪⎩⎪⎨⎧=++-=++-=++035.3643x .5072x .1835x .2137.2623x .43712x 347x .1 1.1833.555x 2.304x 0.101x 321321321输出结果如下:X[0]=-0.398234X[1]= 0.013795X[2]= 0.335144程序如下:#include<stdio.h>#include<math.h>main(){int i,j,p,o,l,q;doublea[3][4]={{0.101,2.304,3.555,1.183},{-1.347,3.712,4.623,2.137},{-2.835,1.072,5.643,3.035}};double x[3],z[4];printf("列主元消去法\n");for(j=0;j<2;j++){for(i=j+1;i<3;i++){if(fabs(a[j][j])<fabs(a[i][j])){for(p=0;p<4;p++){z[p]=a[j][p];a[j][p]=a[i][p];a[i][p]=z[p];}/*交换得最大主元*/}}for(l=j+1;l<3;l++){for(q=3;q>=j;q--){a[l][q]=(a[l][q]-(a[l][j]/a[j][j])*a[j][q]);}}printf("进行消去:\n");for(o=0;o<3;o++){for(p=0;p<4;p++){printf("%12.6f",a[o][p]);}printf("\n");}}x[2]=a[2][3]/a[2][2];x[1]=(a[1][3]-x[2]*a[1][2])/a[1][1];x[0]=(a[0][3]-x[2]*a[0][2]-x[1]*a[0][1])/a[0][0];printf("最后的解:\n");for(i=0;i<3;i++){printf("x[%d]=%12.6f\n",i,x[i]);}}结果如下:例2 解方程组⎪⎪⎪⎩⎪⎪⎪⎨⎧=++++=++++=++++=++++=++++-12.041.0F 1.02E 3.47D 1.04C 3.54B -6.301.0F2.01E 2.51D 4.04C 5.05B -8.531.0F 1.21E 2.92D 1.46C3.53B -20.071.0F 1.10E4.48D 1.21C 4.93B -32.041.0F 1.55E5.66D 2.40C 8.77B计算结果如下B=-1.161954C= 1.458125D=-6.004824E=-2.209018F= 14.719421程序如下:#include<stdio.h>#include<math.h>void main(void){int i,j,p,o,l,q;doublea[5][6]={{8.77,2.40,5.66,1.55,1.0,-32.04},{4.93,1.21,4.48,1.10,1.0,-20.07},{3.53,1.46,2.92,1.21,1.0,-8.53},{5.05,4.04,2.51,2.01,1.0,-6.30},{3.54,1.04,3.47,1.02,1.0,-12.04}};double x[5],z[6];printf("列主元消去法求五元一次方程组:\n");for(j=0;j<4;j++){for(i=j+1;i<5;i++){if(fabs(a[j][j])<fabs(a[i][j])){for(p=0;p<6;p++){z[p]=a[j][p];a[j][p]=a[i][p];a[i][p]=z[p];}/*交换得最大主元*/}}for(l=j+1;l<5;l++){for(q=5;q>=j;q--){a[l][q]=(a[l][q]-(a[l][j]/a[j][j])*a[j][q]);}}printf("消去一列:\n");for(o=0;o<5;o++){for(p=0;p<6;p++){printf("%12.6f",a[o][p]);}printf("\n");}}x[4]=a[4][5]/a[4][4];x[3]=(a[3][5]-x[4]*a[3][4])/a[3][3];x[2]=(a[2][5]-x[4]*a[2][4]-x[3]*a[2][3])/a[2][2];x[1]=(a[1][5]-x[4]*a[1][4]-x[3]*a[1][3]-x[2]*a[1][2])/a[1][1];x[0]=(a[0][5]-x[4]*a[0][4]-x[3]*a[0][3]-x[2]*a[0][2]-x[1]*a[0][1])/a[0][0];printf("方程组的解为:\n");for(i=0;i<5;i++){printf("x[%d]=%12.6f\n",i,x[i]);}}矩阵直接三角分解法算法:将方程组A x=b 中的A 分解为A =LU ,其中L 为单位下三角矩阵,U 为上三角矩阵,则方程组A x=b 化为解2个方程组Ly =b ,Ux =y ,具体算法如下:①对j=1,2,3,…,n 计算j j a u 11=对i=2,3,…,n 计算1111/a a l i i =②对k=1,2,3,…,n:a. 对j=k,k+1,…,n 计算∑-=-=11k q qj kq kj kj u l a ub. 对i=k+1,k+2,…,n 计算kk k q qk iq ik ik u u l a l /)(11∑-=-=③11b y =,对k=2,3,…,n 计算∑-=-=11k q q kq k k y l b y④nn n n u y x /=,对k=n-1,n-2,…,2,1计算kk n k q q kq k k u x u y x /)(1∑+=-=注:由于计算u 的公式于计算y 的公式形式上一样,故可直接对增广矩阵[A ∣b ]=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡+++1,211,2222211,111211n n nn n n n n n n a a a a a a a a a a a a施行算法②,③,此时U 的第n+1列元素即为y 。
实验报告四 线性方程组的求解-迭代法
浙江大学城市学院实验报告课程名称 科学计算实验项目名称 线性方程组的求解-迭代法实验成绩 指导老师(签名 ) 日期 2014/11/17一. 实验目的和要求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)2-2 分析应用题利用2-1中的程序来分析用下列迭代法解线性方程组:123456410100014101050141012101410501014120010146x x x x x x --⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥----=⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥----⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦ 的收敛性,并求出使(1)()20.0001k k XX +-≤的近似解及相应的迭代次数,其中取迭代初始向量(0)X 为零向量。
数学实验“线性方程组的j迭代,gs迭代,sor迭代解法”实验报告(内含matlab程序代码)【最新精
西京学院数学软件实验任务书实验四实验报告一、实验名称:线性方程组的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 其余部分与雅克比迭代类似。
用雅可比迭代法和高斯赛德尔迭代法解线性方程组
西安财经学院本科实验报告学院(部)统计学院实验室数学专业实训基地课程名称大学数学实验学生姓名董童丹(编程)杨媚(实验报告)学号0804280125 0804280126专业数学与应用数学0801教务处制二0一一年五月四日《用雅可比迭代法和高斯赛德尔迭代法解线性方程组》实验报告开课实验室:实验室313 2011年5月 4日 学院 统计学院年级、专业、班数学与应用数学0801班姓名 董童丹 杨媚成绩课程 名称大学数学实验实验项目 名 称 用雅可比迭代法和高斯赛德尔迭代法解线性方程组指导教师严惠云教师评语教师签名:年 月 日一、实验目的:1)掌握用MATLAB 软件求微分方程初值问题数值解的方法; 2)通过实例学习用线性方程组模型解决简化的实际问题; 3)了解用雅可比迭代法和高斯赛德尔迭代法解线性方程组。
二、实验环境:本次上机实践所使用的平台和相关软件Matlab 。
三、实验内容:*题目1、分别用雅可比迭代法和高斯-赛德尔迭代法计算下列方程组,均取相同的初值T x )1,1,1()0(=,观察其计算结果,并分析其收敛性.⎪⎩⎪⎨⎧=++=++-=--4780591109321321321x x x x x x x x x2、定义矩阵⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡--------------=321412132141412132141412132141213A*算法设计1、雅可比迭代法:原线性方程组可等价地写为:⎪⎩⎪⎨⎧+--=-=++=.478,59,1109213312321x x x x x x x x x (1)利用线性方程组(1)可以进行如下形式的迭代:⎪⎩⎪⎨⎧+--=-=++=+++.478,59,1109)(2)(1)1(3)(3)(1)1(2)(3)(2)1(1k k k k k k k k k x x x x x x x x x (2) 对选定的初始解Tx x x x ),,()0(3)0(2)0(1)0(=,可由(2)式迭代计算.,,)2()1( x x 如果迭代一定次数后,所得到的结果相同或非常接近,并与方程组的精确解相等或非常接近,则认为得到的结果为所求解.高斯-赛德尔迭代法: 利用高斯-赛德尔迭代公式:⎪⎩⎪⎨⎧+--=-=++=++++++478,59,1109)1(2)1(1)1(3)(3)1(1)1(2)(3)(2)1(1k k k k k k k k k x x x x x x x x x 进行迭代,如果迭代一定次数后,所得到的结果相同或非常接近,并与方程组的精确解相等或非常接近,则认为得到的结果为所求解.2、该矩阵为稀疏矩阵,主对角线元素为3,次对角线为-1/2,再次对角线为-1/4,用sparse 命令就可以定义出所需的矩阵. 程序为:高斯—赛德尔迭代法求解:程序为:四.实验结果分析:用雅可比迭代法解,由已知条件给定初始解T x )1,1,1()0(=,计算至=k 200时,可得)0.5575 1.1637,- 0.0985,- ()200(=x已经与原线性方程组的精确解非常接近.即用雅可比迭代法得到解.由高斯-赛德尔迭代法,计算至=k 20时,可得)5574.0,1639.1,0984.0()20(--=x ,已经与原线性方程组的精确解非常接近.即用雅可比迭代法得到解.对原线性方程组用以上两种迭代公式计算的结果进行比较,可以发现高斯-赛德尔迭代法比雅可比迭代法收敛要快.对原线性方程组雅可比迭代法和高斯-赛德尔迭代法的计算结果,雅可比迭代公式简单,特别适合并行计算;高斯-赛德尔迭代计算出的)1(+k i x 可立即存入)(k i x 的位置,只需一个向量存储单元,是典型的串行计算,一般情况下收敛会快一些.通过本次实验,学会用MA TLAB 软件数值求解线性代数方程组,分别用雅可比迭代法和高斯-赛德尔迭代法对线性方程组进行迭代求解,通过对比结果,对迭代法的收敛性和解的稳定性作初步分析, 对两种方法有了进一步的认识.学会了用命令定义稀疏矩阵.。
雅可比迭代法和高斯-塞德尔迭代法求解线性方程组
实验报告内容一 实验目的与要求(实验题目)1.分别利用雅可比迭代法和高斯-塞德尔迭代法求解以下线性方程组使得误差不超过 2.用不动点迭代法求方程的实根:02010223=-++x x x二 模型建立(相关主要计算公式)1. 雅可比迭代法⎩⎨⎧[],...,,k ,n ,...,i x a b a x n i j j )k (j j i i ii )k (i 21021111==∑-=≠=+ 其中()()()()()T n x ,...x ,x x 002010=为初始向量.2.高斯-塞德尔迭代法⎩⎨⎧[],...,,k ,n ,,i x a x a b a x i j n i j )k (j ij )k (j ij i ii )k (i 21021111111==∑∑--=-=+=++3.不动点迭代法• ...1,0),(1==+k x xk k ϕ三、 实验过程、步骤(程序)1. 雅可比迭代法#include "stdio.h"#include "math.h"#include "string.h"main(){⎪⎩⎪⎨⎧=++=-+=+-3612363311420238321321321x x x x x x x x x 410-int i,j,k;float m1=0.0,m2=0.0;float a[3][4]={8,-3,2,20,4,11,-1,33,6,3,12,36};float x[3]={0.0,0.0,0.0};for(k=1;k<=10;){for(i=0;i<=2;i++){for(j=0;j<i;j++)m1=m1+a[i][j]*x[j];for(j=i+1;j<=2;j++)m2=m2+a[i][j]*x[j];x[i]=(a[i][3]-m1-m2)/a[i][i];m1=0,m2=0;}k++;}printf("雅可比迭代法计算结果为:\n");for(i=0;i<=2;i++)printf("x[%2d]=%8.9f\n",i+1,x[i]);}2高斯-塞德尔迭代法#include<stdio.h>#include<math.h># define n 3void main(){int i,j,k=1;float x[n]={0,0,0},m[n]={0,0,0},s=1;float a[n][n]={8,-3,2,4,11,-1,6,3,12},d[n]={20,33,36}; printf("高斯-塞德尔迭代法运算结果为:\n");for(k=0;fabs(s-x[0])>1e-6;k++){s=x[0];for(i=0;i<n;i++){m[i]=0;for(j=0;j<n;j++) m[i]=m[i]-a[i][j]*x[j];m[i]=m[i]+d[i]+a[i][i]*x[i];x[i]=m[i]/a[i][i];}printf("Y1=%f Y2=%f Y3=%f\n",x[0],x[1],x[2]); }getchar() ;}3.#include <stdio.h>#include <math.h>double f( double x ){return x * x * x + 2 * x * x + 10 * x - 20;}double fdx( double x ){return 3 * x * x + 18.4 * x + 16.7;}int main( ){int t1 = 0, t2 = 1;double x[ 2 ], ep = 1e-8;x[ 0 ] = 0;do{t1 = 1 - t1;t2 = 1 - t2;x[ t1 ] = x[ t2 ] - f( x[ t2 ] ) / fdx( x[ t2 ] );}while( fabs( x[ t1 ] - x[ t2 ] ) > ep );printf("解得x=%lf\n", x[ t1 ]);return 0;}四.实验结果:1.雅可比迭代法:2.高斯-塞德尔迭代法:.3.不动点迭代法:五.实验小结通过这次上机,学会了用Jacobis迭代法,高斯-塞德尔迭代法求解线性方程组,算法程序比较复杂,特别是要多次使用数组条件及for循环语句。
基于matlab的线性方程组迭代法(实验报告)
基于matlab 的线性方程组迭代法实验题目:实验要求:(1)分别试用 Jacobi 和Gauss-Seidel 迭代法计算,要求达到的精度为:(1)()510k k x x +-∞->(2)观测得到的迭代序列是否收敛?若收敛,记录迭代次数并分析计算结果。
实验流程一、迭代法简介 1、 Jacobi 迭代法对于方程组Ax b =有A 非奇异情况下且0ij a ≠时,A 分裂为A D L U =--,可得到:0x B x f =+,其中1110(),B I D A D L U f D b ---=-=+=,得到雅克比迭代法:(0)(1)()0()k k x xB x f +⎧⎪⎨=+⎪⎩初始向量 2、 Gauss-Seidel 迭代法(0)(1)()()k k x x Gx f +⎧⎪⎨=+⎪⎩初始向量 其中11(),()G D L U f D L b --=-=-。
其迭代法优点为只需一组存储单元。
3、 超松弛迭代法(SOR)Gauss-Seidel 迭代法的一种加速方法,ω松弛因子。
(0)(1)()(1)(1))()(1)k k k k k x x Gx f x x x ωω+++⎧⎪⎪=+⎨⎪=+-⎪⎩(初始向量 其中11(),()G D L U f D L b --=-=-。
二、迭代法的matlab 程序1、 Jacobi 迭代法Jacobi.mfunction [y,n]= Jacobi( A,b,x0,e )%JACOBI ÇëÔÚ´Ë´¦ÊäÈ뺯Êý¸ÅÒªif(nargin<4)e=1e-5;endD=diag(diag(A));I=eye(size(A));B=I-D\A;f=D\b;y=x0+2*e;n=0;while norm(y-x0,inf)>ey=x0;x0=B*y+f;n=n+1;endnend2、Gauss-Seidel迭代法GaussSeidel.mfunction [y,n]= GaussSeidel( A,b,x0,e ) %GS ÇëÔÚ´Ë´¦ÊäÈ뺯Êý¸ÅÒªif(nargin<4)e=1e-5;endD=diag(diag(A));I=eye(size(A));L=D-tril(A);U=D-triu(A);f=(D-L)\b;G=(D-L)\U;y=x0+2*e;n=0;while norm(y-x0,inf)>ey=x0;x0=G*y+f;n=n+1;endnend3、超松弛迭代法(SOR) SOR.mfunction [y,n]= SOR( A,b,w,x0,e )%SORÇëÔÚ´Ë´¦ÊäÈ뺯Êý¸ÅÒªif(nargin<5)e=1e-5;endD=diag(diag(A));I=eye(size(A));L=D-tril(A);U=D-triu(A);f=(D-L)\b;G=(D-L)\U;y=x0+2*e;n=0;while norm(y-x0,inf)>ex0=y;x1=G*x0+f;y=(1-w)*x0+w*x1;n=n+1;endnend4、变量初始化creatMatrix.mclear;clc;a=diag(3*ones(1,20));b=diag(-0.5*ones(1,19),1);c=diag(-0.25*ones(1,18),2);A=a+b+b'+c+c';%ϵÊý¾ØÕób=ones(20,1)*7/4;b(1)=9/4;b(20)=9/4;x0=zeros(20,1);A,b,x0,w=1.5建立A数组以及初始化b,松弛因子w,迭代初值x05、程序运行和结果记录solve.mclc;tic,s1=Jacobi(A,b,x0),toctic,s2=GaussSeidel(A,b,x0),toctic,s3=SOR(A,b,w,x0),toc三、计算结果运行程序得到几种方法的计算结果。
