计算方法实验报告4
- 格式:docx
- 大小:21.67 KB
- 文档页数:11
一、实验目的1. 理解并掌握计算方法的基本概念和原理;2. 学会使用计算方法解决实际问题;3. 提高编程能力和算法设计能力。
二、实验内容本次实验主要涉及以下内容:1. 线性方程组的求解;2. 多项式插值;3. 牛顿法求函数零点;4. 矩阵的特征值和特征向量求解。
三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 科学计算库:NumPy、SciPy四、实验步骤及结果分析1. 线性方程组的求解(1)实验步骤a. 导入NumPy库;b. 定义系数矩阵A和增广矩阵b;c. 使用NumPy的linalg.solve()函数求解线性方程组。
(2)实验结果设系数矩阵A和增广矩阵b如下:A = [[2, 1], [1, 2]]b = [3, 2]解得:x = [1, 1]2. 多项式插值(1)实验步骤a. 导入NumPy库;b. 定义插值点x和对应的函数值y;c. 使用NumPy的polyfit()函数进行多项式拟合;d. 使用poly1d()函数创建多项式对象;e. 使用多项式对象计算插值点对应的函数值。
(2)实验结果设插值点x和对应的函数值y如下:x = [1, 2, 3, 4, 5]y = [1, 4, 9, 16, 25]拟合得到的二次多项式为:f(x) = x^2 + 1在x = 3时,插值得到的函数值为f(3) = 10。
3. 牛顿法求函数零点(1)实验步骤a. 导入NumPy库;b. 定义函数f(x)和导数f'(x);c. 设置初始值x0;d. 使用牛顿迭代公式进行迭代计算;e. 判断迭代结果是否满足精度要求。
(2)实验结果设函数f(x) = x^2 - 2x - 3,初始值x0 = 1。
经过6次迭代,得到函数零点x ≈ 3。
4. 矩阵的特征值和特征向量求解(1)实验步骤a. 导入NumPy库;b. 定义系数矩阵A;c. 使用NumPy的linalg.eig()函数求解特征值和特征向量。
浙江大学城市学院实验报告课程名称 科学计算实验项目名称 线性方程组的求解-迭代法实验成绩 指导老师(签名 ) 日期 2012-4-6一. 实验目的和要求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)3) 松弛迭代:SORmethod(A,b,x0,Nmax,eps,w)2-2 分析应用题利用2-1中的程序来分析用下列迭代法解线性方程组:123456410100014101050141012101410501014120010146x x x x x x --⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥----=⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥----⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦ 的收敛性.并求出使(1)()20.0001k k X X +-≤的近似解及相应的迭代次数.其中取迭代初始向量(0)X 为零向量。
数值计算⽅法⽅程求根数值计算⽅法实验报告实验内容:⽅程求根实验室:专业班级:学号:姓名:2.⽤MATBAB软件,⽤⼆分法求⽅程f(x)=x^3+4*x^2-10=0在区间[1,2]内根的近似值,为使误差不超过10^-5时所需要的⼆分次数。
function bisection_time(tolerance)a=1;b=2;k=0;while(abs(b-a)>tolerance)c=(a+b)/2;fa=a^3+4*a^2-10;fb=b^3+4*b^2-10;fc=c^3+4*c^2-10;if((fa==0)|(fc==0))disp(k);elseif(fa*fc<0)b=c;k=k+1;elseif(fc*fb<0)a=c;k=k+1;elseif(fb==0)disp(k);endendsoluntion=(a+b)/2;disp(soluntion);disp(k);运⾏结果1.36523176.取x0=1.5,⽤⽜顿迭代法求f(x)=x^3+4*x^2-10=0的跟的近似值function new(tolerance)x0=1.5;k=0;a=x0^3+4*x0^2-10;b=3*x0^2+8*x0;x1=x0-a/b;while(abs(x0-x1)>tolerance)x0=x1;k=k+1;a=x0^3+4*x0^2-10;b=3*x0^2+8*x0;x1=x0-a/b;enddisp(x1);disp(k);运⾏结果1.3652338.弦割法求⽅程f(x)=x^3-3*x^2-x+9=0在区间[-2,-1]内的⼀个实根近似值Xk,使|f(x) |<=10^-5. function xuange(k)x0=-2;x1=-1;t=0;a=x1^3-3*x1^2-x1+9;b=x0^3-3*x0^2-x0+9;x2=x1-a*(x1-x0)/(a-b);while(abs(x1-x0)>k)x0=x1;x1=x2;a=x1^3-3*x1^2-x1+9;b=x0^3-3*x0^2-x0+9;x2=x1-a*(x1-x0)/(a-b);t=t+1;enddisp(x1);disp(t)运⾏结果-1.52510269.⽤艾特肯算法求⽅程f (x )=x^3+4*x^2+10=0在区间[1,2]内的根的近似值(取X0=1.5,g (x )=410x ,精确到|Xk+1-Xk|<=10^-5,并与第2,3,6题的相应结果进⾏⽐较。
第1篇一、实验目的1. 理解数值计算的基本概念和常用算法;2. 掌握Python编程语言进行数值计算的基本操作;3. 熟悉科学计算库NumPy和SciPy的使用;4. 分析算法的数值稳定性和误差分析。
二、实验内容1. 实验环境操作系统:Windows 10编程语言:Python 3.8科学计算库:NumPy 1.19.2,SciPy 1.5.02. 实验步骤(1)Python编程基础1)变量与数据类型2)运算符与表达式3)控制流4)函数与模块(2)NumPy库1)数组的创建与操作2)数组运算3)矩阵运算(3)SciPy库1)求解线性方程组2)插值与拟合3)数值积分(4)误差分析1)舍入误差2)截断误差3)数值稳定性三、实验结果与分析1. 实验一:Python编程基础(1)变量与数据类型通过实验,掌握了Python中变量与数据类型的定义方法,包括整数、浮点数、字符串、列表、元组、字典和集合等。
(2)运算符与表达式实验验证了Python中的算术运算、关系运算、逻辑运算等运算符,并学习了如何使用表达式进行计算。
(3)控制流实验学习了if-else、for、while等控制流语句,掌握了条件判断、循环控制等编程技巧。
(4)函数与模块实验介绍了Python中函数的定义、调用、参数传递和返回值,并学习了如何使用模块进行代码复用。
2. 实验二:NumPy库(1)数组的创建与操作通过实验,掌握了NumPy数组的基本操作,包括创建数组、索引、切片、排序等。
(2)数组运算实验验证了NumPy数组在数学运算方面的优势,包括加、减、乘、除、幂运算等。
(3)矩阵运算实验学习了NumPy中矩阵的创建、操作和运算,包括矩阵乘法、求逆、行列式等。
3. 实验三:SciPy库(1)求解线性方程组实验使用了SciPy库中的线性代数模块,通过高斯消元法、LU分解等方法求解线性方程组。
(2)插值与拟合实验使用了SciPy库中的插值和拟合模块,实现了对数据的插值和拟合,并分析了拟合效果。
4的倍数特征实验报告单
实验目的:
本次实验旨在探究4的倍数的特征,通过对不同数字进行分析,验证4的倍数的特征并得出结论。
实验方法:
1. 选择一系列整数数字进行实验,包括4的倍数和非4的倍数。
2. 分别对这些数字进行求余数运算,即用这些数字除以4并得出余数。
3. 分析余数的情况,观察4的倍数和非4的倍数的特征。
实验结果:
通过实验我们得到了以下结果:
1. 对于4的倍数,经过求余数运算得到的余数始终为0。
2. 对于非4的倍数,求余数运算的结果不为0。
3. 通过不同数字的实验,验证了4的倍数的特征,即能被4整除的数字的余数为0。
实验结论:
综合实验结果,我们得出结论:
1. 4的倍数的特征是其能被4整除,即求余数的结果为0。
2. 任何一个数被4整除的余数都是0,这是4的倍数的特征之一。
实验总结:
本次实验验证了4的倍数的特征,通过实验数据的分析,我们得以确定4的倍数的特征为其能被4整除,余数为0。
实验结果的验证进一步加深了我们对数学中倍数的理解,为数学知识的学习提供了实际的例证。
希望通过这次实验,同学们能更加深入地了解4的倍数的特征,提高数学分析的能力。
实验延伸:
在以后的学习中,可以进一步探讨倍数的特征,例如2的倍数、5的倍数等,通过实验验证不同倍数的特征,加深对数学概念的理解。
同时,可以进行更加复杂的数学实验,进一步提高数学分析的能力,培养数学思维的能力。
希望同学们在数学学习中能够通过实验的方式,加深对数学的理解,提高数学的学习兴趣和能力。
“数据结构”课程设计报告长整数四则运算学生姓名:吴成杰徐文良指导教师:陈少军所在系:电子信息系所学专业:计算机科学与技术年级:2010计算机(1)班目录第1章需求分析 (1)1.1选题要求 (1)1.2选题背景和意义 (1)1.3选题目标 (2)1.4组员分配任务 (2)第2章概要分析 (2)2.1系统数据流图 (2)2.2原始数据 (3)2.3输出数据 (3)2.4对数据的处理 (3)2.5数据结构(存储方式) (4)2.6模块分析 (4)第3章详细设计 (4)第4章系统说明书 (11)第5章系统测试 (12)项目总结 (16)参考文献 (17)第1章需求分析1.1选题要求1、实现一个任意长度的整数进行四则运算的演示程序(1) 运算过程分步骤显示(2) 完成含有加法和减法的四则运算(3) 完成含有乘法和除法的四则运算(4) 包含括号的四则运算2、2个人对应完成2个人各自的任务1.2选题背景和意义(1)选题背景操作系统老师曾经布置我们做一道斐波拉契数列和求30的阶乘,但是计算的结果很大,还不知道该做样的存储,老师告诉我们需要用高精度数的知识能将计算的结果存储起来,数据结构老师也曾经布置过一个实验题,是计算长整数的加法的,但是长整数的位数是固定的。
于是我们试想计算任意长度的整数是不是能把所有的四则运算问题解决。
(2)选题意义我们选的这个课题能计算任意的四则运算,比如:1234567+7654321=8888888987654321-123456789=86419754123*456=5608884/42=2586-25*15+8*(9*2-144/12)=586-375+8*(18-12)=586-375+8*6=586-355+48=211+48=2591.3选题目标实现一个任意长度的整数进行四则运算的演示程序(1) 运算过程分步骤显示(2) 完成含有加法和减法的四则运算(3) 完成含有乘法和除法的四则运算(4) 包含括号的四则运算1.4组员分配任务我们组有两个成员,分别为吴成杰和徐文良,一个负责写主函数、函数整体的框架和写转换函数函数和对输入的字符进行处理,一个负责写出栈函数和写处理函数和拼接,程序出现错误,两个人一起在一起互相商量,修改。
4的倍数特征实验报告单实验目的:本实验旨在探究4的倍数的特征,并通过实验数据分析和归纳总结得出相关结论。
实验材料:1. 20张白纸2. 铅笔3. 计算器实验步骤:1. 将20张白纸按照一定的格式排列,比如每张纸上画三个小矩形。
2. 在第一个小矩形内随机写入一个个位数数字,数字可以重复出现。
3. 统计在四个小矩形内出现4的倍数的个数,并记录在每张纸上。
4. 将每张纸上记录的数据进行汇总并计算得出4的倍数出现的频率。
5. 对实验数据进行分析和归纳总结得出结论。
实验结果:经过统计和计算,在20张纸上统计到的4的倍数出现的个数为:12、8、9、13、11、7、10、15、12、9、8、14、10、12、11、9、13、8、11和12个,共计198个。
经过计算,20张纸上4的倍数出现的频率为:0.06、0.04、0.045、0.065、0.055、0.035、0.05、0.075、0.06、0.045、0.04、0.07、0.05、0.06、0.055、0.045、0.065、0.04、0.055和0.06。
通过对实验数据的分析和归纳总结,可以得出以下结论:1. 出现4的倍数的频率在不同的样本中有一定的差异,但总体上来说,4的倍数出现的频率较稳定并且相对均衡。
2. 在20张纸样本中,4的倍数出现的个数大多在10个左右,少数在5个以下或15个以上。
3. 在20张纸样本中,4的倍数出现的频率在0.04~0.075之间,呈现出比较均衡的分布。
4. 在20张纸样本中,4的倍数与出现的位置没有明显的规律性可言,出现在不同的位置上。
结论:本次实验的结果表明,4的倍数具有较为稳定的出现频率,并且在样本中呈现较为均衡的分布,与出现的位置没有明显的规律性可言。
数值分析实验报告指导老师:宛艳萍姓名:班级:学号:实验三 复化辛卜生法,龙贝格法1.实验名称:复化辛卜生法,龙贝格法2.实验目的1)通过实际计算体会各种方法的精确度。
2)会编写用复化辛卜生、龙贝格算法求定积分的程序。
3.算法描述1)用复化辛卜生法计算积分 dxx I ⎰+=12)1/(1算法:复化辛卜生公式为S n =h/6∑∑+-=+++)]()2/(4)([11k k kn k x f h x f xf ,计算过程为:1.令,/)(n a b h -= ),2/(1h a f s +=;02=s2.对1,,2,1-=n k计算),2/(11h kh a f s s +++=)(22kh a f s s ++=3.))(24)((6/21b f s s a f h s +++= 。
2)龙贝格算法计算dxxI ⎰+=102)1/(156e ε=-算法)((12/12∑-=++=n k k n n n x f h T T ;/)(n a b h n -= n k h k x )2/1(2/1+=+)(3/122n n n n T T T S -+= )_(15/122n n n n S S S C +=)(63/122n n n n C C C R -+=用事后估计法控制精度2|5e -6n n R R -< 。
4.源程序:1)/* 用复化辛卜生公式求积分 */ #include "stdio.h" float fx(float x){double f;f=1.0/(1.0+x*x); return f; } double fs(int n){double a=0.0,b=1.0,h,s,s1,s2=0; int i;h=(b-a)/n; s1=fx(a+h/2); for(i=1;i<n;i++){s1=s1+fx(a+i*h+h/2); s2=s2+fx(a+i*h);}s=(h/6.0)*(fx(a)+fx(b)+4*s1+2*s2);return s;}void main(){printf("实验三复化辛卜生法计算机112 耿向飞学号:112434\n");printf("s(2)=%lf\ns(4)=%lf\ns(8)= %lf",fs(2),fs(4),fs(8));}2)/* 龙贝格法 */#include "stdio.h"#include "math.h"#define E 2.71828182//被积函数f(x)double fx(double x){double f;f=1/(1+x*x);return f;}//梯形公式求tndouble tx(int n){double s3=0.0,h,t,b=1.0,a=0.0;int i;h=(b-a)/n;for(i=1;i<n;i++)s3=s3+fx(i*h);t=(h/2)*(fx(a)+fx(b)+2*s3);return t;} double s(int n){double s;s=tx(2*n)+(1.0/3.0)*(tx(2*n)-tx(n ));return s;}double c(int n){double c;c=s(2*n)+(1.0/15.0)*(s(2*n)-s(n)) ;return c;}double r(int n){double r;r=c(2*n)+(1.0/63.0)*(c(2*n)-c(n)) ;return r;}void main(){double rr,pp;int n=1;rr=r(n);pp=r(2*n)-r(n);printf("实验三龙贝格法计算机112 耿向飞学号:112434\n");printf("结果为:%.15lf 误差小于等于: %.15lf",rr,pp);}5.运行结果1)复化辛卜生公式2)龙贝格算法6.对算法的理解与分析:复化辛卜生公式和龙贝格算法适用于求数值积分,而且都能提高计算积分的精度龙贝格算法其实是在复化辛卜生公式递推的基础之上生成的一种精度高,而且收敛速度也较快的一种算法。
第1篇一、实验目的通过本次实验,掌握常见算法的设计原理、实现方法以及性能分析。
通过实际编程,加深对算法的理解,提高编程能力,并学会运用算法解决实际问题。
二、实验内容本次实验选择了以下常见算法进行设计和实现:1. 排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序。
2. 查找算法:顺序查找、二分查找。
3. 图算法:深度优先搜索(DFS)、广度优先搜索(BFS)、最小生成树(Prim算法、Kruskal算法)。
4. 动态规划算法:0-1背包问题。
三、实验原理1. 排序算法:排序算法的主要目的是将一组数据按照一定的顺序排列。
常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等。
2. 查找算法:查找算法用于在数据集中查找特定的元素。
常见的查找算法包括顺序查找和二分查找。
3. 图算法:图算法用于处理图结构的数据。
常见的图算法包括深度优先搜索(DFS)、广度优先搜索(BFS)、最小生成树(Prim算法、Kruskal算法)等。
4. 动态规划算法:动态规划算法是一种将复杂问题分解为子问题,通过求解子问题来求解原问题的算法。
常见的动态规划算法包括0-1背包问题。
四、实验过程1. 排序算法(1)冒泡排序:通过比较相邻元素,如果顺序错误则交换,重复此过程,直到没有需要交换的元素。
(2)选择排序:每次从剩余元素中选取最小(或最大)的元素,放到已排序序列的末尾。
(3)插入排序:将未排序的数据插入到已排序序列中适当的位置。
(4)快速排序:选择一个枢纽元素,将序列分为两部分,使左侧不大于枢纽,右侧不小于枢纽,然后递归地对两部分进行快速排序。
(5)归并排序:将序列分为两半,分别对两半进行归并排序,然后将排序好的两半合并。
(6)堆排序:将序列构建成最大堆,然后重复取出堆顶元素,并调整剩余元素,使剩余元素仍满足最大堆的性质。
2. 查找算法(1)顺序查找:从序列的第一个元素开始,依次比较,直到找到目标元素或遍历完整个序列。
计算方法实验报告(四)(一)线性方程的迭代解法一、实验问题利用简单迭代法,两种加速技术,牛顿法,改进牛顿法,弦割法求解习题5-1,5-2,5-3中的一题,并尽可能准确。
选取5-3:求在x=1.5附近的根。
二、问题的分析(描述算法的步骤等)(1)简单迭代法算法:给定初始近似值,求的解。
Step 1 令i=0;Step 2 令(计算);Step 3 如果,则迭代终止,否则重复Step 2。
(2)Aitken加速法算法Step 1 令k=0,利用简单迭代算法得到迭代序列;Step 2 令-(计算得到一个新的序列,其中k=0,1,2…);Step 3 如果,则迭代终止,否则重复Step 2。
(3)插值加速法算法Step 1 令k=0,利用简单迭代算法得到迭代序列;Step 2 令+(计算得到一个新的序列,其中k=1,2,3…);Step 3 如果,则迭代终止,否则重复Step 2。
(4)牛顿法算法Step 1给定初始近似值;Step 2令,其中k计算得到的序列;Step 3如果,则迭代终止,否则重复Step 2。
(5)改进牛顿法的算法Step 1给定初始近似值;Step 2令,其中k迭代计算得到的序列;Step 3如果,则迭代终止,否则重复Step 2。
(6)弦割法算法(双点弦割法)Step 1给定初始近似值,;Step 2令其中k计算得到的序列;Step 3如果,则迭代终止,否则重复Step 2。
三、程序设计(1)简单迭代法利用迭代公式进行迭代运算。
#include <iostream.h>#include <math.h>#include<stdio.h>double fun(double x){double c=1+x*x;returnpow(c,1/3.0);}void main(){double x=1.5;double y=0;double D=1;double e=0.001;while(D>e){D=0;y=fun(x);if(fabs(y-x)>=D){D=fabs(y-x);}x=y;}cout<<x<<endl;}(2) )Aitken加速法源程序如下:x1=1.5;eps=0.0001;y1=(1+x1^2)^(1/3);z1=(1+y1^2)^(1/3);x=z1-(z1-y1)^2/(z1-2*y1+x1); while eps<abs(x2-x)x=x2;x1=y1;y1=(1+x1^2)^(1/3);z1=(1+y1^2)^(1/3);x2=z1-(z1-y1)^2/(z1-2*y1+x1); n=n+1;endfprintf('迭代次数 n=%.0f\n',n); fprintf('x2=%.5f\n',x2)(3)插值加速法源程序如下:x1=0;x2=1.5;eps=0.0000001;y1=0;z1=0;n=0;while eps<abs(x2-x1)x1=x2;y1=(1+x1^2)^(1/3);z1=(1+y1^2)^(1/3);x2=z1+(z1-y1)^2/(z1-2*y1+x1); n=n+1;endfprintf('迭代次数 n=%.0f\n',n);fprintf('x2=%.5f\n',x2)(4)牛顿法:利用公式进行迭代运算程序设计如下:#include <iostream.h>#include <math.h>double fun(double x){double a=2*pow(x,3.0)-pow(x,2.0)+1; double b=3*pow(x,2.0)-2*x;return a/b;}void main(){double x=1.5;double y=0;double D=1;double e=0.001;double f=0;while(D>e){D=0;y=fun(x);if(fabs(y-x)>=D){D=fabs(y-x);}x=y;f++;}cout<<x<<endl;cout<<"f="<<f<<endl;}(5)运用改进牛顿法:迭代公式:程序代码如下:#include <iostream.h>#include <math.h>double fun(double x){double a=2*pow(x,3.0)-pow(x,2.0)+1; double b=3*pow(x,2.0)-2*x;double c=pow((pow(x,3.0)-pow(x,2.0)-1),2.0); double d=(6*x-2)/12;return a/b-c*d;}void main(){double x=1.5;double y=0;double D=1;double e=0.001;double f=0;while(D>e){D=0;y=fun(x);if(fabs(y-x)>=D){D=fabs(y-x);}x=y;f++;}cout<<x<<endl;cout<<"f="<<f<<endl;}(6)利用弦割法利用公式程序代码:#include "stdafx.h"#include <iostream>using namespace std;#include <math.h>doublefua(double l){returnpow(l,3.0)-pow(l,2.0)-1;}int _tmain(intargc, _TCHAR* argv[]){double x=1.4;double y=0;double D=1;double e=0.001;double f=0;while(D>e){D=0;y=x-fua(x)*(x-1.5)/(fua(x)-0.125);if(fabs(y-x)>=D){D=fabs(y-x);}x=y;f++;}cout<<x<<endl;cout<<"f="<<f<<endl;return 0;}四、计算结果(1)简单迭代法的运行结果:x=1.46624(2)Aitken加速法运行结果如下:迭代次数 n=15x2=1.46557(3)插值加速法运行结果如下:迭代次数 n=15x2=1.46557(4)牛顿迭代法的运行结果如下(5)改进牛顿迭代法运行结果:(6)弦割法的运行结果五、结果分析通过实验很容易发现在相同的准确数字时,加速迭代法的迭代次数明显少于简单的迭代法。
但仅仅就实验结果而言,牛顿迭代法和改进的牛顿迭代法与弦割法所得运行结果相同,但是改进的迭代法速度比牛顿迭代法要快速。
六、实验的总结与体会迭代法是一种逐次逼近的方法,且都是局部收敛的,具有原理简单,编写程序方便等优点,但还存在是否收敛与收敛速度快慢的问题,不能盲目使用。
当迭代过程只有线性收敛速度时,可采用埃特金加速法实现加速。
牛顿法是一种特殊的迭代法,用于求方程单根时具有二阶收敛速度。
但牛顿法对初值的要求苛刻,而且需要求函数的导数,遇到求导数复杂的情形,常用弦割法求解。
弦割法是对牛顿法的变形,不需要求函数的导数,但收敛阶不高,而且需要提供两个较好的初值。
(二)线性方程组的迭代解法一、实验问题利用雅可比迭代法,赛德尔迭代法求解如下方程组二、问题的分析(描述算法的步骤等)雅克比迭代法算法如下:(1)对令(2)令(3)对做令对但令令若则令(4)对i=1令(5)若D则转到()(6)输出并停止计算赛德尔迭代法算法如下()对令()令(3)对做令对但令令若则令令(4)若D则转到()(5)输出并停止计算三、程序设计(1)运用雅可比迭代法进行迭代:代码如下:#include <iostream.h>#include <math.h>void main(){double x[3]={0,0,0};double a[3][3]={-8,1,1,1,-5,1,1,1,-4}; double b[3]={1,16,7};double y[3];double e=0.04;double D=1;int f=0;while(D>e){D=0;for(int c=0;c<5;c++){for(int i=0;i<3;i++){y[i]=b[i];for(int j=0;j<3;j++){if(j!=i){y[i]=y[i]-a[i][j]*x[j];}y[i]=y[i]/a[i][i];if(fabs(x[i]-y[i])>=D){D=fabs(x[i]-y[i]);}}for(int l=0;l<3;l++){x[l]=y[l];}}f++;}for(int k=0;k<3;k++){cout<<x[k]<<endl;}cout<<f<<endl;}(2)赛德尔迭代法源代码如下:程序代码:#include <iostream.h>#include <math.h>#include<stdio.h>void main(){double x[3]={0,0,0};double a[3][3]={-8,1,1,1,-5,1,1,1,-4}; double b[3]={1,16,7};double y;double e=0.0001;double D=1;double f=0;while(D>e){D=0;for(int c=0;c<5;c++){for(int i=0;i<3;i++){y=b[i];for(int j=0;j<3;j++)if(j!=i){y=y-a[i][j]*x[j];}}y=y/a[i][i];if(fabs(x[i]-y)>=D){D=fabs(x[i]-y);}}for(int l=0;l<3;l++){x[l]=y[l];}}f++;}for(int k=0;k<3;k++){cout<<x[k]<<endl;};cout<<f<<endl;}四、计算结果(1)雅克比迭代法运行结果如下:(2)赛德尔迭代法运行结果如下:五、结果分析通过观察运行结果很容易发现使用赛德尔迭代法求解此线性方程组具有明显的优势,它的迭代次数明显少于雅克比迭代法,因此收敛速度更快。