龙贝格算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
龙贝格算法
一、问题分析
1、1龙贝格积分题目
要求学生运用龙贝格算法解决实际问题(塑料雨篷曲线满足函数y(x)=l sin (tx),则给定雨篷得长度后,求所需要平板材料得长度).
二、方法原理
2、1龙贝格积分原理
龙贝格算法就是由递推算法得来得。由梯形公式得出辛普生公式得出柯特斯公式最后得到龙贝格公式.
在变步长得过程中探讨梯形法得计算规律.设将求积区间[a,b]分为n个等分,则一共有n+1个等分点,n.这里用表示复化梯形法求得得积分值,其下标n 表示等分数。
先考察下一个字段[],其中点,在该子段上二分前后两个积分值
显然有下列关系
将这一关系式关于k从0到n-1累加求与,即可导出下列递推公式
需要强调指出得就是,上式中得代表二分前得步长,而
梯形法得算法简单,但精度低,收敛速度缓慢,如何提高收敛速度以节省计算量,自然式人们极为关心得.
根据梯形法得误差公式,积分值得截断误差大致与成正比,因此步长减半后误差将减至四分之一,既有
将上式移项整理,知
由此可见,只要二分前后两个积分值与相当接近,就可以保证计算保证结果计算结果得误差很小,这种直接用计算结果来估计误差得方法称作误差得事后估计法。
ﻩ按上式,积分值得误差大致等于,如果用这个误差值作为得一种补偿,可以期望,所得得
应当就是更好得结果。
ﻩ按上式,组合得到得近似值直接验证,用梯形二分前后得两个积分值与按式组合,结果得到辛普生法得积分值。
再考察辛普生法。其截断误差与成正比.因此,若将步长折半,则误差相应得减至十六分之一。既有
由此得
不难验证,上式右端得值其实就等于,就就是说,用辛普生法二分前后得两个积分值与,在按上式再做线性组合,结果得到柯特斯法得积分值,既有
重复同样得手续,依据斯科特法得误差公式可进一步导出龙贝格公式
应当注意龙贝格公式已经不属于牛顿—柯特斯公式得范畴.
在步长二分得过程中运用公式加工三次,就能将粗糙得积分值逐步加工成精度较高得龙贝格,或者说,将收敛缓慢得梯形值序列加工成熟练迅速得龙贝格值序列,这种加速方法称龙贝格算法。
三、算法设计
3、1龙贝格积分算法
就就是求出,再走一遍求出,根据求出,再走一遍求出,根据求出,根据求出,再走一遍程序求出,根据得出,根据得出,再根据得出,再走一边程序,得出,根据得出,根据得出,再由得出。再根据相减得绝对值小于其精度。那其中为求出得值.
四、案例分析
4、1龙贝格积分分析
a—积分下限
b—积分上限
n-区间个数
e-积分值要求达到得精度
s—用以存放除积分区间两端点以外得其她各节点函数值得累加与
p-积分区间两端点函数值之与
h-步长值
T1 、T2分别存放二分区间前后梯形积分值
S1 、S2分别存放二分区间前后辛普生积分值
C1 、C2分别存放二分区间前后斯科特积分值
R1、R2分别存放二分区间前后龙贝格积分值
五、总结
5、1龙贝格积分总结
通过本次试验,了解了龙贝格算法得计算过程,了解了龙贝格公式得计算收敛过程,用变步长得方法,逐步减小步长,反复积分,逐步得到所求积分值满足精度要求。一步步从梯形法得递推到辛普森到柯特斯法,最后到龙贝格,让精度逐步升高。
附录
龙贝格积分:
#include "stdio、h"
#include ”math、h”
floatl;
float t;
int main(void){
float f(float);
ﻩfloat a,b,e,h,T1=0,T2=0,S1=0,S2=0,C1=0,C2=0,R1=0,R2=0,k,s,x; ﻩinti=0;
printf("\n****************************************\n");
printf(”****************龙贝格算法**************\n”);
ﻩprintf(”****************************************\n\n");
printf(”请输入积分得下限:");
scanf(”%f",&a);
printf(”\n请输入积分得上限:”);
ﻩscanf("%f",&b);
printf("\n请输入允许误差:");
scanf(”%f”,&e);
printf(”请输入L:”);
ﻩscanf("%f",&l);
ﻩprintf(”请输入T:");
ﻩscanf("%f",&t);
k=1;
ﻩh=b—a;
T1=h*(f(a)+f(b))/2;
ﻩprintf("--—---———-------------\n”);
ﻩprintf("k T2 S2C2 R2\n");
printf("%d %10。7f %10.7f %10.7f %10。7f\n”,i,T1,S1,C1,R1); do
{
s=0;
ﻩx=a+h/2;
while(x〈b)
{
s+=f(x);
ﻩx+=h;
}
T2=T1/2+s*h/2;
S2=T2+(T2-T1)/3;
if (k==1) {
ﻩk=k+1;
h=h/2;
ﻩT1=T2;
S1=S2;
}
else if (k==2)
{
ﻩC2=S2+(S2—S1)/15;C1=C2;
ﻩk=k+1;
h=h/2;
T1=T2;
S1=S2;
}
else if (k==3)
{
R2=C2+(C2-C1)/63;C2=S2+(S2-S1)/15;C1=C2;k=k+1;h=h/2;T1=T2;S1=S2;
}
else
{
C2=S2+(S2—S1)/15;
ﻩR2=C2+(C2—C1)/63;
if (fabs(R2-R1)<e)
{
printf("%d %10.7f %10。7f%10.7f %10。7f\n",i+1,T2,S2,C2,R2);
break;
}
else
{
R1=R2; C1=C2; k=k+1; h=h/2; T1=T2; S1=S2;
}
}
i++;
printf("%d %10。7f %10.7f %10。7f %10.7f\n”,i,T2,S2,C2,R2);}while (1);
getchar();
return 0;
}
float f(float x)
{