计算方法实验报告
- 格式:doc
- 大小:1.06 MB
- 文档页数:19
数值分析与算法
实
验
报
告
学 院:计算机科学与软件学院
指导老师:
班 级:
姓 名:
学 号:
实验一 舍入误差与数值稳定性
一、试验目的与要求:
1、 通过上机编程,复习巩固以前所学程序设计语言;
2、 通过上机计算,了解舍入误差所引起的数值不稳定性。
3、 通过上机计算,了解运算次序对计算结果的影响,从而尽量避免大数吃小数的现象。
二、实验内容:
通过正反两个实例的计算,了解利用计算机进行数值计算中舍入误差所引起的数值不稳定性,深入理解初始小的舍入误差可能造成误差积累从而对计算结果的巨大影响。
通过实际编程,了解运算次序对计算结果的影响,了解实数运算符合的结合律和分配律在计算机里不一定成立。
对 n = 0,1,2,…,20 计算定积分yn = dx5x10nx
三、算法描述
算法 1 利用递推公式
yn = n1 - 5y1n n = 1,2,…,20
取 dx5x1100y ln6- ln5 0.182 322
算法 2 利用递推公式
515n1y1nyn n = 20,19,…,1
注意到 1051dx51dx5xdx611261102010201020xxx
取
730 008.0)12611051(201y20
四、源程序及输出结果
算法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.88811 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计算
ll(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); getch();
}
2、牛顿插值多项式算法
输入n,x,y (i=0,1,2,n);
对k=1,2,3,n, i=1,2, ,k计算各阶差商f(x,x ,x);
计算函数值
N(x)=f(x)+f[x, x](x- x)++f[x, x,,x](x- x)(x- x)(x-x)
程序与结果
#include
#include
#include
#define N 4
void Difference(float *x,float *y,int n)
{
float *f;
int k,i;
f=(float*)malloc(n*sizeof(float));
for (k=1;k<=n;k++)
{ f[0]=y[k];
for (i=0;i f[i+1]=(f[i]-y[i])/(x[k]-x[i]); y[k]=f[k]; } return; } main() { int i; float varx=0.596,b; float x[N+1]={0.4,0.55,0.65,0.8,0.9}; float y[N+1]={0.41075,0.57815,0.69675,0.88811,1.02652}; Difference(x,(float*)y,N); clrscr(); b=y[N]; for (i=N-1;i>=0;i--) b=b*(varx-x[i])+y[i]; printf("NInterp(%f)=%f",varx,b); getch(); } 四、对算法的理解与分析 高次插值通常优于低次插值 Lagrange插值虽易计算,但若要增加一个节点时,全部基函数都要重新计算。Lagrange是用基函数表达的,便于研究方法的收敛性和稳定性等理论研究和应用,但不便于计算。 Netwon插值每增加一个插值点就增加一项,前面计算都有效,因此较适于计算。 实验三 数值积分 一、目的与要求: 通过实际计算体会各种方法的精确度; 会编写用复化辛卜生求定积分的程序。 二、 实验内容: 通过实际计算体会各种方法的精确度并且会编写用复化辛卜生求定积分的程序 用复化辛卜生法计算积分 算法 复化辛卜生公式为Sn=h/6,计算过程为 1.令 2.对 计算 3. 。 三、源程序与结果 #include #define N 16 float func(float x) { float y; y=1/(1+x*x);