数值分析上机题参考答案
如有帮助欢迎下载支持
数值分析上机题
姓名:陈作添 学号:040816
习题1
20.(上机题)舍入误差与有效数 设2
21
1N
N j S j ==-∑
,其精确值为1311221N N ??-- ?+??
。 (1)编制按从大到小的顺序2
22
111
21311
N S N =
+++---,计算N S 的通用程序。 (2)编制按从小到大的顺序2221111(1)121
N S N N =+++----,计算N
S 的通用程序。 (3)按两种顺序分别计算210S ,410S ,610S ,并指出有效位数。(编制程序时用单精度) (4)通过本上机题,你明白了什么? 按从大到小的顺序计算N S 的通用程序为: #include
float sum(float N) { float j,s,sum=0; for(j=2;j<=N;j++) { s=1/(j*j-1); sum+=s; } return sum; } 按从小到大的顺序计算N S 的通用程序为: #include
float j,s,sum=0; for(j=N;j>=2;j--) {
s=1/(j*j-1); sum+=s; }
return sum; }
从大到小的顺序的值
从小到大的顺序的值
精确值 有效位数 从大到小 从小到大
210S 0.740049 0.74005 0.740049 6 5 410S 0.749852 0.7499 0.7499 4 4 610S
0.749852
0.749999
0.749999
3
6
通过本上机题,看出按两种不同的顺序计算的结果是不相同的,按从大到小的顺序计算的值与精确值有较大的误差,而按从小到大的顺序计算的值与精确值吻合。从大到小的顺序计算得到的结果的有效位数少。计算机在进行数值计算时会出现“大数吃小数”的现象,导致计算结果的精度有所降低,我们在计算机中进行同号数的加法时,采用绝对值较小者先加的算法,其结果的相对误差较小。
习题2
20.(上机题)Newton 迭代法
(1)给定初值0x 及容许误差ε,编制Newton 法解方程()0f x =根的通用程序。
(2)给定方程3()/30f x x x =-=,易知其有三个根13x *=-,20x *=,33x *
=。
1.由Newton 方法的局部收敛性可知存在0δ>,当0(,)x δδ∈-时,Newton 迭代序列收敛于根2x *
。试确定尽可能大的δ。
2.试取若干初始值,观察当0(,1)x ∈-∞-,(1,)δ--,(,)δδ-,(,1)δ,(1,)∞时Newton 序列是否收敛以及收敛于哪一个根。
(3)通过本上机题,你明白了什么? 解:(1)编制的通用程序: #include
#define eps 0.000001 /给定容许误差 float f(float x) //定义函数f(x) { float f; f=x*x*x/3-x; //f(x)的表达式; return(f); }
float df(float x) //定义函数df(x),计算f(x)的导函数 { float df; df=x*x-1; //f(x)导函数的表达式; return (df); }
void main(void)
{ float x0,x1,a; int k=0;
cout<<"请输入初值x0:"; cin>>x0; do { a=-f(x0)/df(x0); x1=x0+a; k++; x0=x1; }
while(fabs(a)>eps); cout< //输出迭代的次数和根值 } (2)计算迭代序列收敛于根2x * 的尽可能大的δ的函数为: #include void delay(int n) //定义延时函数 {for(n=10000;n>0;n--);} #define eps 0.000001 float f(float x) //定义函数f(x) { float f; f=x*x*x/3-x; //f(x)的表达式; return(f); } float df(float x) //定义函数df(x),计算f(x)的导函数 { float df; df=x*x-1; //f(x)导函数的表达式; return (df); }