数值分析2.docx
- 文档编号:6332740
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:19
- 大小:139.07KB
数值分析2.docx
《数值分析2.docx》由会员分享,可在线阅读,更多相关《数值分析2.docx(19页珍藏版)》请在冰豆网上搜索。
数值分析2
数值分析
上机实习报告
姓名:
学号:
专业:
联系电话:
序言
本次上机实习选用的是Matlab作为编程工具来完成题目的计算分析。
Matlab将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
Matlab的基本数据单元是矩阵,所有的变量都可以用矩阵来表示,向量行数为1或列数为1的矩阵,而标量则是1行1列的特例矩阵,在编程时不必像其他语言一样为矩阵定义维数和大小。
MATLAB语言最大的特点是简单和直接。
Matlab和Mathematica、Maple并称为三大数学软件。
它在数学类科技应用软件中在数值计算方面首屈一指。
Matlab可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连Matlab开发工作界面接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
其具有以下优点:
1)高效的数值计算及符号计算功能,能使用户从繁杂的数学运算分析中解脱出来。
2)具有完备的图形处理功能,实现计算结果和编程的可视化。
3)友好的用户界面及接近数学表达式的自然化语言,使学者易于学习和掌握。
4)功能丰富的应用工具箱(如信号处理工具箱、通信工具箱等,为用户提供了大量方便实用的处理工具。
基于以上优点,同时在本科时学习过Matlab,对它的操作和应用有一定的基础,故本次实验选择Matlab。
目录
实验一4
1.1问题的提出4
1.2分析计算4
1.2.1雅格比法4
1.2.2高斯-赛德尔迭代法4
1.2.3计算结果4
1.3结论5
实验二6
2.1问题的提出6
2.2分析计算6
2.2.1松弛法(SOR)6
2.2.2方程组5阶6
2.2.3方程组7阶7
2.2.4方程组10阶8
2.3结论9
实验三10
3.1问题的提出10
3.2分析计算10
3.2.1Runge-Kutta法10
3.2.2算法的稳定性10
3.2.3计算结果11
3.3结论12
总结13
附录一14
附录二17
附录三19
实验一
1.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]T,
1.2分析计算
1.2.1雅格比法
雅格比法也称为简单迭代法,其迭代公式分量形式为:
在计算过程中,选择
为迭代条件,迭代条件等于NOT结束。
其矩阵形式为:
,其中
称为雅格比迭代阵,常向量
。
1.2.2高斯-赛德尔迭代法
高斯-赛德尔迭代法是在雅格比基础上将运用赛德尔迭代而形成的,其其迭代公式分量形式为:
其矩阵形式为:
,其中
称为高斯-赛德尔迭代阵,常向量
。
1.2.3计算结果
利用Matlab编程计算(详细程序见附录一),结果如下
(1)雅格比迭代法:
x1=[-0.7273,0.8081,0.2525]T迭代次数:
19次
x2=[36.3636,-2.0707,114.0404]T迭代次数:
25次
高斯-赛德尔迭代法:
x1=[-0.7272,0.8081,0.2525]T迭代次数:
9次
x2=[36.3636,-2.0707,114.0404]T迭代次数:
14次
(2)雅格比迭代法:
迭代失败,不收敛
高斯-赛德尔迭代法:
x1=[5.7690,0.7694,-4.2307]T迭代次数:
29次
x2=[32.6922,7.6922,-42.3075]T迭代次数:
36次
(3)雅格比迭代法:
迭代失败,不收敛
高斯-赛德尔迭代法:
迭代失败,不收敛
1.3结论
上述各题谱半径的计算结果为:
雅格比迭代法:
(1)0.5<
<0.6<1
(2)1<1.5<
<1.8(3)
>1
高斯-赛德尔迭代法:
(1)
=0.1525<1
(2)
=0.7155<1(3)
=21>1
所以相对应的收敛性是:
雅格比迭代法:
(1)收敛
(2)发散(3)发散
高斯-赛德尔迭代法:
(1)收敛
(2)收敛(3)发散
通过对比计算结果可知,利用高斯—赛德尔迭代法明显的减少了迭代的次数,由此可知其比雅格比迭代法的收敛速度快,并且两种方式的收敛性互不相关。
雅格比迭代法收敛、发散与否并不能说明高斯—赛德尔迭代法的收敛性。
同时通过改变右端项的数据进行计算的结果显示,右端项对迭代收敛无影响。
实验二
2.1问题的提出
松弛因子对SOR法收敛速度的影响。
用SOR法求解方程组Ax=b,其中
要求程序中不存系数矩阵A,分别对不同的阶数取w=1.1,1.2,...,1.9进行迭代,记录近似解x(k)达到||x(k)-x(k-1)||<10-6时所用的迭代次数k,观察松弛因子对收敛速度的影响,并观察当w0或w2会有什么影响
2.2分析计算
2.2.1松弛法(SOR)
松弛迭代法师一种线性加速法。
其分量形式为:
其矩阵形式为:
2.2.2方程组5阶
迭代初值列向量为
,误差||x(k)-x(k-1)||<10-6。
计算结果:
当1 表2-1迭代次数 (1) 项目w 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 迭代次数 8 11 14 18 24 30 42 66 140 其迭代次数变化如图2-1: 图2-1迭代次数变化 (1) 当 或者 时,它的迭代次数之所以超过了设置的最大收敛次数,因为当松弛因子在这个范围,根本就不收敛。 Matlab程序见附录二。 2.2.3方程组7阶 迭代初值列向量为 ,误差||x(k)-x(k-1)||<10-6。 计算结果: 当1 表2-2迭代次数 (2) 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 迭代次数 10 13 15 18 23 32 44 68 139 其迭代次数随松弛因子变化图如图2-2: 图2-2迭代次数变化 (2) 当 或者 时,它的迭代次数之所以超过了设置的最大收敛次数,因为当松弛因子在这个范围,根本就不收敛。 2.2.4方程组10阶 迭代初值列向量为 ,误差||x(k)-x(k-1)||<10-6。 计算结果: 当1 表2-3迭代次数(3) 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 迭代次数 12 15 17 20 24 30 45 68 140 其迭代次数随松弛因子变化图如图2-3: 图2-3迭代次数变化(3) 当 或者 时,它的迭代次数之所以超过了设置的最大收敛次数,因为当松弛因子在这个范围,根本就不收敛。 2.3结论 综上可知,利用SOR法(松弛迭代法)解方程组,当初值和松弛因子相同时,初值都为 ,迭代次数会随着方程组的阶数的增加而增加;当初值和阶数相同时,迭代次数会随松弛因子增大而增大(其中 )。 当 或者 时,它的迭代次数之所以超过了我设置的最大收敛次数,因为当松弛因子在这个范围,根本就不收敛。 实验三 3.1问题的提出 用Runge-Kutta4阶算法对初值问题y/=-20*y,y(0)=1按不同步长求解,用于观察稳定区间的作用,推荐两种步长h=0.1,0.2。 注: 此方程的精确解为: y=e-20x 3.2分析计算 3.2.1Runge-Kutta法 Runge-Kutta法保留了高阶Taylor法说具有的高阶局部阶段误差,同时也避免了计算函数 的函数,4阶Runge-Kutta法的计算公式为: (3-1) 其局部截断误差为 基本计算过程为: 先计算步长 和各个计算点 ,计算公式为: 然后利用公式(3-1)计算各个 的值。 3.2.2算法的稳定性 算法稳定性的定义: 如果 是某方法第 步的近似值, 是其准确值,其绝对误差为 ,即有 。 假定第 步之后的计算不再有舍入误差,只是由 引起的扰动 ,都有 ,则称此方法是绝对稳定的。 数值解法的稳定性一般与步长 以及 有关 3.2.3计算结果 对于本题在Matlab中编写程序计算(详细程序见附录三),其结果如表3-1和表3-2所示。 表3-1 时的计算结果 0.10000000000000 0.33333333333332 0.135********661 0.119799805009671 0.20000000000000 0.11111111111110 0.01831563888873 0.09279547222237 0.30000000000000 .0370******** 0.00247875217667 0.03455828486037 0.40000000000000 0.01234567901234 0.00033546262790 0.01202021638444 0.50000000000000 0.00411522633745 0.0004539992976 0.00406982640769 0.60000000000000 0.00137174211248 0.00000614421235 0.00136559790013 0.70000000000000 0.00045724737083 0.00000083152872 0.00045641584211 0.80000000000000 0.00015241579028 0.00000011253517 0.00015230325510 0.90000000000000 0.00005.80526343 0.00000001522998 0.00005079003345 1.00000000000000 0.00001693508781 0.00000000206115 0.00001693302665 表3-2 时的计算结果 0.00020000000000 0.00500000000000 0.00001831563889 0.00498168436111 0.00040000000000 .025********* 0.00000033546263 .024********* 0.00060000000000 0.12500000000001 0.00000000614421 0.12499999385579 0.00080000000000 0.62500000000004 0.00000000011254 0.62499999988750 0.00100000000000 3.12500000000025 0.00000000000206 3.14299999999819 3.3结论 对比表3-1和3-2可知,当 时,绝对误差在逐渐的减小,说明此时算法是稳定的;当 时,绝对误差在逐渐的增大,说明此时算法是不稳定的。 由此可知,用标准的四阶Runge-Kutta算法计算常微分方程时,不同的步长对算法的稳定性有影响。 不够稳定的步长下面的计算,误差会越来越大,结果失真严重。 总结 本次上机实习利用Matlab对雅格比法、高斯-赛德尔迭代法、松弛法、Runge-Kutta法进行操作练习与计算,加深了对Matlab的了解与运用。 同时也对数值分析中各个算法的基本原理进行了更为坚实的巩固和提升,在原来理论的基础上更进一步对各个算法有一定的实践,对原来有不明白的地方有了重新的认识。 同时,也让我明白到在面对复杂的工程计算面前,人工计算是远远不够的,必须结合数值分析的知识利用计算机编程实现。 另外也让我意识到工程实践中的严谨态度,必须保证很高的精确度才能满足工程需求。 这为我以后的学习工作打下了牢靠的基础。 从实验本身来说,题目中都要求我们用不同的方法或者不同的角度来解决问题,从而找到最快最优的方法,让我明白了一种好的计算方法可以极大的提升计算效率和计算精度。 最后,感谢在本次实验中帮助过我的老师和同学们。 附录一 雅格比迭代法: function[x,k,flag,err]=jacobi(A,b,delta,max1)%定义jacobi.m %求解线性方程组的迭代法,其中 %A为方程组的系数矩阵 %b为方程组的右端项 %delta为精度要求,缺省值为1e-5 %max1为最大迭代次数,缺省值100 %x为方程组的解 %k为迭代次数 %flag为指标变量flag='ok! '表示迭代收敛到指标要求 %flag='fail! '表示迭代失败 ifnargin<4max1=100;end ifnargin<3delta=1e-5;end n=length(A);k=0; x=zeros(n,1);y=zeros(n,1);flag='ok! '; while1 fori=1: n y(i)=b(i); forj=1: n ifj~=i y(i)=y(i)-A(i,j)*x(j); end end ifabs(A(i,j))<1e-10|k==max1 flag='Fail';return; end y(i)=y(i)/A(i,i); end ifnorm(y-x,inf) break; end x=y;k=k+1; end ---------------------------------------------------------------------------------- A=[62-1;14-2;-314],b=[-324]'; [x,k,flag]=jacobi(A,b)%计算1— (1)—1题 A=[62-1;14-2;-314],b=[100-200345]'; [x,k,flag]=jacobi(A,b)%计算1— (1)—2题 A=[1,0,8,0.8;0.8,1,0.8;0.8,0.8,1],b=[3,2,1]'; [x,k,flag]=jacobi(A,b)%计算1— (2)—1题 A=[10.80.8;0.810.8;0.80.81],b=[50-10]'; [x,k,flag]=jacobi(A,b)%计算1— (2)—2题 A=[13;-17],b=[46]’; [x,k,flag]=jacobi(A,b)%计算1—(3)题 高斯—赛德尔迭代法: function[x,k,flag]=Gau_seid(A,b,delta,max1)%定义Gau_seid.m %求解线性方程组的迭代法,其中 %A为方程组的系数 %b为方程组的右端项 %delta为精度要求,缺省值为1e-5 %max1为最大迭代次数,缺省值100 %x为方程组的解 %k为迭代次数 %flag为指标变量flag='ok! '表示迭代收敛到指标要求 %flag='fail! '表示迭代失败 ifnargin<4max1=100;end ifnargin<3delta=1e-4;end n=length(A);k=0; x=zeros(n,1);y=zeros(n,1);flag='ok! '; while1 y=x; fori=1: n z=b(i); forj=1: n ifj~=i z=z-A(i,j)*x(j); end end ifabs(A(i,i))<1e-10|k==max1 flag='Fail! ';return; end z=z/A(i,i);x(i)=z; end ifnorm(y-x,inf) break; end k=k+1; end --------------------------------------------------------------------------------- A=[62-1;14-2;-314],b=[-324]'; [x,k,flag]=Gau_Seid(A,b)%计算1- (1)-1题 A=[62-1;14-2;-314],b=[100-200345]'; [x,k,flag]=Gau_Seid(A,b)%计算1- (1)-2题 A=[1,0,8,0.8;0.8,1,0.8;0.8,0.8,1],b=[3,2,1]'; [x,k,flag]=Gau_Seid(A,b)%计算1- (2)-1题 A=[10.80.8;0.810.8;0.80.81],b=[50-10]'; [x,k,flag]=Gau_Seid(A,b)%计算1- (2)-2题 A=[13;-17],b=[46]’; [x,k,flag]=Gau_Seid(A,b)%计算1—(3)题 附录二 function[n,x]=sor_1(A,b,X,nm,w,ww) %用超松弛迭代法求解方程组Ax=b %输入: A为方程组的系数矩阵,b为方程组右端的列向量,X为迭代初值构成%的列向量,nm为最大迭代次数,w为误差精度,ww为松弛因子 %输出: x为求得的方程组的解构成的列向量,n为迭代次数 n=1; m=length(A); D=diag(diag(A));%令A=D-L-U,计算矩阵D L=tril(-A)+D;%令A=D-L-U,计算矩阵L U=triu(-A)+D;%令A=D-L-U,计算矩阵U M=inv(D-ww*L)*((1-ww)*D+ww*U);%计算迭代矩阵 g=ww*inv(D-ww*L)*b;%计算迭代格式中的常数项 %下面是迭代过程 whilen<=nm x=M*X+g;%用迭代格式进行迭代 ifnorm(x-X,'inf') disp('迭代次数为');n disp('方程组的解为');x return; %上面: 达到精度要求就结束程序,输出迭代次数和方程组的解 end X=x;n=n+1; end %下面: 如果达到最大迭代次数仍不收敛,输出警告语句及迭代的最终结果(并不是方程组的解) disp('在最大迭代次数内不收敛! '); disp('最大迭代次数后的结果为');x 1 (1)n=5 clc,clear%清空工作窗口,清除内部存储 w=1.1: 0.1: 1.9; m=[811141824304266140] plot(w,m,'*',w,m)%绘图函数 xlabel('松弛因子w')%x轴标题 ylabel('迭代次数m')%y轴标题 gtext('n=5,精度e=1x10-6') (2)n=7 clc,clear w=1.1: 0.1: 1.9; m=[1013151832334468139] plot(w,m,'*',w,m)%绘图函数 xlabel('松弛因子w')%x轴标题 ylabel('迭代次数m')%y轴标题 gtext('n=7,精度e=1x10-6') 附录三 h=0.1时程序 h=0.1 k=1 forxk=0.1: 0.1: 1%取不同的x进行计算 yk=1 forxkp=h: h: xk%四阶标准Runge-Kutta迭代算法 k1=h*(-20*yk); formatlong k1; k2=h*(-20*(yk+k1*0.5)); k3=h*(-20*(yk+k2*0.5)); k4=h*(-20*(yk+k3)); ykm=yk+(k1+2*k2+2*k3+k4)*(0.16666666666667); yk=ykm; end yk=ykm; yeal=exp(-20*xkp);%求出精确值 ck=abs(yk-yeal);%精确值和计算值之间的绝对误差 ykeal(k)=yeal; ckk(k)=ck; yxk(k)=yk; xkk(k)=xk; k=k+1; end D=[yxk'ykeal'ckk'];%将迭代得到的结果及误差存到矩阵D中 fori=1: 1: 10%将同不同X得到的结果集中到一个矩阵 Axk(i)=xkk(4*i-3); end Ch=[Axk'D] Cheng=[Ch(1,[234])] h=0.2时程序 h=0.2 k=1 forxk=0.2: 0.2: 1%取不同的x进行计算 yk=1 forxkp=h: h: xk%四阶标准Runge-Kutta迭代算法 k1=h*(-20*yk); formatlong k1; k2=h*(-20*(yk+k1*0.5)); k3=h*(-20*(yk+k2*0.5)); k4=h*(-20*(yk+k3)); ykm=yk+(k1+2*k2+2*k3+k4)*(0.16666666666667); yk=ykm; end yk=ykm; yeal=exp(-20*xkp);%求出精确值 ck=abs(yk-yeal);%精确值和计算值之间的绝对误差 ykeal(k)=yeal; ckk(k)=ck; yxk(k)=yk; xkk(k)=xk; k=k+1; end D=[yxk'ykeal'ckk'];%将迭代得到的结果及误差存到矩阵D中 fori=1: 1: 5%将同不同X得到的结果集中到一个矩阵 Axk(i)=xkk(4*i-3); end Ch=[Axk'D] Cheng=[Ch(1,[234])]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析