计算方法实验报告
- 格式:doc
- 大小:1.06 MB
- 文档页数:19
数值分析与算法
实
验
报
告
学院:计算机科学与软件学院
指导老师:
班级:
姓名:
学号:
实验一 舍入误差与数值稳定性
一、试验目的与要求:
1、 通过上机编程,复习巩固以前所学程序设计语言;
2、 通过上机计算,了解舍入误差所引起的数值不稳定性。
3、
通过上机计算,了解运算次序对计算结果的影响,从而尽量避免大数吃
小数的现象。
二、实验内容:
● 通过正反两个实例的计算,了解利用计算机进行数值计算中舍入误差
所引起的数值不稳定性,深入理解初始小的舍入误差可能造成误差积累从而对计算结果的巨大影响。
● 通过实际编程,了解运算次序对计算结果的影响,了解实数运算符合的结合律和分配律在计算机里不一定成立。
对 n = 0,1,2,…,20 计算定积分y n =
dx
5x 1
n
x
⎰+
三、算法描述
算法 1 利用递推公式
y
n
=
n
1 - 5
y
1
n - n = 1,2,…,20
取
=+=
⎰dx
5x 1
1
y
ln6- ln5
≈ 0.182 322
算法 2 利用递推公式 5
15n
1y
1
n -
=
-y
n
n = 20,19,…,1
注意到
105
1dx 5
1dx 5
x dx 6
1126
11
20
1
20
10
20
x
x
x
=
≤
+≤
=
⎰⎰⎰
取
730 008.0)1261
1051(
201y
20
≈+
≈
四、源程序及输出结果 算法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();/*保持用户屏幕*/ }
算法2的程序和输出结果如下:
/*稳定算法*/
#include
#include
#include
main()
{
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();
}
五、对算法的理解与分析
从计算结果可以看出,算法1是不稳定的,而算法2是稳定的。
实验二 拉格朗日插值法
一、目的与要求:
熟悉拉格朗日插值多项式和牛顿插值多项式,注意其不同特点。
二、实验内容:
通过拉格朗日插值和牛顿插值多项式的两个实例的计算,了解两种求解方法,
分析他们的优缺点。 1、已知函数表
x 0.56160 0.56280 0.56401 0.56521 y
0.82741
0.82659 0.82577
0.82495
用三次拉格朗日多项式求x=0.5635的函数近似值。
2、已知函数表
x
0.4
0.55 0.65 0.8
0.9
y
0.41075
0.57815 0.8881
1
1.02652 1.02652
用牛顿插值多项式求N (0.596)和N (0.895)。
三、算法
拉格朗日算法
输入x ,y (i=0,1,2,,n),令L(x )=0;
2、对=0,1,2,,n 计算
l l (x)=
L L+l(x)y
程序与结果
#include
#include
#include
float Lagrange(float *x,float *y,float xx,int n)
{
int i,j;
float *a,yy=0.0;
a=(float *) malloc(n*sizeof(float));
for (i=0;i<=n-1;i++)
{
a[i]=y[i];
for (j=0;j<=n-1;j++)
if (j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]);
yy+=a[i];
}
free(a);
return yy;
}
void main()
{
float x[4]={0.56160,0.56280,0.56401,0.56521};
float y[4]={0.82741,0.82659,0.82577,0.82495};
float xx=0.5635,yy;
float Lagrange(float *,float *,float,int);
yy=Lagrange(x,y,xx,4);
clrscr();
printf("x=%f, y=%f\n",xx,yy);