实验报告的要求
1.实验名称 2.实验目的 3.算法描述 4.源程序 5.运行结果
6.对算法的理解与分析(包括改进与建议)
实验一
舍入误差与数值稳定性(2学时)
目的与要求:
1、 通过上机编程,复习巩固以前所学程序设计语言; 2、 通过上机计算,了解舍入误差所引起的数值不稳定性。 3、 通过上机计算,了解运算次序对计算结果的影响,从而尽量避免大数吃小数的现象。 实验内容:
? 通过正反两个实例的计算,了解利用计算机进行数
值计算中舍入误差所引起的数值不稳定性,深入理解初始小的舍入误差可能造成误差积累从而对计算结果的巨大影响。
? 通过实际编程,了解运算次序对计算结果的影响,
了解实数运算符合的结合律和分配律在计算机里不一定成立。 概要
舍入误差在计算方法中是一个很重要的概念。在实际计算中,
如果选用了不同的算法,由于舍入误差的影响,将会得到截然不同的结果。因此,选取稳定的算法,在实际计算中是十分重要的。
程序与实例
例 1 对 n = 0,1,2,…,20 计算定积分
n
y1 = n?x?5dx
0x算法 1 利用递推公式
y1 = - 5nnyn?1 n = 1,2,…,20
取
y10??01dx? ln6- ln5 ? 0.182 322 x?5 算法 2 利用递推公式
11? yn?1?5n5注意到
1y1n n = 20,19,…,1
11112020??xdx??xdx??xdx? 12660x?5501050120 取
y20?111(?)?0.008 730 20105126
算法1的程序和输出结果如下: /*数值不稳定算法*/
#include
float y_0=log(6.0)-log(5.0),y_1; int n=1;
clrscr(); /*清屏*/ printf(“y[0]=%-20f”,y_0); while(1) {
Y_1=1.0/n-5*y_0;
Printf(“y[%d]=%-20f”,n,y_1);/*输出*/ if(n>=20)break; y_0=y_1; n++;
if(n%3==0)printf(“\\n”); }
getch();/*保持用户屏幕*/ }
Y[0]=0.182322 Y[3]=0.043128 Y[6]=0.024428 Y[9]=0.004076 Y[12]=1.619237 Y[15]=-200.772069 Y[18]=25097.828125
Y[1]=0.088392 Y[4]=0.034310 Y[7]=0.020719 Y[10]=0.079618 Y[13]=-8.019263 Y[16]=1003.922729 Y[2]=0.058039 Y[5]=0.028448 Y[8]=0.021407 Y[11]=-0.307181 Y[14]=40.167744 Y[17]=-5019.554688 Y[19]=-125489.085938 Y[20]=627445.500000 算法2的程序和输出结果如下: /*稳定算法*/ #include
float y_0=(1/105.0+1/126.0)/2,y_1; int n=20; clrscr();
printf(“y[20]=%-20f”,y_0); while(1) {
y_1=1/(5.0*n)-y_0/5.0;
printf(“y[%d]=%-20f”,n-1,y_1); if(n<=1)break; y_0=y_1; n--;
if(n%3==0)printf(“\\n”); } getch(); }
Y[20]=0.008730 Y[17]=0.009336 Y[14]=0.011229 Y[11]=0.014071 Y[8]=0.018837 Y[5]=0.028468 Y[2]=0.058039
说明:从计算结果可以看出,算法1是不稳定的,而算法2是稳定的。
上机实验:用两种不同的顺序计算?n?1.644834,分析其误差的变
n?110000?2Y[19]=0.008254 Y[16]=0.009898 Y[13]=0.012040 Y[10]=0.015368 Y[7]=0.021233 Y[4]=0.034306 Y[1]=0.088392 Y[18]=0.008876 Y[15]=0.010520 Y[12]=0.012977 Y[9]=0.016926 Y[6]=0.024325 Y[3]=0.043139 Y[0]=0.182322 化。
实验二