102440数值实验报告

发布 2019-07-13 01:42:17 阅读 9045

一.实验内容:

用两种不同的顺序计算,分析其误差的变化。

二.实验目的:

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

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

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

三.算法描述。

取float类型数据,从两个方向即:1大到小,2小到大的累加。然后输入累加值。

流程图如下:

四.源程序:

#include""

#include""

void main()

float sum=0,i,sum1=0;

for(i=1;i<=10000;i++)

sum+=1.0/(i*i);

printf("得数为:%f",sum);

for(i=10000;i>0;i--)

sum1=sum1+(1.0/(i*i));

printf("得数为:%f",sum1);

五.实验结果:

六.实验体会

这个程序还是比较简单的,仅仅需要一个循环就可以完成,只要细心就不会有错。从这个实验里我也看到了计算机毕竟不是万能的,由于机器字长的问题对于一些特殊的计算会出错——即大数吃小数这样的计算,这样会让人们在日常的生产生活中产生一些意想不到的问题。不过只要稍微对计算方法做一下改动就可以改正这种错误——改变算术的顺序。

至于从哪个方向计算更好,那就要具体问题具体分析了。

一.实验内容:

1、拉格朗日插值。

按下列数据。

作二次插值,并求x=-2,x=0,x=2.75时的函数近似值。

2牛顿插值。

按下列数据。

作五次插值,并求x=0.46,x=0.55,x=0.60时的函数近似值。

二.实验目的:

1. 掌握牛顿插值法。

2. 掌握拉格朗日插值法。

三.算法描述。

开始时判断输入的点是否在区间内,不在则退出。

在则继续根据值选择节点带入公式计算。

程序一: 流程图。

程序二流程图。四源程序:

#include""

void main()

float x[5]=;

float y[5]=,x,q[3],p[3];

int i,k,n;

double y1,y2,y3;

scanf ("f",&x);

if(x>=x[0]&&x<=(0.5))/选择计算的点*/

k=0;}else if(x>(-0.5)&&x<=x[3])

k=1;}else if(x>x[3]&&x<=x[4])

k=2;}else printf("error");

y1=(x-q[1])*x-q[2])/q[0]-q[1])*q[0]-q[2]))每个子式*/

y2=(x-q[0])*x-q[2])/q[1]-q[2])*q[1]-q[0]))

y3=(x-q[0])*x-q[1])/q[2]-q[1])*q[2]-q[0]))

if(k==0||k==1||k==2)/*确定是否输出结果*/实验结果:

#include<>

#include<>

#include<>

typedef struct data

float x;

float y;

data;//变量x和函数值y的结构

data d[20];/最多二十组数据

float f(int s,int t)//牛顿插值法,用以返回插商

if(t==s+1)

return (d[t].y-d[s].y)/(d[t].x-d[s].x);

else return (f(s+1,t)-f(s,t-1))/d[t].x-d[s].x);

float newton(float x,int count)

int n;

while(1)

cout<<"请输入n值(即n次插值):"获得插值次数

cin>>n;

if(n<=count-1)//插值次数不得大于count-1次

break;

else system("cls");

/初始化t,y,yt。

float t=1.0;

float y=d[0].y;

float yt=0.0;

/计算y值

for(int j=1;j<=n;j++)

t=(x-d[j-1].x)*t;

yt=f(0,j)*t;

/cout

return y; }

float lagrange(float x,int count)

float y=0.0;

for(int k=0;k

return y;//返回y的值

void main()

float x,y;

int count;

while(1)

cout<<"请输入x[i],y[i]的组数,不得超过20组:";要求用户输入数据组数

cin>>count;

if(count<=20)

break;//检查输入的是否合法

system("cls");

/获得各组数据

for(int i=0;i

cout<<"请输入x的值:";获得变量x的值

cin>>x;

while(1)

int choice=3;

cout<<"请您选择使用哪种插值法计算:"

lagrange"

cin>>choice;//取得用户的选择项

if(choice==2)

cout<<"你选择了牛顿插值计算方法,其结果为:";

y=newton(x,count);break;//调用相应的处理函数 }

if(choice==1)

cout<<"你选择了拉格朗日插值计算方法,其结果为:";

y=lagrange(x,count);break;//调用相应的处理函数 }

if(choice==0)

break;

system("cls");

cout<<"输入错误!cout<}

实验结果:五 .实验体会。

这个实验的目的主要是掌握如何在计算机上运用拉格朗日插值法和牛顿插值法来解决问题。对于拉格朗日插值,已经给出了五个节点的函数值,可以在一定的范围内使用拉格朗日插值法,所以对于-5到1上的x我利用前三个节点,而对于1到5上x我利用后三个节点,这样算出来值的误差会比较小。在牛顿插值上,题中已经给出了六个节点的函数值,利用这六个节点可以算出五阶差商,然后很容易就能够得出结果。

其中四阶差商为负数,但是差别不大,五阶差商又变回了正数,所以可以用到五阶差商,这样结果也会更准确。

一.实验内容。

分别用复化梯形公式和复化辛卜生公式计算f(x)=sin(x)/x的积分,并与准确值比较判断精度。

二.实验目的。

1掌握复化梯形公式。

2掌握复化辛卜生公式。

三.算法描述。

1.复化梯形公式代数形式求解定积分,为每个区间内的梯形公式的累加,所以除端点外的点都累加两次。

2.复化新普生公式与梯形公式形式上差别不大,但是由于使用的是三个点一个区间所以只可以求解sn4所以流程类似。

四.源程序。

#include<>

#include<>

void main()

double a[9]=;

double c=0;

int i;

for(i=0;i<=8;i++)

if(i==0||i==8)

c=c+a[i];

else c=c+2*a[i];

c=c/16;

printf("复化梯形公式求解,积分区间0到1,步长1/8,")

printf("f(x)=%f",c);

printf("");

c=0;for(i=0;i<=8;i++)

if(i==0||i==8)

c=c+a[i];

else if((i%2)==0)

c=c+2*a[i];

数值分析上机实验报告 插值

数值分析第一次上机练习实验报告。lagrange插值与三次样条插值。一 问题的描述。设,取,试求出10次lagrange插值多项式和三次样条插值函数 采用自然边界条件 并用图画出,二 方法描述 lagrange插值与三次样条插值。我们取,通过在点的函数值来对原函数进行插值,我们记插值函数为,要求它满...

东北大学数值分析实验报告

课题一迭代格式的比较。一 问题提出。设方程f x x 3x 1 0 有三个实根 x 1.8793 x 0.34727 x 1.53209现采用下面三种不同计算格式,求 f x 0的根 x 或x 1 x 2 x 3 x 二 要求。1 编制一个程序进行运算,最后打印出每种迭代格式的敛散情况 2 用事后误...

DSP实验报告

4 心得体会18 5 附录19 语音压缩 存储和回放。一。课程的目的和要求。1.设计要求及目标。基本部分 1 使用dsp实现语音压缩和解压缩的基本算法,算法类型自定,例如可以采用g.711 g.729等语音压缩算法。2 采用a d转换器从mic输入口实时采集语音信号,进行压缩后存储到dsp的片内和片...