计算方法实验报告

  • 格式:doc
  • 大小:1.06 MB
  • 文档页数:19

下载文档原格式

  / 19
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数值分析与算法

学院:计算机科学与软件学院

指导老师:

班级:

姓名:

学号:

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

一、试验目的与要求:

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 #include #include main() {

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);