当前位置:文档之家› 数值分析实验报告(包含源程序)

数值分析实验报告(包含源程序)


f ( x)
x 在 2.51 处的近似值:
总 结
附 录
1、通过本次实验,使我进一步加深了对拉格朗日插值多项式的了解,掌握 拉格朗日插值多项式的用法, 能够正确的运用拉格朗日插值多项式进行 运算。 2、通过本次实验,使我加深了对牛顿插值的认识,能够熟练的运用公式进 行运算,掌握牛顿插值多项式的用法。 1、拉格朗日插值程序清单: #include<stdio.h> #include<conio.h> double Lagrange(double x,int n,double a[],double b[]); void main() { double a[20],b[20],x,y; int i=0,n; printf("请输入数值个数:n="); scanf("%d",&n); printf("请输入%d 个不同的 x 的数值:\n",n); for(i=0;i<n;i++) { scanf("%lf",&a[i]); } printf("请按顺序输入 x 对应的 y 的数值:\n"); for(i=0;i<n;i++) { scanf("%lf",&b[i]); } /* for(i=0;i<n;i++) { printf("%f ",a[i]); }*/ printf("请输入需计算的数:x="); scanf("%lf",&x); y=Lagrange(x,n,a,b);
}
double Chashang(int a1,int b1,double a[],double b[]) { double c; if(b1==a1+1) c=(b[b1]-b[a1])/(a[b1]-a[a1]); else c=(Chashang(a1+1,b1,a,b)-Chashang(a1,b1-1,a,b))/(a[b1]-a[a1]); return c;
}
} return q;
p = 0.0; for (int i=0; i<n; i++) { x = a + (i + 0.5) * h; p = p + f(x); } p = (y[0] + h*p)/2.0; s = 1.0; for (int k=1; k<=m; k++) { s = 4.0*s; q = (s*p - y[k-1])/(s - 1.0); y[k-1] = p; p = q; } p = fabs(q - y[m-1]); m = m + 1; y[m-1] = q; n = n + n; h = h / 2.0;
f ( x)
x 在 2.51 处的近似值;
(3)撰写实验报告 1、拉格朗日插值实验结果如图:
调 试 过 程 及 实 验 结 果
以 0.32,0.34,0.36 为节点,分别用线性插值和抛物插值求正弦函数在 0.3367 处的近似值 2、 牛顿插值实验结果如图: 进行测试: 3、使用牛顿插值计算实例以 2.0,2.1,2.2,2.3,2.4 为节点,用牛顿插值求 函数
} 2、牛顿插值程序清单: #include<stdio.h> #include<stdlib.h> #include<iostream.h> double Newton(double x,int n,double a[],double b[]); double Chashang(int a1,int b1,double a[],double b[]); void main() { double a[20],b[20],x,y; int i=0,n; printf("请输入数值个数:n="); scanf("%d",&n); printf("请输入%d 个不同的 x 的数值:\n",n); for(i=0;i<n;i++) { scanf("%lf",&a[i]); } printf("请按顺序输入 x 对应的 y 的数值:\n"); for(i=0;i<n;i++) { scanf("%lf",&b[i]); } printf("请输入需计算的数:x=");

速收敛过程,直到定积分近似值的误差不超过 10 6 为止,输出求得的定 积分近似值
实 验 环 境 实 验 内 容
Microsoft Visual C++ 6.0
1、计算实例求定积分 x 1.8 f(x) 3.12041 计算
2 .6
2.0 4.42569
2.2 6.04241
2.4 8.03014
课程实验报告
课程名称 姓名 实验名称 实 验 目 的 及 要 求 实 验 环 境 计算方法 班级 学号 实验一 实验日期 实验成绩 插值多项式
1、掌握拉格郎日插值多项式的用法,适用范围及精确度。 2、掌握牛顿插值多项式的用法,适用范围及精确度。
Microsoft Visual C++ 6.0
1、Lagrange 插值多项式: Ln ( x) li ( x) yi ,其中
}
scanf("%lf",&x); y=Newton(x,n,a,b); printf("根据牛顿插值公式计算后的数为:y=%f\n",y);
{
double Newton(double x,int n,double a[],double b[]) int i; double t=1.0,zhi=b[0],p=0.0; for(i=1;i<=n;i++) { t=(x-a[i-1])*t; p=Chashang(0,i,a,b)*t; zhi=zhi+p; } return zhi;
i 0
n
li ( x)
j 0 j i
n
(x x j ) ( xi x j )
实 验 内 容
2、Newton 插值多项式:
N n ( x ) f ( x 0 ) f [ x 0 , x1 ]( x x 0 ) ... f [ x 0 , ... , x n ]( x x 0 )...( x x n 1 )
2.6 10.46675
2、数值求积的 Romberg 算法程序设计。 3、要求程序不断加密对积分区间的等分,自动地控制 Romberg 算法中的加 速收敛过程,直到定积分近似值的误差不超过 10 6 为止,输出求得的定积分 近似值 4、计算实例求定积分 梯形求积公式:
(0) I0
1 .8
f ( x )dx
printf(" 利用 Newton-Cotes 积分公式求得函数 ) 在 (1.8,2.6) 区间的积 分值为:%6.5f\n",I); } double NewtonCotes(double y[],double h) { double C; C=((y[0]+y[4])*7+(y[1]+y[3])*32+y[2]*12)*h/90; return C; } 4、Romberg 积分的程序清单: #include<iostream> #include<cmath> using namespace std; #define f(x) pow(x, 1.0 / 2) double Romberg(double a, double b); void main() { double a = 0.5, b = 1,jieguo; double real = 2.0 / 3 * (1 - pow(1.0 / 2, 3.0 / 2)); printf("该积分的准确值是 : %.17f\n\n", real); jieguo = Romberg(a, b); printf("由 Romberg 公式计算后的积分值是: %.17f\n",jieguo); } double Romberg(double a, double b) { int m, n; double h, x; double s, q; double jd,jingdu; double *y = new double[10]; double p ; h = b - a; y[0] = h*(f(a) + f(b))/2.0; m = 1; n = 1; printf("请输入精度:"); scanf("%lf",&jingdu); jd = jingdu + 1.0; while ((jd >= jingdu) && (m < 10)) {
附 录
1、通过本次实验,使我加深了对 Newton-Cotes 求积分公式的了解,掌握 了 Newton-Cotes 求积分公式的用法,能够使用程序将 Newton-Cotes 求积分公式的算法实现。 2、通过本次实验,使我进一步理解了 Romberg 积分,能够掌握 Romberg 积分的用法。 3、通过本次实验,提高了我的程序调试能力。 3、Newton-Cotes 求积分程序清单: #include<stdio.h> #include<conio.h> double NewtonCotes(double b[],double h); void main() { double y[5],I,a,b; int i; printf("请输入积分区间:"); scanf("%lf",&a); scanf("%lf",&b); printf("请输入对应的函数值:\n"); for(i=0;i<5;i++) { scanf("%lf",&y[i]); } I=NewtonCotes(y,b-a);
相关主题