数值分析实验报告(包含源程序)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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=");
1
0.5
x dx
ba [ f (a ) f (b)] 2
Romberg 求积的递推化公式:
I
(k ) m ( k 1) ( k 1) 4k I m 1 I m , k 1,2,, n; m 0,1,, n k 4k 1
其中 I m 为定积分近似值, k 决定着 Romberg 求积公式的阶数,例如 k 0 为一 阶 Romberg 求积公式 (即梯形求积公式),一般地, Romberg 求积公式的计算结果; m 决定着等分数, 下的 (k 1) 阶复化 Romberg 求积公式的计算结果。 1、实验 1 实验步骤: 算 法 描 述 及 实 (1)Newton-Cotes 积分程序设计 (2)计算实例 (3)撰写实验报告 2、实验 2 实验步骤
}
} 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;
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
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);
(k ) Im 是 k 1 阶
(k )
(k ) m Im 是在 2 等分情况
验 步 骤
(1)设计数值求积的 Romberg 算法程序 (2)计算实例 (3)撰写实验报告 1、Newton-Cotes 求积分实验结果如图:
调 试 过 程 及 实 验 结 果
2、Romberg 积分实验结果如图:
总 结
}
课程实验报告
课程名称 姓名 实验名称 计算方法 班级 学号 实验二 实验日期 实验成绩 数值积分
实 验 目 的 及 要
1、掌握 Newton-Cotes 算法程序设计 2、掌握数值求积的 Romberg 算法程序设计 3、数值求积的 Newton-Cotes 算法程序设计。 4、 要求程序不断加密对积分区间的等分,自动地控制 Newton-Cotes 算法中 的加速收敛过程,直到定积分近似值的误差不超过 10 6 为止,输出求得 的定积分近似值 5、要求程序不断加密对积分区间的等分,自动地控制 Romberg 算法中的加
附 录
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);
课程实验报告
课程名称 姓名 实验名称 实 验 目 的 及 要 求 实 验 环 境 计算方法 班级 学号 实验一 实验日期 实验成绩 插值多项式
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;
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)) {
3 、 计 算 实 例 以 2.0,2.1,2.2,2.3,2.4 为 节 点 , 用 牛 顿 插 值 求 函 数
f ( x)
x 在 2.51 处的近似值;
取正弦函数 f ( x) sin x 4、如果有错,修改直至运行成功,查看运行结果 1、实验 1 实验步骤: 算 法 描 述 及 实 验 步 骤 (1)程序设计 (2)计算实例 (3)撰写实验报告 2、实验 2 实验步骤 (1)程序设计 ( 2 ) 计 算 实 例 以 2.0,2.1,2.2,2.3,2.4 为 节 点 , 用 牛 顿 插 值 求 函 数
} {
printf("根据拉格朗日插值公式计算后的数为:y=%f\n",y); double Lagrange(double x,int n,double a[],double b[]) double y=0,L; int i,j; fБайду номын сангаасr(i=0;i<n;i++) { L=1; for(j=0;j<n;j++) { if(j==i)continue; else { L=L*(x-a[j])/(a[i]-a[j]); } } y+=L*b[i]; } return y;
求
速收敛过程,直到定积分近似值的误差不超过 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
}
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;