数值分析实验一 舍入误差与数值稳定性

本实验所有代码均在Turbo C 2.0下实现。 

一、目的与要求:

1、通过上机编程,复习巩固以前所学程序设计语言;

2、通过上机计算,了解舍入误差所引起的数值不稳定性。

3、通过上机计算,了解运算次序对计算结果的影响,从而尽量避免大数吃小数的现象。

二、实验内容:

1、通过正反两个实例的计算,了解利用计算机进行数值计算中舍入误差所引起的数值不稳定性,深入理解初始小的舍入误差可能造成误差积累从而对计算结果的巨大影响。

2、通过实际编程,了解运算次序对计算结果的影响,了解实数运算符合的结合律和分配律在计算机里不一定成立。

三、实验概要

舍入误差在计算方法中是一个很重要的概念。在实际计算中,如果选用了不同的算法,由于舍入误差的影响,将会得到截然不同的结果。因此,选取稳定的算法,在实际计算中是十分重要的。

四、程序与实例 

五、算法描述

算法一:

根据递推式

 取

算法二:

根据递推式

 

 六、实验代码

#include <math.h>
#include <stdio.h>
int main()
{

	float y1[21], y2[21];
	int i=1;
	clrscr(); 
	puts("algorithm 1:\n");
	y1[0] = log(6) - log(5);
	printf("Y[0]=%.6f\t\t", y1[0]);
	
	for (i = 1; i < 21; i++)
	{
		if (i % 3 == 0) printf("\n");
		y1[i] = 1.0 / i - 5 * y1[i - 1];
		printf("Y[%d]=%.6f\t\t",i,y1[i]);
	}
	printf("\n");
	puts("algorithm 2:\n");
	y2[20] = 1.0 / 2 * (1.0 / 105 + 1.0 / 126);
	printf("Y[20]=%.6f\t\t", y2[20]);
	for (i = 19; i >= 0; i--)
	{
		if ((i + 1) % 3 == 0)printf("\n");
		y2[i] = 1.0 / (5.0 * (i + 1)) - y2[i + 1] / 5;
		printf("Y[%d]=%.6f\t\t", i, y2[i]);
	}
	printf("\n");
	getch();
	return 0;
}

七、实验结果

八、分析思考 

    本次实验关键在于积分计算递推式的选择。我们首先推出正向的递推式,从Y0计算到Y20,随后将递推式拟过来,从Y20计算到Y0。在算法一当中,Yn-1的系数为5,容易造成初始舍入误差的累计从而导致结果误差过大,算法不稳定。算法二当中Yn的系数为1/5,误差对最后结果的影响并不显著,算法稳定。

    从计算结果可以看出,算法1在第20次迭代时,计算结果突然跃升,其算法是不稳定的,而算法2是稳定的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ace2NoU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值