西南交通大学数值分析上机实习
- 格式:doc
- 大小:171.50 KB
- 文档页数:10
目录解题: (1)题目一: (1)1.1计算结果 (1)1.2结果分析 (1)题目二: (2)2.1计算结果 (2)2.2结果分析 (3)题目三: (4)3.1计算结果 (4)3.2结果分析 (5)总结 (5)附录 (6)Matlab程序: (6)题目一: (6)第一问Newton法: (6)第二问Newton法: (6)第一问Steffensen加速法: (7)第二问Steffensen加速法: (7)题目二 (8)1、Jacobi迭代法 (8)2、Causs-Seidel迭代法 (8)题目三: (9)题目一:分别用牛顿法,及基于牛顿算法下的Steffensen 加速法(1)求ln(x +sin x )=0的根。
初值x0分别取0.1, 1,1.5, 2, 4进行计算。
(2)求sin x =0的根。
初值x0分别取1,1.4,1.6, 1.8,3进行计算。
分析其中遇到的现象与问题。
1.1计算结果求ln(x +sin x )=0的根,可变行为求解x-sinx-1=0的根。
1.2结果分析从结果对比我们可发现牛顿—Steffensen 加速法比牛顿法要收敛的快,牛顿法对于初值的选取特别重要,比如第(1)问中的初值为4的情况,100次内没有迭代出来收敛解,而用Steffensen 加速法,7次迭代可得;在第(2)问中的初值为1.6的情况,收敛解得31.4159,分析其原因应该是x x f cos )('=,x0=1.62π≈,0)('≈x f ;迭代式在迭代过程中会出现分母趋近于0,程序自动停止迭代的情况,此时得到的x 往往非常大,而在第一问中我们如果转化为用x+sinx=1,则可以收敛到结果。
用雅格比法与高斯-赛德尔迭代法解下列方程组Ax=b,研究其收敛性,上机验证理论分析是否正确,比较它们的收敛速度,观察右端项对迭代收敛有无影响。
(1)A行分别为A1=[6,2,-1],A2=[1,4,-2],A3=[-3,1,4];b1=[-3,2,4]T,b2=[100,-200,345]T,(2) A行分别为A1=[1,0,8,0.8],A2=[0.8,1,0.8],A3=[0.8,0.8,1];b1=[3,2,1]T,b2=[5,0,-10]T,(3)A行分别为A1=[1,3],A2=[-7,1];b=[4,6]T2.1计算结果初值均为0矩阵带入(1)A行分别为A1=[6,2,-1],A2=[1,4,-2],A3=[-3,1,4];b1=[-3,2,4]T,b2=[100,-200,345]T2) A行分别为A1=[1,0,8,0.8],A2=[0.8,1,0.8],A3=[0.8,0.8,1];b1=[3,2,1]T,b2=[5,0,-10]TT2.2结果分析ρ小于1,故方程组雅可比迭代收第一小题的经计算谱半径为5427B(=).0敛。
ρ0.3535小于1,故原方程组高斯-而经计算高斯-赛德尔迭代的谱半径为=(B)赛德尔迭代矩阵收敛。
第二小题的经计算谱半径为=)(B ρ 1.6大于1,故方程组雅可比迭代发散。
而经计算高斯-赛德尔迭代的谱半径为=)(B ρ0.7155小于1,故原方程组高斯-赛德尔迭代矩阵收敛。
第三小题谱半径为=)(B ρ 4.5826大于1,故方程组雅可比迭代发散。
而高斯-赛德尔迭代的谱半径为=)(B ρ21大于1,故原方程组高斯-赛德尔迭代矩阵发散。
从2.1中的结果列表中可以看到,Causs-Seidel 迭代法比Jacobi 迭代法收敛速度要快很多。
题目三:用Ru n ge-Kutt a 4阶算法对初值问题y /=-20*y ,y (0)=1按不同步长求解,用于观察稳定区间的作用,推荐两种步长h=0.1,0.2。
注:此方程的精确解为:y =e -20x 3.1计算结果3.2结果分析λ,h=0.2时,λh=-4,而Ru n ge-Kutt a 4阶算法的绝对稳定区间是20=-[-2.78,0],故h=0.2时计算不稳定;而h=0.1时,λh=-2,在绝对稳定区间内,计算稳定,结果可靠。
总结本次上机实习过程中使用matlab编写了牛顿法、牛顿-Steffensen法方程求解的程序和雅格比法、高斯-赛德尔迭代法求解方程组的程序、Ru n ge-Kutt a 4阶算法。
深刻了解了matlab这一软件的基本功能与应用。
在上机中我深刻明白了,在所面临的实际问题,大多烦琐复杂的计算必须基于一定的数值算法,用计算机编程来实现。
而人的手工计算是远远不可行的。
这就要求我们寻找一种稳定性好,收敛速度快,又满足要求精度的数值算法。
所以上机实习和这门课程使我了解了一些普遍应用的基本算法,使我在以后工程计算中能够进行广泛的应用。
通过这次上机练习,让我对数值分析所介绍的迭代求解方法及其理论有了更深层次的理解,了解了各种方法之间的优缺点,并且认识到了自己在以前的学习中所存在的问题,及时的修补了自己知识上的漏洞。
同时也提高了我在编写程序上的熟练程度,所以,我认为这次上机实习是非常有收获的,给予我学习数值分析的帮助也是非常大的。
附录Matlab程序:题目一:第一问Newton法:function [x,n]=Newton(xi) %牛顿法求解x=xixi=xi-0.1n=0y=sym('log(x+sin(x))')f=inline(y)f1=diff(y)f2=inline(f1)while(abs(x-xi)>=0.000001)xi=xx=x-f(x)/f2(x)n=n+1if n>100errorbreakendendend第二问Newton法:function [x,n]=Newton1(xi) %牛顿法求解x=xixi=xi-0.1n=0y=sym('sin(x)')f=inline(y)f1=diff(y)f2=inline(f1)while(abs(x-xi)>=0.000001)xi=xx=x-f(x)/f2(x)if n>100errorbreakendendend第一问Steffensen加速法:function [x,n]=Steffensen(xi) %Steffensen加速法x=xixi=xi-0.1n=0y=sym('log(x+sin(x))')f=inline(y)f1=diff(y)f2=inline(f1)while(abs(x-xi)>0.000001)xi=xy=x-f(x)/f2(x)z=y-f(y)/f2(y)x=x-(y-x)*(y-x)/(z-2*y+x)n=n+1if n>100errorbreakendendend第二问Steffensen加速法:function [x,n]=Steffensen1(xi) %Steffensen加速法x=xixi=xi-0.1n=0y=sym('x-sin(x)/cos(x)')f=inline(y)while(abs(x-xi)>0.000001)xi=xz=f(y)x=x-(y-x)*(y-x)/(z-2*y+x)n=n+1if n>100errorbreakendendend题目二1、Jacobi迭代法function [x,n]=jacobi(A,b)[m,n]=size(A)x=zeros(n,1)e=ones(n,1)x0=x+eI=eye(n)a=diag(A)D=diag(a)n=0while norm(x0-x,inf)>0.000001 if n>200;errorbreakendx0=xB=I-inv(D)*Ax=B*x+inv(D)*bn=n+1end2、Causs-Seidel迭代法function [x,n]=gaussseidel(A,b) [m,n]=size(A)x=zeros(n,1)e=ones(n,1)x0=x+ea=diag(A)D=diag(a)M=triu(A)N=tril(A)L=A-MU=A-Nn=0while norm(x0-x,inf)>0.000001 if n>200errorbreakendx0=xC=D+LG=-inv(C)*Ux=G*x+inv(C)*bn=n+1end题目三:function A=Runge(x,h)a=x/hy=1x=0for i=1:ak1=h*-20*yk2=h*-20*(y+1/2*k1)k3=h*-20*(y+1/2*k2)k4=h*-20*(y+k3)y=y+(k1+2*k2+2*k3+k4)/6A(i)=yx=x+hf=exp(-20*x)B(i)=fd=abs(f-y)C(i)=dend。