迭代法实验报告
- 格式:docx
- 大小:142.31 KB
- 文档页数:9
迭代法解线性方程组数值分析实验报告一、实验目的本次实验旨在深入研究和掌握迭代法求解线性方程组的基本原理和方法,并通过数值实验分析其性能和特点。
具体目标包括:1、理解迭代法的基本思想和迭代公式的推导过程。
2、掌握雅克比(Jacobi)迭代法、高斯赛德尔(GaussSeidel)迭代法和超松弛(SOR)迭代法的算法实现。
3、通过实验比较不同迭代法在求解不同类型线性方程组时的收敛速度和精度。
4、分析迭代法的收敛性条件和影响收敛速度的因素。
二、实验原理1、线性方程组的一般形式对于线性方程组$Ax = b$,其中$A$ 是$n×n$ 的系数矩阵,$x$ 是$n$ 维未知向量,$b$ 是$n$ 维常向量。
2、迭代法的基本思想迭代法是从一个初始向量$x^{(0)}$出发,按照某种迭代公式逐步生成近似解序列$\{x^{(k)}\}$,当迭代次数$k$ 足够大时,$x^{(k)}$逼近方程组的精确解。
3、雅克比迭代法将系数矩阵$A$ 分解为$A = D L U$,其中$D$ 是对角矩阵,$L$ 和$U$ 分别是下三角矩阵和上三角矩阵。
雅克比迭代公式为:$x^{(k+1)}= D^{-1}(b +(L + U)x^{(k)})$。
4、高斯赛德尔迭代法在雅克比迭代法的基础上,每次计算新的分量时立即使用刚得到的最新值,迭代公式为:$x_i^{(k+1)}=(b_i \sum_{j=1}^{i-1}a_{ij}x_j^{(k+1)}\sum_{j=i+1}^{n}a_{ij}x_j^{(k)})/a_{ii}$。
5、超松弛迭代法在高斯赛德尔迭代法的基础上引入松弛因子$\omega$,迭代公式为:$x_i^{(k+1)}= x_i^{(k)}+\omega((b_i \sum_{j=1}^{i-1}a_{ij}x_j^{(k+1)}\sum_{j=i}^{n}a_{ij}x_j^{(k)})/ a_{ii} x_i^{(k)})$。
第1篇一、实验目的1. 理解雅各比迭代法的原理和应用。
2. 掌握雅各比迭代法的计算步骤和实现方法。
3. 通过实验验证雅各比迭代法在求解线性方程组中的有效性和收敛性。
二、实验原理雅各比迭代法是一种求解线性方程组的迭代方法。
对于形如Ax=b的线性方程组,其中A是n×n的系数矩阵,x是n维未知向量,b是n维常数向量,雅各比迭代法的基本思想是将方程组Ax=b转化为一系列的简单方程进行迭代求解。
设A为对角占优矩阵,则雅各比迭代法的迭代公式为:x_{k+1} = (D - L)^{-1}(b - Ux_k)其中,D是A的对角矩阵,L是A的非对角元素中下三角矩阵,U是A的非对角元素中上三角矩阵。
三、实验内容1. 准备实验环境:安装MATLAB软件,创建实验文件夹。
2. 编写实验程序:(1)定义系数矩阵A和常数向量b。
(2)计算对角矩阵D、下三角矩阵L和上三角矩阵U。
(3)初始化迭代变量x_0。
(4)设置迭代次数N和容许误差ε。
(5)进行雅各比迭代计算,并输出每一步的迭代结果。
(6)判断迭代是否收敛,若收敛则输出最终结果,否则输出未收敛信息。
3. 运行实验程序,观察迭代过程和结果。
四、实验步骤1. 创建实验文件夹,打开MATLAB软件。
2. 编写实验程序,保存为“雅各比迭代法实验.m”。
3. 运行实验程序,观察迭代过程和结果。
4. 分析实验结果,验证雅各比迭代法的有效性和收敛性。
五、实验结果与分析1. 运行实验程序,得到以下迭代过程和结果:迭代次数 | 迭代结果---------|---------1 | x_1 = [0.3333, 0.3333]2 | x_2 = [0.3333, 0.3333]3 | x_3 = [0.3333, 0.3333]...N | x_N = [0.3333, 0.3333]2. 分析实验结果:(1)从实验结果可以看出,雅各比迭代法在求解线性方程组时,经过有限次迭代即可收敛。
实验一线性方程组迭代法实验实验一线性方程组迭代法实验一、实验目的1.掌握用迭代法求解线性方程组的基本思想和计算步骤;2.能熟练地写出Jacobi迭代法的迭代格式的分量形式,并能比较它们各自的特点及误差估计;3.理解迭代法的基本原理及特点,并掌握Jacobi迭代Gauss-Seidel迭代和SOR迭代格式的分量形式、矩阵形式及其各自的特点;4.掌握Jacobi迭代Gauss-Seidel迭代和SOR 迭代算法的MATLAB程序实现方法,及了解松弛因子对SOR迭代的影响;5.用SOR迭代法求解线性方程组时,超松弛因子ω的取值大小会对方程组的解造成影响,目的就是能够探索超松弛因子ω怎样对解造成影响,通过这个实验我们可以了解ω的大致取值范围。
二、实验题目1、迭代法的收敛速度用迭代法分别对n=20,n=200解方程组Ax=b,其中n n A ⨯ ⎝⎛⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫------------------=444...444315131315151313151513131515131315131 (1)选取不同的初值x0和不同的右端向量b ,给定迭代误差,用两种迭代法计算,观测得到的迭代向量并分析计算结果给出结论;(2)取定初值x0和右端向量b ,给定迭代误差,将A 的主对角元成倍放大,其余元素不变,用Jacobi 迭代法计算多次,比较收敛速度,分析计算结果并给出结论。
2、SOR 迭代法松弛因子的选取不同的松弛因子对解得影响。
然后利用雅可比迭代求的的解与它们比较;三、 实验原理1、迭代法的收敛速度运用了Jacobi 迭代,Gauss-Seidel 迭代1)Jacobi 迭代算法:1. 取初始点x(0),精度要求ε,最大迭代次数N ,置k :=0;2. 由n 1i ),x a -(b x n i j 1,j (k)j j i i 11)(k i ,,⋯==∑≠=+ii a ,计算出x (k+1);3. 若ε≤-∞+)()1(k k x x ,则停算,输出x(k+1)作为方程组的近似解; 4. 若k=N ,则停算,输出迭代失败信息;否则置k :=k+1,转步2。
解线性方程组的迭代法数值计算上机实习报告一.综述:考虑用迭代法求解线性方程组,取真解为,初始向量取为零,以范数为度量工具,取误差指标为.其中。
分别完成下面各小题:第六题:编制程序实现Jacobi迭代方法和Gauss-Seidel 方法。
对应不同的停机标准(例如残量,相邻误差,后验误差停机标准),比较迭代次数以及算法停止时的真实误差。
其中残量准则:、相邻误差准则:后验误差停机准则:解:为了结果的可靠性,这里我分别对矩阵阶数为400、2500、10000进行试验,得到对应不同的方法、取不同的停机标准,迭代次数和真实误差的数据如下:分析上面数据可知,对应不同的停机标准,GS方法的迭代次数都近似为J方法的一半,这与理论分析一致。
而且从迭代次数可以看出,在这个例子中,作为停机标准,最强的依次为后验误差,再到残量,再到相邻误差。
第七题:编写程序实现SOR 迭代方法。
以真实误差作为停机标准,数值观测SOR 迭代方法中松弛因子对迭代次数的影响,找到最佳迭代因子的取值。
解:本题中考虑n=50,即对2500阶的矩阵A。
由于我们已经知道要使SOR方法收敛,松弛因子需要位于。
下面来求SOR方法中对应的最佳松弛因子。
应用筛选法的思想,第一次我们取松弛因子,间距为0.05,得到的对应的图像如下,从图中可以看出迭代次数随着的增大,先减小后变大,这与理论相符。
同时可以看出最佳松弛因子.第二次将区间细分为10份,即取,可得下面第二幅图像,从图像中可以看出最佳松弛因子第八题:对于J 方法,GS方法和(带有最佳松弛因子的)SOR 方法,分别绘制误差下降曲线以及残量的下降曲线(采用对数坐标系),绘制(按真实误差)迭代次数与矩阵阶数倒数的关系;解:对于J方法,考虑n=50时,采用相邻误差为迭代的终止条件,误差下降曲线及残量的下降曲线如下:对于GS方法,考虑n=50的时候,采用相邻误差作为迭代的终止条件,所得到的残量和误差的下降曲线如下图:从中可以看出,当相邻误差满足误差指标时,真实误差却并不小于误差指标,而为2.6281e-04。
MAAB计算方法迭代法牛顿法二分法实验报告实验目的:比较MAAB计算方法中迭代法、牛顿法和二分法的优缺点,探究它们在求解方程中的应用效果。
实验原理:1、迭代法:将方程转化为x=f(x)的形式,通过不断迭代逼近方程的根。
2、牛顿法:利用函数在特定点的切线逼近根的位置,通过不断迭代找到方程的根。
3、二分法:利用函数值在区间两端的异号性质,通过不断二分缩小区间,最终逼近方程的根。
实验步骤:1、选择一元方程进行求解,并根据方程选择不同的计算方法。
2、在迭代法中,根据给定的初始值和迭代公式,进行迭代计算,直到满足预设的迭代精度要求。
3、在牛顿法中,选择初始点,并根据切线方程进行迭代计算,直到满足预设的迭代精度要求。
4、在二分法中,选择区间,并根据函数值的异号性质进行二分,直到满足预设的迭代精度要求。
5、根据计算结果,比较三种方法的求解效果,包括迭代次数、计算时间、求解精度等指标。
实验结果与分析:通过对多个方程进行测试,得到了以下实验结果:1、迭代法的优点是简单易懂,适用范围广,但当迭代公式不收敛时会导致计算结果不准确。
2、牛顿法的优点是收敛速度较快,但需要计算函数的一阶导数和二阶导数,对于复杂函数较难求解。
3、二分法的优点是收敛性较好,不需要导数信息,但收敛速度较慢。
4、对于线性方程和非线性方程的求解,牛顿法和迭代法通常比二分法更快速收敛。
5、对于多重根的方程,二分法没有明显优势,而牛顿法和迭代法能更好地逼近根的位置。
6、在不同的方程和初值选择下,三种方法的迭代次数和求解精度略有差异。
7、在时间效率方面,二分法在收敛速度较慢的同时,迭代次数较少,牛顿法在收敛速度较快的同时,迭代次数较多,而迭代法对于不同方程有较好的平衡。
结论:1、对于不同类型的方程求解,可以根据具体情况选择合适的计算方法。
2、迭代法、牛顿法和二分法各有优缺点,没有绝对的最优方法,需要权衡各种因素选择最适合的方法。
3、在实际应用中,可以根据方程的特点和精度要求综合考虑不同方法的优劣势,以获得较好的求解效果。
实验五: 迭代法求平方根
物理学416班赵增月F12 2011412194 日期: 2013年10月31日
一·实验目的
1.熟练掌握程序编写步骤;
2.学习使用循环结构。
二·实验器材
1.电子计算机;
2.VC6.0
三·实验内容与流程
1.流程图
2.输入以下程序#include<stdio.h>
#include<math.h>
void main()
{
float x2,x1,a;
printf("请输入实数a=");
scanf("%f",&a);
x2=a*0.5;
do
{ x1=x2;
x2=0.5*(x1+a/x1);
}while(fabs(x2-x1)>1e-5);
printf("a 的平方根是: %f\n",x2);
}
四·实验结果
运行显示如下:
请输入实数a=4
a 的平方根是: 2.000000
Press any key to continue
五·实验总结与反思
1.注意循环的初始值的设定, 要保证循环可以进行;
2.循环必须有结束的条件, do while结构中, 不满足循环条件跳出循环。
3.。
MATLAB计算方法迭代法牛顿法二分法实验报告实验报告一、引言计算方法是数学的一门重要应用学科,它研究如何用计算机来解决数学问题。
其中,迭代法、牛顿法和二分法是计算方法中常用的数值计算方法。
本实验通过使用MATLAB软件,对这三种方法进行实验研究,比较它们的收敛速度、计算精度等指标,以及它们在不同类型的问题中的适用性。
二、实验方法1.迭代法迭代法是通过不断逼近解的过程来求得方程的根。
在本实验中,我们选择一个一元方程f(x)=0来测试迭代法的效果。
首先,我们对给定的初始近似解x0进行计算,得到新的近似解x1,然后再以x1为初始近似解进行计算,得到新的近似解x2,以此类推。
直到两次计算得到的近似解之间的差值小于规定的误差阈值为止。
本实验将通过对复杂方程的迭代计算来评估迭代法的性能。
2.牛顿法牛顿法通过使用函数的一阶导数来逼近方程的根。
具体而言,对于给定的初始近似解x0,通过将f(x)在x0处展开成泰勒级数,并保留其中一阶导数的项,得到一个近似线性方程。
然后,通过求解这个近似线性方程的解x1,再以x1为初始近似解进行计算,得到新的近似解x2,以此类推,直到两次计算得到的近似解之间的差值小于规定的误差阈值为止。
本实验将通过对不同类型的方程进行牛顿法的求解,评估它的性能。
3.二分法二分法是通过将给定区间不断二分并判断根是否在区间内来求方程的根。
具体而言,对于给定的初始区间[a,b],首先计算区间[a,b]的中点c,并判断f(c)与0的大小关系。
如果f(c)大于0,说明解在区间[a,c]内,将新的区间定义为[a,c],再进行下一轮的计算。
如果f(c)小于0,说明解在区间[c,b]内,将新的区间定义为[c,b],再进行下一轮的计算。
直到新的区间的长度小于规定的误差阈值为止。
本实验将通过对复杂方程的二分计算来评估二分法的性能。
三、实验结果通过对一系列测试函数的计算,我们得到了迭代法、牛顿法和二分法的计算结果,并进行了比较。
浙江大学城市学院实验报告课程名称 科学计算实验项目名称 线性方程组的求解-迭代法实验成绩 指导老师(签名 ) 日期 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 为零向量。
迭代法实验报告 一. 实验目的:掌握迭代方法的用处 二. 实验环境:Cfree5.0 三. 实验时间:2013年6月20日 四. 实验地点:电子信息楼1201教室 五. 实验内容:运用编程实现迭代方法可以更好的解线性方程组,得到线性方程的解。
六. 实验理论依据:
高斯-赛德尔(Gauss-Seidel )迭代公式
我们注意到在雅可比迭代法中并没有对新算出的分量11k x +,12k x +,,
11k i x +-进行充分利用.不妨设想,在迭代收敛的条件下,我们把
(1)()()()11211331111(1)()()()22112332222(1)()()()1122,111()1(1(k k k k n n k k k k n n k k k k n n n n n n nn x a x a x a x b a x a x a x a x b a x a x a x a x b a +++--⎧=---+⎪⎪⎪=---+⎪⎨⎪⎪⎪=---+⎪
⎩
式中第一个方程算出的11k x +立即投入到第二个方程中,代替()1k x 进行计算,当12
k x +算出后代替()2k x 马上投入到第三个方程中计算,依次进行下去,这样也许会得到
更好的收敛效果.根据这种思路建立的一种新的迭代格式,我们称为高斯-赛德尔(Gauss-Seidel )迭代公式,
高斯=赛德尔迭代法的分量形式:
(1)()()()11211331111(1)(1)()()22112332222(1)(1)(1)(1)1122,111()1(1(k k k k n n k k k k n n k k k k n n n n n n nn x a x a x a x b a x a x a x a x b a x a x a x a x b a +++++++--⎧=---+⎪⎪⎪=---+⎪⎨⎪⎪⎪=---+⎪
⎩
高斯-赛德尔迭代法的矩阵形式:
(1)(),(0,1,2,)k k x Bx f k +=+=
其中
1()B D L U -=-,1()f D L b -=- B 称为高斯-赛德尔迭代矩阵,f 称为高斯-赛德尔迭代常量..
七. 运行代码如下:
#include"stdio.h"
#include"math.h"
int main()
{
bool pan1=true;
int n,n1,n2=0,k=0;
double
num[100][100],L[100][100],U[100][100],x[100],y[100],num1=0,b[100],D[100][100],x1[200][200],x2[200][200];
printf("\n");
printf("*******************************高斯迭代法解如下********************************");
printf("输入要输入矩阵的阶数为(按Enter 输入矩阵数字):");//
输入矩阵的阶数
scanf("%d",&n1);
for(int i=0;i<n1;i++)//输入矩阵的数
{
printf("输入第%d行数字为(按Enter进入下一行的输入):",i+1);
for(int j=0;j<n1;j++)
{
scanf("%lf",&num[i][j]);
}
}//输入矩阵的数结束
for(int i=0;i<n1;i++)//求解对角线上的矩阵数
{
for(int j=0;j<n1;j++)
{
if(i==j)
{
D[i][j]=num[i][j];
L[i][j]=0;
U[i][j]=0;
}
if(i>j)
{
L[i][j]=-num[i][j];
}
if(i<j)
{
U[i][j]=-num[i][j];
}
}
}//求解对角线上的矩阵数结束
printf("=================================输出D的矩阵为==================================");
for(int i=0;i<n1;i++)//输出D矩阵 {
for(int j=0;j<n1;j++)
{
printf("%10lf",D[i][j]);
}
printf("\n");
}
printf("\n");
printf("=================================输出L的矩阵为
==================================");
for(int i=0;i<n1;i++)//输出L矩阵
{
for(int j=0;j<n1;j++)
{
printf("%10lf",L[i][j]);
}
printf("\n");
}
printf("\n");
printf("=================================输出U的矩阵为
==================================");
for(int i=0;i<n1;i++)//输出U矩阵
{
for(int j=0;j<n1;j++)
{
printf("%10lf",U[i][j]);
}
printf("\n");
}
printf("输入矩阵右端常数为(以空格隔开,按回车进
行下一步):");//输入b的值
for(int i=0;i<n1;i++)
{
scanf("%lf",&b[i]);
}//输入b的值结束
printf("输入初始化x(0)的矩阵值(以空格隔开,按回车得到结果):");//输入x的值
for(int i=0;i<n1;i++)
{
scanf("%lf",&x2[0][i]);
}
while(pan1)//高斯迭代法的for语句部分 {
for(int i=0;i<n1;i++)
{
for(int j=0;j<i;j++)
{
num1+=num[i][j]*x2[k+1][j];
}
for(int j1=i+1;j1<n1;j1++)
{
num1+=num[i][j1]*x2[k][j1];
}
x2[k+1][i]=(b[i]-num1)/num[i][i];
num1=0;
}
for(int i=0;i<n1;i++) {
if(fabsf(x2[k+1][i]-x2[k][i])<0.002) {
n2++;
}
}
if(n2==n1)
{
pan1=false; }
else
{
k++;
pan1=true; }
}//高斯迭代法的for语句部分结束
printf("迭代次数k的值为:%d\n",k);//输出迭代次数
printf("输出的迭代法解的结果为:\n"); for(int i=0;i<n1;i++)//输出x的解
{
printf("第%d个x的值为:%lf\n",i+1,x2[k][i]);
}
printf("\n");
}
八.运行结果如下:
九.实验心得:
高斯=赛德尔迭代法其系数矩阵是严格对角占优的,所以高斯=赛德尔迭代法有很好的收敛性。