- 相关推荐
Romberg龙贝格算法实验报告
课 程 实 验 报 告
课程名称:
专业班级: CS1306班 学 号: U201314967 姓 名: 段沛云 指导教师: 报告日期:
计算机科学与技术学院
目录
1 实验目的 ........................................................ 1
2 实验原理 ........................................................ 1
3 算法设计与流程框图 .............................................. 2
4 源程序 .......................................................... 4
5 程序运行 ........................................................ 7
6 结果分析 ........................................................ 7
7 实验体会 ........................................................ 7
1 实验目的
掌握Romberg公式的用法,适用范围及精度,熟悉Romberg算法的流程,并能够设计算法计算积分
31
得到结果并输出。 1x
2 实验原理
2.1 取k=0,h=b-a,求T0=
数)。 2.2 求梯形值T0(
b-a
),即按递推公式(4.1)计算T0。 k
2
h
[f(a)+f(b)],令1→k,(k记区间[a,b]的二分次2
2.3 求加速值,按公式(4.12)逐个求出T表的第k行其余各元素Tj(k-j)
(j=1,2,….k)。
2.4 若|Tk+1-Tk|
n-1
11T2n=[Tn+hn∑f(xi+)]
22i=0
1
Sn=T2n+(T2n-Tn)
31
Cn=S2n+(S2n-Sn)
151
Rn=C2n+(C2n-Cn)
63
3 算法设计与流程框图
算法设计:(先假定所求积分二分最大次数次数为20) 3.1 先求T[k][0] 3.2 再由公式T
(k)m
4m(k+1)1)=mTm-1-mTm(k-1(k=1,2,) 求T[i][j] 4-14-1
3.3 在求出的同时比较T[k][k]与T[k-1][k-1]的大小,如果二者之差的绝对
值小于1e-5,就停止求T[k][k];此时的k就是所求的二分次数,而此时的T[k][k]就是最终的结果 3.4 打印出所有的T[i][j]; 程序流程图
4 源程序
#include #include #include #include int main(void) {
float f(float(x)) {
float y; y=1/x; return y; }
float a,b,e,h,s,k,x,T1=0,T2=0,S1=0,S2=0,C1=0,C2=0,R1=0,R2=0; int i=0;
printf("请输入积分下限 : "); scanf("%f",&a);
printf("\n请输入积分上限 :"); scanf("%f",&b);
printf("\n请输入允许误差 :"); scanf("%f",&e); k大学网=1; h=b-a;
T1=h*(f(a)+f(b))/2;
printf("____________________________________________\n"); printf("计算结果如下 : \n");
printf("\nk T2 S2 C2 R2\n"); printf("%d %10.7f %10.7f %10.7f %10.7f\n",i,T1,S1,C1,R1); do {
x=a+h/2; s=0; while(x
{ s=s+f(x); x=x+h; }
T2=(T1+s*h)/2; S2=T2+(T2-T1)/3; if(k==1) {
T1=T2; S1=S2; h=h/2; k=k+1; }
else if(k==2) {
C2=S2+(S2-S1)/15; C1=C2; T1=T2; S1=S2; h=h/2; k=k+1; }
else if(k==3) {
R2=C2+(C2-C1)/63; C2=S2+(S2-S1)/15; C1=C2; T1=T2; S1=S2; h=h/2; k=k+1; } else {
C2=S2+(S2-S1)/15;
R2=C2+(C2-C1)/63; if(fabs(R2-R1)
printf("%d %10.7f %10.7f %10.7f %10.7f\n",i+1,T2,S2,C2,R2);
break;
} else { R1=R2; C1=C2; T1=T2; S1=S2; h=h/2; k=k+1; } } i++;
printf("%d %10.7f %10.7f %10.7f %10.7f\n",i,T2,S2,C2,R2); } while(1); system("pause"); return 0; }
5 程序运行
6 结果分析
如上所示的结果与课本中求得的结果完全一样,表明程序编写正确,且符合要求,事实上,只要再将所求值的精度设置得更小,则所求的结果将更加准确,最终将无限接近于标准值,由上表也可以看出用龙贝格积分法求函数的积分值在精度比较低的情况下就能求到很准确的值!
7 实验体会
本次实验较为简单,主要时间是耗费在循环判断上面,因为书上已经给了流程图,都是基本的C语言,难度不大。过程中唯一遇到的一点障碍就是在写循环判断时由于多重判断多重循环导致混乱,幸好最后改
正了,最后得到的结果经检验与给定的结果相同。通过这次实验上机,
使我更进一步了解了龙贝格法的计算思想,其在精度上很有保证,收敛较快,是解积分问题的有效方法。
【Romberg龙贝格算法实验报告】相关文章:
绿色良知-卢岑贝格和他的《自然不可改良》05-01
基于贝叶斯粗糙集模型的属性约简算法04-29
关于Romberg求积公式注记04-28
基于贝叶斯优化的无人机路径规划算法04-30
转:一个gg的罗兰贝格暑期实习总结04-27
基于LMS格型算法的自适应参数谱估计方法04-29
可压流的龙格-库塔时间步进求解法及其应用04-27
心算法04-30
数学算法04-28