4.龙贝格求积公式,求解定积分
创新互联主要从事网站设计制作、成都网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务梧州,10余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
C/C++ code
#includestdio.h
#includemath.h
#define f(x) (sin(x)/x)
#define N 20
#define MAX 20
#define a 2
#define b 4
#define e 0.00001
float LBG(float p,float q,int n)
{ int i;
float sum=0,h=(q-p)/n;
for (i=1;in;i++)
sum+=f(p+i*h);
sum+=(f(p)+f(q))/2;
return(h*sum);
}
void main()
{ int i;
int n=N,m=0;
float T[MAX+1][2];
T[0][1]=LBG(a,b,n);
n*=2;
for(m=1;mMAX;m++)
{ for(i=0;im;i++)
T[i][0]=T[i][1];
T[0][1]=LBG(a,b,n);
n*=2;
for(i=1;i=m;i++)
T[i][1]=T[i-1][1]+(T[i-1][1]-T[i-1][0])/(pow(2,2*m)-1);
if((T[m-1][1]T[m][1]+e)(T[m-1][1]T[m][1]-e))
{ printf("Answer=%f\n",T[m][1]); getch();
return ;
}
}
}
6. 牛顿-科特斯求积公式,求定积分
C/C++ code
#includestdio.h
#includemath.h
int NC(a,h,n,r,f)
float (*a)[];
float h;
int n,f;
float *r;
{ int nn,i;
float ds;
if(n1000||n2)
{ if (f)
printf("\n Faild! Check if 1n1000!\n",n);
return(-1);
}
if(n==2)
{ *r=0.5*((*a)[0]+(*a)[1])*(h);
return(0);
}
if (n-4==0)
{ *r=0;
*r=*r+0.375*(h)*((*a)[n-4]+3*(*a)[n-3]+3*(*a)[n-2]+(*a)[n-1]);
return(0);
}
if(n/2-(n-1)/2=0)
nn=n;
else
nn=n-3;
ds=(*a)[0]-(*a)[nn-1];
for(i=2;i=nn;i=i+2)
ds=ds+4*(*a)[i-1]+2*(*a)[i];
*r=ds*(h)/3;
if(nnn)
*r=*r+0.375*(h)*((*a)[n-4]+3*(*a)[n-3]+3*(*a)[n-2]+(*a)[n-1]);
return(0);
}
main()
{
float h,r;
int n,ntf,f;
int i;
float a[16];
printf("Input the x[i](16):\n");
for(i=0;i=15;i++)
scanf("%d",a[i]);
h=0.2;
f=0;
ntf=NC(a,h,n,r,f);
if(ntf==0)
printf("\nR=%f\n",r);
else
printf("\n Wrong!Return code=%d\n",ntf);
getch();
}
看看这个或许有帮助
实际问题描述:
求定积分近似值
程序代码如下:
#include
#include
void main()
{
int i,n=1000;
float a,b,h,t1,t2,s1,s2,x;
printf("请输入积分限a,b:");
scanf("%f,%f",a,b);
h=(b-a)/n;
for(s1=0,s2=0,i=1;i=n;i++)
{
x=a+(i-1)*h;
t1=(float)exp(-x*x/2);t2(float)=exp(-(x+h)*(x+h)/2);
s1=s1+t1*h; /*矩形面积累加*/
s2=s2+(t1+t2)*h/2; /*梯形面积累加*/
}
printf("矩形法算得积分值:%f.\n",s1);
printf("梯形法算得积分值:%f.\n",s2);
}
程序运行结果如下:
矩形法算得积分值:0.855821
梯形法算得积分值:0.855624
由上面的比较可知,梯形法的精度要高于矩形法。
#includestdio.h
#includemath.h
float
f1(float
x)
{
return(1.0+x);
}
float
f2(float
x)
{
return(2.0*x+3.0);
}
float
f3(float
x)
{
return(exp(x)+1);
}
float
f4(float
x)
{
return(pow(1+x,2));
}
float
f5(float
x)
{
return(pow(x,3));
}
float
fsimp(float
a,float
b,float
(*p)(float))
{
float
c,s;
c=(a+b)/2;
s=(b-a)/6*(p(a)+4*p(c)+p(b));
return
s;
}
int
main()
{
float
a,b;
printf("请输入积分下限a的值:");
scanf("%f",a);
printf("请输入积分上限b的值:");
scanf("%f",b);
printf("%f\n",fsimp(a,b,f1));
printf("%f\n",fsimp(a,b,f2));
printf("%f\n",fsimp(a,b,f3));
printf("%f\n",fsimp(a,b,f4));
printf("%f\n",fsimp(a,b,f5));
}
#include
#include
double integral(double(*fun)(double x),double a,double b,int,n){
double s,h,y;
int i;
s=(fun(a)+fun(b))/2;
h=(b-a)/n; /*积分步长*/
for(i=1;in;i++)
s=s+fun(a+i*h);
y=s*h;
return y;/*返回积分值*/
}
double f(double x){
return(x*sinx) /*修改此处可以改变被积函数*/
}
int main(){
double y;
y=integral(f,1.0,2.0,150);/*修改此处可以改变积分上下限和步数,步长=(上限-下限)/步数*/
printf("y=%f\n",y);
return 0;
}
int main()