Romberg求积法.docx

上传人:b****5 文档编号:5895111 上传时间:2023-01-02 格式:DOCX 页数:11 大小:109.53KB
下载 相关 举报
Romberg求积法.docx_第1页
第1页 / 共11页
Romberg求积法.docx_第2页
第2页 / 共11页
Romberg求积法.docx_第3页
第3页 / 共11页
Romberg求积法.docx_第4页
第4页 / 共11页
Romberg求积法.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

Romberg求积法.docx

《Romberg求积法.docx》由会员分享,可在线阅读,更多相关《Romberg求积法.docx(11页珍藏版)》请在冰豆网上搜索。

Romberg求积法.docx

Romberg求积法

安徽中医药大学

题目:

Romberg求积法c语言编程

姓名:

杨撞撞

学号:

13713042

班级:

13医软

(1)班

1简介

2计算公式

3算法描述

4程序流程图

5算法程序表示

6算法结果截图

●1.简介

龙贝格求积公式也称为逐次分半加速法。

它是在梯形公式、辛普森公式和柯特斯公式之间的关系的基础上,构造出一种加速计算积分的方法。

作为一种外推算法,它在不增加计算量的前提下提高了误差的精度.

在等距基点的情况下,用计算机计算积分值通常都采用把区间逐次分半的方法进行。

这样,前一次分割得到的函数值在分半以后仍可被利用,且易于编程。

●2.计算公式

梯形公式

复化辛普森公式

复化科特斯公式

龙贝格求积公式

其对应的公式为:

T2n=1/2(Tn+Hn)(梯形公式)

Sn=4/(4-1)T2n-1(4-1)Tn(辛普森公式)

Cn=4^2/(4^2-1)S2n-1/(4^2-1)Sn(柯特斯公式)

Rn=4^3/(4^3-1)C2n-1/(4^3-1)Cn(龙贝格求积法公式)

●3.算法描述

3.1龙贝格算法基本描述

先算出T0(0),从而计算出T0

(1),以此类推,直到计算出

|T0(0)-Tn-1(0)|

3.2龙贝格算法程序包步骤

1.输入积分上限

2输入程序下限

3输入区间等分数

4输入要求的函数

5计算出所求函数的积分,分别是:

◆复化梯形求积结果

◆辛普森求积结果

◆柯特斯求积结果

◆龙贝格求积结果

●4.程序流程图

例题:

用Romberg方法计算积分I=0¹sin(x)/xdx的相关算法流程图表示如下图

5.算法程序表示

#include

#include

#defineA(x)(sin(x)/x)//宏定义若干常用函数A,B,C,D,E,G

#defineB(x)(cos(x*x+2*x+1))

#defineC(x)(atan(sqrt(x*x+1)))

#defineD(x)(sqrt(exp(x)+sin(2*x)))

#defineE(x)(x*x*x+3*x*x+5)

#defineG(x)(log10(x)/pow(2,x))

doublet[20],s[20],c[20],r[20];//定义全局数组

doubledh,fan,a,b,m;//定义全局变量

intjj=0;

charhs;

doubleF(doublex)//用switch调用若干被积函数

{

switch(hs)

{

case'A':

fan=A(x);break;

case'B':

fan=B(x);break;

case'C':

fan=C(x);break;

case'D':

fan=D(x);break;

case'E':

fan=E(x);break;

case'G':

fan=G(x);break;

default:

printf("输入错误!

");

}

return(fan);//返回被积函数值

}

doubleH(inti)//求和函数并返回和SUM

{

intj;

doublezh,SUM=0.0;//定义求和变量SUM并赋初值

for(j=1;j<=pow(2,i-1);j++)

{

zh=(a+((2*j-1)*(b-a))/pow(2,i));

SUM=SUM+F(zh);//调用F(x)函数

}

SUM=(b-a)*SUM/pow(2,i);

return(SUM);

}

doubleTxing(intk)//梯形公式

{

if(k==0)dh=t[jj]=((b-a)/2)*(F(a)+F(b));//分半次数为零时T形公式求积

else

{

dh=0.5*Txing(k-1)+H(k);//Txing函数递归调用循环输出并返回dh

t[++jj]=dh;

}

m=pow(2,jj);

printf("T[%0.0lf]=%0.7lf\t",m,t[jj]);//输出并返回dh

return(dh);

}

doubleSimpson(intk)//辛普森公式

{

inti,j;

Txing(k);//调用梯形公式

for(i=0;i<=k-1;i++)

s[i]=(4.0*t[i+1]-t[i])/3.0;//递推辛普森公式

printf("\n");

for(j=0;j<=k-1;j++)//循环输出

{

m=pow(2,j);

printf("S[%0.0lf]=%0.7lf",m,s[j]);

printf("\t");

}

return(s[k-1]);//返回最后一个值s[k-1]

}

doubleCotes(intk)//科特斯公式

{

inti,j;

Simpson(k);

for(i=0;i<=k-2;i++)

c[i]=(16.0*s[i+1]-s[i])/15.0;//递推科特斯公式

printf("\n");

for(j=0;j<=k-2;j++)//循环输出

{

m=pow(2,j);

printf("C[%0.0lf]=%0.7lf\t",m,c[j]);

}

return(c[k-2]);//返回最后一个值c[k-2]

}

doubleRomberg(intk)//隆贝格公式

{

inti,j;//调用科特斯公式

Cotes(k);

for(i=0;i<=k-3;i++)

r[i]=(64.0*c[i+1]-c[i])/63.0;//递推隆贝格公式

printf("\n");

for(j=0;j<=k-3;j++)//循环输出

{

m=pow(2,j);

printf("R[%0.0lf]=%0.7lf\t",m,r[j]);

printf("\n");

}

return(r[k-3]);//返回最后一个值r[k-3]

}

main()

{

intk;

chary;

printf("请从以下公式中选择积分函数:

\n");

printf("A:

sin(x)/(x)\tB:

cos(x^2+2x+1)\tC:

atan(sqrt(x^2+1))\n\n");

printf("D:

sqrt(e^x+sin(2x))\tE:

x^3+3*x^2+5\tG:

log10(x)/pow(2,x)\n\n");

printf("请选择函数F(x)(大写):

\n");

scanf("%c",&hs);

getchar();

printf("请输入您选用的求积公式第一个字母(大写):

\n");

y=getchar();

switch(y)//根据输入的大写字母判断所选求积公式

{

case'T':

printf("请输入分半次数:

\n");

scanf("%d",&k);

printf("请输入积分区间a,b且(a

\n");

scanf("%lf,%lf",&a,&b);

if(a==0)a=0.0000000001;//输入当积分区间为零时默认为一极小数

printf("--------------------------------------------------------------\n");

printf("\nTxing=%0.7f\n",Txing(k));break;//输出计算结果小数点后保留7位

case'S':

printf("请输入分半次数大于等于1的正整数:

\n");

scanf("%d",&k);

printf("请输入积分区间a,b且(a

\n");

scanf("%lf,%lf",&a,&b);

if(a==0)a=0.0000000001;//输入当积分区间为零时默认为一极小数

printf("---------------------------------------------------------------\n");

printf("Simpson=%0.7f\n",Simpson(k));break;//输出计算结果小数点后保留7位

case'C':

printf("请输入分半次数大于等于2的正整数:

\n");

scanf("%d",&k);

printf("请输入积分区间a,b且(a

\n");

scanf("%lf,%lf",&a,&b);

if(a==0)a=0.0000000001;//输入当积分区间为零时默认为一极小数

printf("---------------------------------------------------------------\n");

printf("Cotes=%0.7f\n",Cotes(k));break;//输出计算结果小数点后保留7位

case'R':

printf("请输入分半次数大于等于3的正整数:

\n");

scanf("%d",&k);

printf("请输入积分区间a,b且(a

\n");

scanf("%lf,%lf",&a,&b);

if(a==0)a=0.0000000001;//输入当积分区间为零时默认为一极小数

printf("---------------------------------------------------------------\n");

printf("Romberg=%0.7f\n",Romberg(k));break;//输出计算结果小数点后保留7位

default:

printf("---------------------------------------------------------------\n");

printf("公式输入有误,请查证!

\n");

}

printf("---------------------------------------------------------------\n");

}

6.算法结果截图

 

 

 

 

 

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1