计算方法与实习实验报告 舍入误差与数值稳定性
数值分析实验报告77712
《数值分析》实验报告学院:计算机科学与软件学院姓名:XXX班级:计算机XX班学号:XXXXXX页脚内容1页脚内容2实验一:舍入误差与数值稳定性 实验目的:1、 通过上机编程,复习巩固以前所学程序设计语言;2、 通过上机计算,了解舍入误差所引起的数值不稳定性。
3、通过上机计算,了解运算次序对计算结果的影响,从而尽量避免大数吃小数的现象。
实验内容:用两种不同的顺序计算644834.11000012≈∑=-n n,分析其误差的变化。
实验流程图:实验源程序:#include <stdio.h>#include <math.h>void main(){ int i;float s1=0,s2=0,d1,d2;页脚内容3for (i=1;i<=10000;i++)s1=s1+1.0f/(i*i);for (i=10000;i>=1;i--)s2=s2+1.0f/(i*i);d1=(float)(fabs(1.644834-s1));d2=(float)(fabs(1.644834-s2));printf("正向求和结果为%f\n 误差为%f\n\n",s1,d1);printf("反向求和结果为%f\n 误差为%f\n\n",s2,d2);if(d1<d2)printf("正向求和误差小于负向求和误差\n");else if(d1==d2)printf("正向求和误差等于负向求和误差\n"); elseprintf("正向求和误差大于负向求和误差\n");}实验结果:页脚内容4实验分析:第一次做数值实验,又一次使用C语言编程,没有了刚学习C语言的艰难,能够将实验步骤转换成流程图并编写出完整的实验代码,在经过多次调试、改正后得到正确的程序和结果。
这个实验较简单,计算误差时如果输入数据有误差,而在计算过程中舍入误差不增长,则称此算法是稳定的,否则称此算法是数值不稳定的,减少运算次数可以减小舍入误差。
数值计算基础实验报告(3篇)
第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库中的插值和拟合模块,实现了对数据的插值和拟合,并分析了拟合效果。
计算方法与计算 实验一误差分析
因为运行后输出结果为: y 1.370 762 168 154 49, yˆ =1.370 744 664 189
38, R 1.750 396 510 491 47e-005, WU= 1.782 679 830 970 664e-005 104 . 所
以, yˆ 的绝对误差为 10 4 ,故 y
或
>>S1=1+1+1/2+1/(1*2*3)+1/(1*2*3*4)+1/(1*2*3*4*5)+1/ (1*2*3*4*5*6)+1/(1*2*3*4*5*6*7)+1/(1*2*3*4*5*6*7*8),
R1=3/(1*2*3*4*5*6*7*8*9) 运行后结果
S =8.267195767195768e-006 颠倒!!!!!!!!!
2.500 000 00
2.500 000 00
2.500 000 00
表 1-2 例 1.6 中三种算法计算结果的误差
算法
算法 1 的误差
迭
绝对误差
相对误差
代
次
数
0
0.500 000 00
0.250 000 00
1
4.500 000 00 0.642 857 14
2
85.500 000 00
1.030 120 48
算出的结果反而毫无价值。
例 1.2 分别求方程组 AX b 在下列情况时的解,其中 A 11 11.01 .
(1) b 22 ;
(2) b 2.201 .
解: (1) 首先将方程组 AX b 化为同解方程 X A1b ,然后在 MATLAB 工
作窗口输入程序
实习题1
计算方法实验报告班级:学号:姓名:成绩:1 舍入误差及稳定性一、实验目的(1)通过上机编程,复习巩固以前所学程序设计语言及上机操作指令;(2)通过上机计算,了解舍入误差所引起的数值不稳定性二、实验内容1、用两种不同的顺序计算∑n -2,分析其误差的变化n =1100002、已知连分数f =b 0+a 1,利用下面的算法计算f :b 1+a 2/b 2+a 3/(...+a n /b n ) d n =b n , d i =b i +a i +1f =d 0 (i =n -1, n -2, ... , 0d i +1写一程序,读入n , b 0, b 1,..., b n , a 1,..., a n , 计算并打印f3、给出一个有效的算法和一个无效的算法计算积分x n1y n =⎰dx (n =0, 1, ... , 04x +114、设S N =∑j =2N 11⎛311⎫,已知其精确值为-- ⎪ 2j -12⎝2N N +1⎭(1)编制按从大到小的顺序计算S N 的程序(2)编制按从小到大的顺序计算S N 的程序(3)按两种顺序分别计算S 1000, S 10000, S 30000, 并指出有效位数三、实验步骤、程序设计、实验结果及分析1、用两种不同的顺序计算∑n ,分析其误差的变化n =110000-2(1)实验步骤:分别从1~10000和从10000~1两种顺序进行计算,应包含的头文件有stdio.h 和math.h (2)程序设计:a. 顺序计算#include<stdio.h>#include<math.h>void main(){double sum=0;int n=1;while(1){sum=sum+(1/pow(n,2));if(n%1000==0)printf("sun[%d]=%-30f",n,sum); if(n>=10000)break; n++;}printf("sum[%d]=%f\n",n,sum);}b. 逆序计算#include<stdio.h>#include<math.h>void main(){double sum=0;int n=10000;while(1){sum=sum+(1/pow(n,2));if(n%1000==0)printf("sum[%d]=%-30f",n,sum);if(n<=1)break;n--;}printf("sum[%d]=%f\n",n,sum); }3)实验结果及分析:程序运行结果:a. 顺序计算b. 逆序计算结果分析:两种不同顺序计算结果是一样的,顺序计算误差从一开始就很小,而逆序计算误差最开始十分大,后来结果正确。
3_舍入误差分析及数值稳定性
当
c a a b p 1 23 p 1 23 x , ,a 2 ) 用 a 表示 [a 2 2 2
记为: a fl ( x )
实 数 x 在 机 器 中 的 浮 点 (float)表 示 记 为 fl (x ) . 将 由 此 将 表 示 产 生 的 误 差 fl ( x ) x 称 之 为 舍 入 误 差 .
下限
-127
2 2 128
s 7
不区分正零和负零
区分正零和负零
上限
127
下限
-128
上限
127
区分正零和负零
一 般 地
不区分正零和负零 下限 上限
下限
上限
( 2 1)
s
2 1
s
2
s
2 1
s
August 6, 2012
yfnie@
3
4) Overflow
二进制阶数上限 2 1 ,那么表示数的绝对值的上限为:
•当|x|>>1时
x 1 x 1 x 1 x
ln( x
x 1 ) ln( x
2
x 1)
2
•当|x|<<1时
1 1 x
相对误差 e r :
*
e
* r
fl ( x ) x fl ( x )
2
p 1 23
2
p 1
2
23
10
6 . 923
(
1 2
10
6 . 623
)
单 精 度 实 数 fl (x ) 能 够 有 6~7 位 有 效 数 字 .
计算方法实验报告
实验一:误差传播与算法稳定性实验目的:体会稳定性在选择算法中的地位。
实验内容:考虑一个简单的由积分定义的序列10I ,0,1,10nn x dx n a x==+⎰其中a 为参数,分别对0.05a =及15a =按下列两种方法计算。
方案1:用递推公式11,1,2,,10n n I aI n n-=-+= 递推初值可由积分直接得01lna I a+= 方案2:用递推公式111(),,1,,1n n I I n N N a n-=-+=-根据估计式当1n a n ≥+时,11(1)(1)(1)n I a n a n <<+++或当01n a n ≤<+时,11(1)(1)n I a n n<≤++ 取递推初值 当1n a n ≥+时, 11121()2(1)(1)(1)2(1)(1)N N a I I a N a N a a N +≈+=+++++ 当01n a n ≤<+时,111()2(1)(1)N N I I a N N≈+++ 实验要求:列出结果,并对其稳定性进行分析比较,说明原因。
实验二:非线性方程数值解法实验目的:探讨不同方法的计算效果和各自特点 实验内容:应用算法(1)牛顿法;(2)割线法 实验要求:(1)用上述各种方法,分别计算下面的两个例子。
在达到精度相同的前提下,比较其迭代次数。
(I )31080x x +-=,取00x =;(II) 2281(0.1)sin 1.060x x x -+++=,取00x =;(2) 取其它的初值0x ,结果如何?反复选取不同的初值,比较其结果; (3) 总结归纳你的实验结果,试说明各种方法的特点。
实验三:选主元高斯消去法----主元的选取与算法的稳定性问题提出:Gauss 消去法是我们在线性代数中已经熟悉的。
但由于计算机的数值运算是在一个有限的浮点数集合上进行的,如何才能确保Gauss 消去法作为数值算法的稳定性呢?Gauss 消去法从理论算法到数值算法,其关键是主元的选择。
《数值计算方法》实验 (1)
电子科技大学《数值计算方法》
实
验
报
告
输入6,1;0,1,21i i n a b i i n ===+=−" 结果得f=1.718263
输入10,1;0,1,21i i n a b i i n ===+=−" 结果得f=1.718282
输入100,1;0,1,21i i n a b i i n ===+=−" 结果得f=1.718282
从中计算结果看随n 增大迭代计算结果逐渐稳定,可认为出现此现象有两种情况一是对该输入序列a,b 用此迭代公式随序列増长会逐渐逼近一个稳定值,二是在迭代计算过程中产生大数“吃掉”小数现象且计算结果只取7为有效数字。
3. 实验结论
在计算机内做加法运算时,首先要对加数作对阶处理,加之计算机字长有限,因尽量避免出现大数吃小数现象,计算时要注意运算次序,否则会影响结果的可靠性。
报告评分:
指导教师签字:。
《数值分析》实验报告书
N4(0.895) function [y,R]= newcz(X,Y,x,M) x=0.895; M=4; X=[0.4,0.55,0.65,0.8,0.9]; Y=[0.41075,0.57815,0.69675,0.88811,1.02652];
n=length(X); m=length(x); for t=1:m z=x(t); A=zeros(n,n);A(:,1)=Y'; s=0.0; p=1.0; q1=1.0; c1=1.0; for j=2:n for i=j:n A(i,j)=(A(i,j-1)-A(i-1,j-1))/(X(i)-X(i-j+1)); end q1=abs(q1*(z-X(j-1)));c1=c1*j; end C=A(n,n);q1=abs(q1*(z-X(n))); for k=(n-1):-1:1 C=conv(C,poly(X(k)));d=length(C); C(d)=C(d)+A(k,k); end y(k)= polyval(C, z); end R=M*q1/c1; 运行结果: ans = 1.0194
实验三、解线性方程组的直接法
解线性方程组的直接法是指经过有限步运算后能求得方程组精确解
的方法。但由于实际计算中舍入误差是客观存在的,因而使用这类方法 也只能得到近似解。目前较实用的直接法是古老的高斯消去法的变形, 即主元素消去法及矩阵的三角分解法。引进选主元的技巧是为了控制计 算过程中舍入误差的增长,减少舍入误差的影响。一般说来,列主元消 去法及列主元三角分解法是数值稳定的算法,它具有精确度较高、计算 量不大和算法组织容易等优点,是目前计算机上解中、小型稠密矩阵方 程组可靠而有效的常用方法。
Y=[0.82741,0.82659,0.82577,0.82495]; n=length(X); m=length(x); for i=1:m z=x(i);s=0.0; for k=1:n p=1.0; q1=1.0; c1=1.0; for j=1:n if j~=k p=p*(z-X(j))/(X(k)-X(j)); end q1=abs(q1*(z-X(j))); c1=c1*j; end s=p*Y(k)+s; end y(i)=s; end R=M.*q1./c1; 运行结果: ans = 0.8261 2. N3(0.596) function [y,R]= newcz(X,Y,x,M) x=0.596; M=3;
《计算方法》实验报告
《计算方法》实验报告一、实验目的本次《计算方法》实验的主要目的是通过实际操作和编程实现,深入理解和掌握常见的计算方法在解决数学问题中的应用。
通过实验,提高我们运用数学知识和计算机技术解决实际问题的能力,培养我们的逻辑思维和创新能力。
二、实验环境本次实验使用的编程语言为 Python,使用的开发工具为 PyCharm。
实验运行的操作系统为 Windows 10。
三、实验内容与步骤1、线性方程组的求解实验内容:使用高斯消元法和LU分解法求解线性方程组。
实验步骤:首先,定义线性方程组的系数矩阵和常数向量。
对于高斯消元法,通过逐步消元将系数矩阵化为上三角矩阵,然后回代求解。
对于 LU 分解法,将系数矩阵分解为下三角矩阵 L 和上三角矩阵 U,然后通过向前和向后代换求解。
2、插值与拟合实验内容:使用拉格朗日插值法、牛顿插值法进行插值计算,并使用最小二乘法进行曲线拟合。
实验步骤:对于拉格朗日插值法和牛顿插值法,根据给定的节点数据计算插值多项式。
对于最小二乘法,根据给定的数据点和拟合函数形式,计算拟合参数。
3、数值积分实验内容:使用矩形法、梯形法和辛普森法计算定积分。
实验步骤:定义被积函数和积分区间。
对于矩形法,将积分区间等分为若干小区间,每个小区间用矩形面积近似积分值。
梯形法通过构建梯形来近似积分值。
辛普森法利用抛物线来近似积分值。
4、常微分方程的数值解法实验内容:使用欧拉法和改进的欧拉法求解常微分方程。
实验步骤:给定常微分方程和初始条件。
按照欧拉法和改进的欧拉法的公式进行迭代计算,得到数值解。
四、实验结果与分析1、线性方程组的求解高斯消元法和 LU 分解法都能成功求解线性方程组,但在计算效率和数值稳定性上可能存在差异。
对于规模较大的线性方程组,LU 分解法通常更具优势。
实验中通过对比不同方法求解相同线性方程组的结果,验证了算法的正确性。
2、插值与拟合拉格朗日插值法和牛顿插值法在给定节点处能够准确插值,但对于节点之外的区域,可能会出现较大偏差。
计算方法与实习实验报告-舍入误差与数值稳定性
实验一舍入误差与数值稳定性用两种不同的顺序计算≈1.644834,分析其误差的变化;程序:#include<stdio.h>#include<math.h>void main(){int i;float sum_0=0,sum_1=0;for(i=1;i<10001;i++)sum_0+=1.0/(i*i);printf("%f\n",sum_0);for(i=10000;i>0;i--)sum_1+=1.0/(i*i);printf("%f\n",sum_1);}输出:sum_0=1.644725sum_1=1.644834分析讨论:在计算机内作加法运算时,首先要对加数作对阶处理。
由于加数和被加数相比是一个小量,加之计算机字长有限,加数被作为机器零处理了,与被加数相加实际上是被被加数“吃掉”了。
因此多个数相加,应按绝对值从小到大的顺序依次相加,可以保留更多的有效位数。
实验二方程求根——二分法一、目的和要求1)通过对二分法的编程练习,掌握方程求根的二分法的算法;2)通过对二分法的上机运算,进一步体会二分法的特点。
二、实习内容1)二分法的编程实现。
2)进行有根区间和误差限的比较和讨论。
三、算法流程图:1)准备:计算f(x)在有根区间[a, b]端点处的值 f(a), f(b)。
2)二分:计算f(x)在区间中点c=2ba处的函数值f(c)。
3)判断•若f(c)与f(a)异号,则根位于区间[a, c]内,以c代替b;•若f(c)与f(a)同号,则根位于区间[c, b]内,以c代替a;四、实验步骤1)完成二分法的程序设计及录入;2)完成程序的编译和链接,并进行修改;3)用书上的例子对程序进行验证,并进行修改;4)对比估算次数与实际二分次数;5)输入不同的区间初值a, b,查看二分次数的变化;6)输入不同的误差限,查看二分次数的变化;7)完成实验报告。
数值分析实验报告
《数值分析》实验报告学院:计算机科学与软件学院姓名:XXX班级:计算机XX班学号:XXXXXX实验一:舍入误差与数值稳定性实验目的:1、 通过上机编程,复习巩固以前所学程序设计语言;2、 通过上机计算,了解舍入误差所引起的数值不稳定性。
3、 通过上机计算,了解运算次序对计算结果的影响,从而尽量避免大数吃小数的现象。
实验内容:用两种不同的顺序计算644834.11000012≈∑=-n n ,分析其误差的变化。
实验流程图:实验源程序:#include <stdio.h>#include <math.h>void main(){ int i;float s1=0,s2=0,d1,d2;for (i=1;i<=10000;i++)s1=s1+1.0f/(i*i);for (i=10000;i>=1;i--)s2=s2+1.0f/(i*i);d1=(float)(fabs(1.644834-s1));d2=(float)(fabs(1.644834-s2));printf("正向求和结果为%f\n 误差为%f\n\n",s1,d1);printf("反向求和结果为%f\n 误差为%f\n\n",s2,d2);if(d1<d2)printf("正向求和误差小于负向求和误差\n");else if(d1==d2)printf("正向求和误差等于负向求和误差\n"); elseprintf("正向求和误差大于负向求和误差\n");}实验结果:实验分析:第一次做数值实验,又一次使用C语言编程,没有了刚学习C语言的艰难,能够将实验步骤转换成流程图并编写出完整的实验代码,在经过多次调试、改正后得到正确的程序和结果。
这个实验较简单,计算误差时如果输入数据有误差,而在计算过程中舍入误差不增长,则称此算法是稳定的,否则称此算法是数值不稳定的,减少运算次数可以减小舍入误差。
计算方法与实习的实验报告范文
计算方法与实习的实验报告范文1舍入误差与数值稳定性1.1目的与要求(1)通过上机编程,复习巩固以前所学程序设计语言及上机操作指令;(2)通过上机计算,了解舍入误差所引起的数值不稳定性。
1.2舍入误差和数值稳定性1.2.1概要舍入误差在计算方法中是一个很重要的概念。
在实际计算中如果选用了不同的算法,由于舍入误差的影响,将会得到截然不同的结果。
因此,选取稳定的算法在实际计算中是十分重要的。
1.2.2程序和实例对n=0,1,2,…,40计算定积分1某n某5n0d某。
算法利用递推公式yn=ln6-ln50.182322。
程序如下:#include#includevoidmain(){doubley_0=log(6.0/5.0),y_1;intn=1;printf(\while(1){y_1=1.0/n-5某y_0;printf(\if(n>=40)break;y_0=y_1;n++;if(n%2==0)printf(\}}1n5y(n=1,2,…,40)取y0=11某50d某=2方程求根2.1实验目的(1)通过对二分法与牛顿迭代法作编程练习与上级运算,进一步体会二分法与牛顿迭代法的不同特点;(2)编写割线迭代法的程序,求非线性迭代法的解,并与牛顿迭代法作比较。
2.2二分法2.2.1算法给定区间[a,b],并设f(a)与f(b)符号相反,取ε为根的容许误差,δ为|f(某)|的容许误差。
1令c=(a+b)/2;2如果(c-a)0,则令a=c;否则令b=c,重复1,2,3。
2.2.2程序与实例求方程f(某)=某4某100在1.5附近的根。
程序如下:#include#include#defineep5e-6#definedelta1e-6floatBiection(floata,floatb,float(某f)(float)){floatc,fc,fa=(某f)(a),fb=(某f)(b);intn=1;printf(\二分次数\\t\\tc\\t\\tf(c)\\n\while(1){if(fa某fb>0){printf(\不能用二分法求解\c=(a+b)/2,fc=(某f)(c);printf(\if(fab(fc)returnc;}floatf(float某){return某某某某某+4某某某某-10;32}intmain(){floata=1,b=2;float某;某=Biection(a,b,f);printf(\方程的根为%f\return0;}3线性方程组数值解法3.1目的与要求(1)熟悉求解线性方程组的有关理论和方法;(2)会编制列主元消去法、LU分解法、雅克比及高斯赛德尔迭代法的程序;(3)通过实际计算,进一步了解各种方法的优缺点,选择合适的数值方法。
数值计算中的误差分析与稳定性
数值计算中的误差分析与稳定性数值计算在现代科学和工程领域起着至关重要的作用。
然而,在进行数值计算时,由于数值计算机制的特性,会引入一定的误差,这些误差可能会对计算结果产生重要影响。
因此,在数值计算中,误差分析和稳定性的研究至关重要。
本文将讨论数值计算中的误差来源、误差分析方法以及提高计算稳定性的措施。
一、误差来源在数值计算中,误差可以来自多个方面,主要包括截断误差和舍入误差。
1. 截断误差:截断误差是由于使用有限的计算步骤来近似无限精度的数学运算而引入的误差。
例如,在求解微分方程时,使用数值方法进行离散化处理,会引入截断误差。
2. 舍入误差:舍入误差是由于计算机内部表示实数时所引入的误差。
计算机在存储和计算实数时,通常是以有限的二进制位数进行表示。
因此,无法准确表示所有实数。
在进行计算时,舍入误差会导致最终结果与精确结果之间存在差异。
二、误差分析方法为了评估数值计算的精度和稳定性,需要对误差进行分析。
下面介绍几种常见的误差分析方法。
1. 绝对误差:绝对误差是指计算结果与真实值之间的差距。
绝对误差可以通过减去真实值得到。
2. 相对误差:相对误差是绝对误差除以真实值的比值。
相对误差可以反映计算结果的相对精度。
3. 条件数:条件数是用于衡量在输入数据中的微小变动如何影响计算结果的稳定性的度量。
条件数越大,计算结果对输入数据的变动越敏感,稳定性越差。
三、提高计算稳定性的措施为了提高数值计算的稳定性,可以采取以下几种措施。
1. 使用高精度计算库:使用高精度计算库可以增加计算精度,减小误差的产生。
高精度计算库通常能够提供更多的有效位数,从而减小舍入误差。
2. 选择合适的数值方法:不同的数值方法在不同问题上表现不同的准确性和稳定性。
在进行数值计算时,应根据实际情况选择合适的数值方法,以提高计算的稳定性。
3. 控制计算步骤:合理控制计算步骤对于减小误差具有重要作用。
例如,在求解数值积分时,可以选择适当的积分方法和节点,以减小截断误差。
计算方法期末总结
计算方法期末总结一、绪论计算方法是一门研究数学理论和计算实践相结合的学科,是现代科学和工程技术不可或缺的一部分。
通过学习计算方法,我们能够熟练地运用数值计算的方法和技巧,解决科学、工程和社会问题中的数学模型和计算难题。
本学期,我在计算方法课程中系统地学习了数值计算的基本原理、方法和技术,收获颇丰。
在这篇总结中,我将对本学期所学的内容进行归纳总结,并对我在学习过程中的思考和体会进行分享。
二、数值误差与计算不稳定性1.数值误差在实际计算中,由于各种原因,我们得到的结果往往与真实值有偏差,这个偏差就是数值误差。
数值误差分为截断误差和舍入误差两种。
截断误差是由于数值计算过程中的近似处理导致的误差,而舍入误差是由于计算机数字表示的精度有限导致的误差。
2.计算不稳定性计算不稳定性是指计算过程中微小误差的扩大会导致结果出现巨大误差的现象。
在数值计算中,通常使用条件数来描述计算问题的稳定性。
条件数越大,计算问题的稳定性越差。
我们需要正确评估计算问题的稳定性,并选择合适的算法和技术来解决。
三、线性方程组的数值解法线性方程组是科学和工程计算中最常见的问题之一,因此对于线性方程组的数值解法的学习和掌握对我们来说非常重要。
本学期,我主要学习了直接法和迭代法两类求解线性方程组的数值方法。
1.直接法直接法是通过有限次操作将线性方程组转化为一个等价的简化形式,最终求得方程组的解。
典型的直接法包括高斯消元法、LU分解法和Cholesky分解法。
这些方法都能够得到线性方程组的精确解,但计算复杂度比较高,适用于问题规模较小的情况。
2.迭代法迭代法是通过不断迭代更新一个初始解,使其趋近于线性方程组的精确解。
常用的迭代法有雅可比迭代法、高斯-赛德尔迭代法和共轭梯度法等。
迭代法的计算复杂度比较低,适用于问题规模较大的情况。
但迭代法的收敛性和收敛速度都与初始解的选择有关,因此我们需要合理选择初始解,并控制迭代的次数。
四、非线性方程的数值解法非线性方程是科学和工程计算中常见的问题之一,求解非线性方程有时难以找到解析解,因此需要利用数值方法来求解。
计算方法实验一舍入误差与数值稳定性实验报告
实验一 舍入误差与数值稳定性1、目的与要求通过上机编程,复习巩固以前所学得程序设计语言及上机操作指令,切实感受舍入误差所引起的数值不稳定性。
2、算法与实例对n=0,1,2,…,20计算定积分dx x x I nn ⎰+=105 算法1:利用递推公式算法2:利用递推公式n I I n n 51511+-=-),,(01920Λ=n008730.021051126120≈+≈I 3、程序设计(1)流程图算法1流程图如左图,算法2流程图如右 1(2)程序清单算法1:#include<stdio.h>1main(){double y0=log(6.0/5.0),y1;int n=1;printf("y[0]=%f",y0);while (1){y1=1.0/n-5*y0;printf("y[%d]=%f\n",n,y1);if (n>=20)break;y0=y1;n++;}}算法2:#include<math.h>void main(){double y0=(1.0/126+1.0/105)/2,y1; int n;printf("y[20]=%f\n",y0);for (n=19;n>=0;n--){y1=1/(5.0*n)-y0/5.0;printf("y[%d]=%f\n",n,y1); y0=y1;}4、结果与分析算法1结果:算法2结果分析:(1)在数值运算中,两相近数相减会严重损失有效数字。
(2)若参加运算的数量级相差很大而计算机的位数有限,如不注意运算次序,可能出现大数“吃”小数现象,影响计算结果。
(3)避免使用绝对值较小的数做除数(4)如果能够减少运算次数,即能节省计算机的运行时间,又能减少舍入误差。
(5)从结果可以看出,算法1是不稳定的,算法2是稳定的。
数值分析实验报告77712
《数值分析》实验报告学院:计算机科学与软件学院姓名:XXX班级:计算机XX班学号:XXXXXX实验一:舍入误差与数值稳定性实验目的:1、 通过上机编程,复习巩固以前所学程序设计语言;2、 通过上机计算,了解舍入误差所引起的数值不稳定性。
3、 通过上机计算,了解运算次序对计算结果的影响,从而尽量避免大数吃小数的现象.实验内容:用两种不同的顺序计算644834.11000012≈∑=-n n ,分析其误差的变化。
实验流程图:实验源程序:#include 〈stdio。
h>#include <math.h>void main(){int i;float s1=0,s2=0,d1,d2;for (i=1;i〈=10000;i++)s1=s1+1。
0f/(i*i);for (i=10000;i〉=1;i—-)s2=s2+1.0f/(i*i);d1=(float)(fabs(1。
644834—s1));d2=(float)(fabs(1.644834-s2));printf("正向求和结果为%f\n 误差为%f\n\n",s1,d1);printf(”反向求和结果为%f\n 误差为%f\n\n”,s2,d2);if(d1<d2)printf("正向求和误差小于负向求和误差\n");else if(d1==d2)printf("正向求和误差等于负向求和误差\n");elseprintf("正向求和误差大于负向求和误差\n");}实验结果:实验分析:第一次做数值实验,又一次使用C语言编程,没有了刚学习C语言的艰难,能够将实验步骤转换成流程图并编写出完整的实验代码,在经过多次调试、改正后得到正确的程序和结果。
这个实验较简单,计算误差时如果输入数据有误差,而在计算过程中舍入误差不增长,则称此算法是稳定的,否则称此算法是数值不稳定的,减少运算次数可以减小舍入误差。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一舍入误差与数值稳定性
用两种不同的顺序计算≈1.644834,分析其误差的变化;
程序:
#include<stdio.h>
#include<math.h>
void main()
{
int i;
float sum_0=0,sum_1=0;
for(i=1;i<10001;i++)
sum_0+=1.0/(i*i);
printf("%f\n",sum_0);
for(i=10000;i>0;i--)
sum_1+=1.0/(i*i);
printf("%f\n",sum_1);
}
输出:
sum_0=1.644725
sum_1=1.644834
分析讨论:
在计算机内作加法运算时,首先要对加数作对阶处理。
由于加数和被加数相比是一个小量,加之计算机字长有限,加数被作为机器零处理了,与被加数相加实际上是被被加数“吃掉”了。
因此多个数相加,应按绝对值从小到大的顺序依次相加,可以保留更多的有效位数。
实验二方程求根——二分法
一、目的和要求
1)通过对二分法的编程练习,掌握方程求根的二分法的算法;
2)通过对二分法的上机运算,进一步体会二分法的特点。
二、实习内容
1)二分法的编程实现。
2)进行有根区间和误差限的比较和讨论。
三、算法
流程图:
1)准备:计算f(x)在有根区间[a, b]端点处的值f(a), f(b)。
2)二分:计算f(x)在区间中点c=
2b
a
处的函数值f(c)。
3)判断
•若f(c)与f(a)异号,则根位于区间[a, c]内,以c代替b;•若f(c)与f(a)同号,则根位于区间[c, b]内,以c代替a;
四、实验步骤
1)完成二分法的程序设计及录入;
2)完成程序的编译和链接,并进行修改;
3)用书上的例子对程序进行验证,并进行修改;
4)对比估算次数与实际二分次数;
5)输入不同的区间初值a, b,查看二分次数的变化;6)输入不同的误差限,查看二分次数的变化;
7)完成实验报告。
五、实验结果
1.经编译、链接及例子验证结果正确的源程序:#include<stdio.h>
#include<math.h>
#define eps 5e-4
#define delta 1e-6
float f(float x)
{
return x*x*x+x*x-3*x-3;
}
void main()
{
float a,b,c;
int k;
float fa,fb,fc;
int n=1;
scanf("%f,%f",&a,&b);
printf("a=%f b=%f\n",a,b);
k=(log(b-a)-log(eps))/log(2.0);
printf("k=%d\n",k);
fa=f(a);
fb=f(b);
do
{
if(fa*fb>0)
{
printf("无解");
break;
}
else
{
c=(a+b)/2;
fc=f(c);
if(fabs(fc)<delta)break;
if(fa*fc<0)
{
b=c;
fb=fc;
}
if(fb*fc<0)
{
a=c;
fa=fc;
}
if((b-a)<eps)break;
}
printf("%d %f %f\n",n,c,fc);
n++;
}
while(n=k );
}
2. 实例验证结果:
1)方程:f(x)=x3+x2-3x-3=0
2)输入初始参数:a=1, b=2, EPS=5e-6
3)结果输出:
3. 改变a, b的值为:a=0, b=2, EPS不变,仍为5e-6,其结果为:
4. 改变EPS的值为:EPS=5e-4, a, b不变,仍为a=1, b=2,其结果为:
六、分析和讨论
1.估算次数与实际二分次数的分析和讨论
答:估算的次数与实际二分次数相等,即估算多少次,就二分了多少次.
2.输入不同的区间初值a, b,二分次数的变化情况
答:输入的区间范围越大,要达到相同的精确值,二分次数K会相应的增加。
3.输入不同的误差限EPS,二分次数的变化情况
答:随着误差限的增大,二分次数会相应的减少
七、心得
通过二分计算在电脑中的演示更一步了解了二分法的特点: 用对分区间的方法根据分点处函数f(x)值的符号逐步将有根区间缩小,使在足够小的区间内,方程有且仅有一个根. 二分法收敛速度较慢,在编程过程中,对变量的定义采用哪种类型,主要是对条件的判断做准确分析,对中断条件的准确把握,在调试过程中,对k值采用哪种类型的定义,对k值的输出有很大关系。