3.2龙贝格算法程序包步骤
1.输入积分上限
2输入程序下限
3输入区间等分数
4输入要求的函数
●
●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.算法结果截图