這是辛普森積分法。
創(chuàng)新互聯(lián)建站長(zhǎng)期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為閩清企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),閩清網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
給你寫了fun_1( ),fun_2(),請(qǐng)自己添加另外幾個(gè)被積函數(shù)。
調(diào)用方法 t=fsimp(a,b,eps,fun_i);
a,b --上下限,eps -- 迭代精度要求。
#includestdio.h
#includestdlib.h
#include math.h
double fun_1(double x)
{
return 1.0 + x ;
}
double fun_2(double x)
{
return 2.0 * x + 3.0 ;
}
double fsimp(double a,double b,double eps, double (*P)(double))
{
int n,k;
double h,t1,t2,s1,s2,ep,p,x;
n=1; h=b-a;
t1=h*(P(a)+P(b))/2.0;
s1=t1;
ep=eps+1.0;
while (ep=eps)
{
p=0.0;
for (k=0;k=n-1;k++)
{
x=a+(k+0.5)*h;
p=p+P(x);
}
t2=(t1+h*p)/2.0;
s2=(4.0*t2-t1)/3.0;
ep=fabs(s2-s1);
t1=t2; s1=s2; n=n+n; h=h/2.0;
}
return(s2);
}
void main()
{
double a,b,eps,t;
a=0.0; b=3.141592653589793238; eps=0.0000001;
// a definite integral by Simpson Method.
t=fsimp(a,b,eps,fun_1);
printf("%g\n",t);
t=fsimp(a,b,eps,fun_2);
printf("%g\n",t);
// ...
printf("\n Press any key to quit...");
getch();
}
#includestdio.h
#includemath.h
float f1(float a)
{
float z;
z=a+1;
return(z);
}
float f2(float a)
{
float z;
z=2*a+3;
return(z);
}
void integral(float a,float b,float (*fun)(float ))
{
float i,trace,hight1,hight2,area,sum=0;
trace=(b-a)/1000;
for ( i=a;ib;i+=trace )
{
hight1=(*fun)(a);
a+=trace;
hight2=(*fun)(a);
area=(((hight1+hight2)*trace)/2);
sum+=area;
}
printf("sum=%f\n",sum);
}
void main()
{
float a,b,sum1;
printf("*************************\n");
printf("請(qǐng)輸入該定積分的上下區(qū)間a和b:\n");
scanf("%f %f",a,b);
integral(a,b,f1(a));
integral(a,b,f2(a));
}
積分分為兩種,數(shù)值積分,公式積分。
公式積分:部分函數(shù)可以直接用公式求得其不定積分函數(shù)。C語言中可以直接用積分公式寫出其積分函數(shù)。
數(shù)值積分:按照積分的定義,設(shè)置積分范圍的步長(zhǎng),用梯形面積累加求得其積分。
以【f(x)=x*sin(x) 從1到2的積分】為例:
#include?math.h
#include?stdio.h
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;?/*積分步長(zhǎng)*/
for(i=1;in;i++)
s=s+fun(a+i*h);
y=s*h;
return?y;/*返回積分值*/
}
double?f(double?x){
return(x*sinx)??/*修改此處可以改變被積函數(shù)*/
}
int?main(){
double?y;
y=integral(f,1.0,2.0,150);/*修改此處可以改變積分上下限和步數(shù),步長(zhǎng)=(上限-下限)/步數(shù)*/
printf("y=%f\n",y);
return?0;
}