西南交通大学《数值分析报告》上机报告.docx
《西南交通大学《数值分析报告》上机报告.docx》由会员分享,可在线阅读,更多相关《西南交通大学《数值分析报告》上机报告.docx(32页珍藏版)》请在冰豆网上搜索。
西南交通大学《数值分析报告》上机报告
目录
目录1
序言
(1)2
1.1C语言简介及结构2
1.2C语言特点及优点2
1.3选用原因3
第一题4
用雅格比法与高斯-赛德尔迭代法解下列方程组4
1.1题目4
1.2原理和思路4
1.3计算结果与分析7
第二题10
松弛因子对SOR法收敛速度的影响10
2.1题目10
2.2原理和思路10
2.3计算结果与分析12
序言
(2)16
第三题17
利用四阶Runge-Kutta算法求解微分方程的初值问题17
3.1题目17
3.2原理和思路17
3.3计算结果与分析18
附录1Jacobi迭代法C语言源程序21
附录2Gauss-Seidel迭代法程序代码23
附录3SOR迭代法C语言源程序25
附录4四阶Runge-Kutta算法程序代码27
总结与体会29
本报告系西南交通大学2011级硕士研究生《数值分析》课程的上机实习报告,由本人严格按照实习要求独立完成。
序言
(1)
在第一次给定的四道上机题中,我选择的是第三题(雅格比迭代法、高斯—赛德尔迭代法求解方程组的问题)和第四题(松弛因子对SOR法收敛速度的影响),本次上机实习基于MicrosoftVisualStudio.NET平台进行程序建立,采用C语言面向对象语言,从界面设计到结果输出,完成一个具有针对性的可视化Windows应用程序的编制。
在此序言中,我将阐述C语言的基本结构、优特点以及选用这种语言进行编程的主要原因。
1.1C语言简介及结构
C语言是一种计算机程序设计语言,由美国贝尔研究所的D.M.Ritchie于1972年推出。
1978后,C语言已先后被移植到大、中、小及微型机上,是目前世界上流行、使用最广泛的高级程序设计语言之一。
C语言既有高级语言的特点,又具有汇编语言的特点。
它不仅可以作为工作系统设计语言,编写系统应用程序;也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。
其应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件、三维、二维图形和动画。
结构如下:
(1)一个C语言源程序可以由一个或多个源文件组成;
(2)每个源文件可由一个或多个函数组成;
(3)一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数;
(4)源程序中可以有预处理命令(包括include命令、if命令、pragma命令),预处理命令通常应放在源文件或源程序的最前面;
(5)每一个说明,每一个语句都必须以分号结尾。
但预处理命令,函数头和花括号“}”之后不能加分号;
(6)标识符,关键字之间必须至少加一个空格以示间隔。
若已有明显的间隔符,也可不再加空格来间隔。
1.2C语言特点及优点
C语言主要具有以下几方面特点及优点:
(1)简洁紧凑、灵活方便
C语言一共只有32个关键字、9种控制语句,程序书写自由,主要用小写字母表示,它把高级语言的基本结构和语句与低级语言的实用性结合起来。
C语言可以象汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
(2)运算符丰富
C语言的运算符包含的范围很广泛,共有种34个运算符。
C语言把括号、赋值、强制类型转换等都作为运算符处理。
从而使C语言的运算类型极其丰富表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。
(3)数据结构丰富
C语言的数据类型有:
整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等,能用来实现各种复杂的数据类型的运算,并引入了指针概念,使程序效率更高。
另外C语言具有强大的图形功能,支持多种显示器和驱动器,且计算功能、逻辑判断功能强大。
(4)C是结构式语言
结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。
这种结构化方式可使程序层次清晰,便于使用、维护以及调试。
C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
(5)语法限制不太严格、程序设计自由度大
一般的高级语言语法检查比较严,能够检查出几乎所有的语法错误。
而C语言允许程序编写者有较大的自由度。
(6)允许直接访问物理地址,可以直接对硬件进行操作
因此既具有高级语言的功能,又具有低级语言的许多功能,能够象汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元,可以用来写系统软件。
(7)程序生成代码质量高,程序执行效率高
一般只比汇编程序生成的目标代码效率低10~20%。
(8)适用范围大,可移植性好
C语言有一个突出的优点就是适合于多种操作系统,,如DOS、UNIX,也适用于多种机型。
1.3选用原因
本次数值分析上机实习拟采用C语言进行编程,主要是基于以下几方面的考虑:
(1)C语言的优越性:
C语言作为一种优秀的编程语言,使用起来灵活方便,程序执行效率高,可移植性好,可以把程序写为函数,方便多次调用;
(2)可视化交互性:
C语言可创建Windows应用程序,可视性程度高,与使用者的交互简单,有利于体会程序的设计过程,尤其是在编写数值分析的各种算法过程中,可以清晰的理解算法的实现过程,使深刻理解该算法;
(3)个人基础:
作为一名工科学生,曾在大学期间有系统的学习过C语言,具备一定的理论基础和实践操作能力,能够较好的应用该语言进行运算,有助于上机实习过程的顺利完成。
鉴于以上考量,我决定选择C语言进行编程。
第一题
用雅格比法与高斯-赛德尔迭代法解下列方程组
1.1题目
【3】用雅格比法与高斯-赛德尔迭代法解下列方程组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基本原理
(1)Jacobi迭代法
设有n阶方程组Ax=b,若系数矩阵非奇异,且(i=1,2,…,n),将方程组改写成同解方程组:
然后写成迭代格式:
上式也可以简单地写为:
对以上两式给定一组任意初值后,经反复迭代可得到一向量序列,如果x(k)收敛于,则就是方程组Ax=b的解,该方法称为雅克比(Jacobi)迭代法。
设D=diag(a11,a22,…,ann),将Ax=b改写为:
AX=(D–(D-A))x=b,DX=(D-A)x+b,X=(I–D-1A)x+D-1b。
记B=I–D-1A,g=D-1b。
则迭代格式的向量表示为
BJ=I–D-1A称为雅克比迭代矩阵。
Jacobi迭代收敛的充要条件:
迭代矩阵BJ的谱半径。
特别地,若系数矩阵A满足以下特征中的任意一条,则Jacobi迭代法收敛:
1A为行对角占优阵,即;
2A为列对角占优阵,即;
3A的元素满足。
(2)Gauss-Seidel迭代法
在雅可比迭代中,每次迭代时只用到前一次的迭代值,而在高斯-塞德尔迭代中,每次迭代时充分利用最新的迭代值。
一旦一个分量的新值被求出,就立即用于后续分量的迭代计算,而不必等到所有分量的新值被求出以后。
如果迭代收敛,应该比更接近于原方程的解(i=1,2,…,n),因此在迭代过程中及时地以代替(i=1,2,…,n-1),可得到更快的收敛效果。
这样可将迭代格式写成:
上式可简写为:
(i=1,2,…,n)
该式称为Gauss-Seidel迭代格式。
对于上述Gauss-Seidel迭代式,如写成矩阵形式为:
=D-1+D-1b,=。
其中,L和U分别为:
则Gauss-Seidel迭代法的迭代矩阵为。
其收敛的充要条件为谱半径。
特别地,若系数矩阵A满足Jacobi迭代法三条特征中的任意一条,则Gauss-Seidel迭代法收敛。
1.2.2实验思路
(1)Jacobi迭代法的算法为:
Jacobi迭代法的流程图为:
在以上的流程图中,先读入数据,即先输入系数矩阵A,常数向量b,初始值,停止条件和最大循环次数。
图中是迭代公式中的,k是循环次数,N是最大循环次数。
(2)Gauss-Saidel迭代法的算法为:
Gauss-Seidel迭代法的流程图为:
以上的流程图中,先读入数据,即先输入系数矩阵A,常数向量b,初始值,停止条件和最大循环次数N。
流程图中的是高斯-塞德尔迭代公式中的,是高斯-塞德尔迭代公式中的,k是迭代次数,N是最大循环次数。
1.3计算结果与分析
(1)当,时,通过两种迭代法得到的结果如下图所示:
当,时,通过两种迭代法得到的结果如下图所示:
【实验现象】
通过上述两组实验对比得到的结果显示:
Jacobi迭代和Gauss-Seidel迭代都是收敛的。
【原因分析】
由矩阵A可知,A为列对角占优阵,所以Jacobi迭代法和Gauss-Seidel迭代法都是收敛的。
从上述两组实验对比可以得出,Gauss-Seidel迭代法比Jacobi迭代法的收敛速度更快,而且右端项b对迭代收敛没有影响。
(2)当,时,通过两种迭代法得到结果如下图所示:
当,时,通过两种迭代法得到结果如下所示:
【实验现象】
通过上述两组实验对比得到的结果显示:
Jacobi迭代都是发散的,而Gauss-Seidel迭代都是收敛的。
【原因分析】
Jacobi迭代矩阵,经过计算,故Jacobi迭代是发散的。
Gauss-Seidel迭代矩阵,计算,故Gauss-Seidel迭代是收敛的。
(3)当,时,通过两种迭代法得到计算结果如下图所示:
【实验现象】
通过上述实验结果显示:
Jacobi迭代法和Gauss-Seidel迭代法都是发散的。
【原因分析】
Jacobi迭代矩阵,经计算,故Jacobi迭代法是发散的。
Gauss-Seidel迭代矩阵,经计算,故Gauss-Seidel迭代是发散的。
【实验结论】
1、判断Jacobi迭代和Gauss-Seidel迭代是否收敛,可计算它们的迭代矩阵B的谱半径是否小于1。
,则收敛;,则发散;
2、从实验结果可以看出,Gauss-Seidel迭代法比Jacobi迭代法的收敛速度快;
3、方程右端项对Jacobi迭代和Gauss-Seidel迭代的收敛性事没有影响的。
第二题
松弛因子对SOR法收敛速度的影响
2.1题目
【4】松弛因子对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基本原理
在很多情况下,Guass-Seidel迭代法比Jacobi迭代法收敛速度快。
分析Guass-Seidel迭代公式,可以改写成:
(j=1,…,n)
记:
称为第k步第i个分量的残量。
那么Gau