a區(qū)間起點,b積分區(qū)間中點, n是這個區(qū)間劃分?jǐn)?shù)。每一個劃分的長度為h=(b-a)/n。每一個劃分利用梯形算法來求積分,即:上底+下底乘以高再除以2。第一個小梯形面積為 (f(a) + f(a+h))*h/2,第二個為 (f(a+h)+f(a+2h))*h/2,依次類推。將這些加和加起來有:
創(chuàng)新互聯(lián)是由多位在大型網(wǎng)絡(luò)公司、廣告設(shè)計公司的優(yōu)秀設(shè)計人員和策劃人員組成的一個具有豐富經(jīng)驗的團隊,其中包括網(wǎng)站策劃、網(wǎng)頁美工、網(wǎng)站程序員、網(wǎng)頁設(shè)計師、平面廣告設(shè)計師、網(wǎng)絡(luò)營銷人員及形象策劃。承接:成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)、網(wǎng)站改版、網(wǎng)頁設(shè)計制作、網(wǎng)站建設(shè)與維護、網(wǎng)絡(luò)推廣、數(shù)據(jù)庫開發(fā),以高性價比制作企業(yè)網(wǎng)站、行業(yè)門戶平臺等全方位的服務(wù)。
h*(f(a)/2 + f(a+h) + ... +f(a+(n-1)h) + f(b))/2)。預(yù)先將f(a)/2 和f(b)/2加起來,其它數(shù)據(jù)即f(a+h) + ... f(a+(n-1)n)用循環(huán)處理,然后將所有結(jié)果乘以h即可。
//梯形法求定積分
#includestdio.h
#includemath.h
//定義被積函數(shù)
double func(double x){
return sin(x)*cos(x);
}
void main(){
double a,b,h,x,sum;
int i,n;
printf("Input a b and n: ");
scanf("%lf%lf%d",a,b,n);
h=(b-a)/n;
x=a;
sum=(func(a)+func(b))/2;
for(i=1; in; i++){
x += h;
sum += func(x);
}
sum *= h;
printf("sum=%.4lf\n",sum);
}
這個其實很簡單,給你做了一個很簡單的通用的積分函數(shù),
已經(jīng)做過優(yōu)化,自己一調(diào)用就可以了,效率很高。
#include stdio.h
double f(double x) //返回函數(shù)的值
{ double y;
y=x*x+x*2+1.0;
return y;
}
double Integrate(double (*f)(double),double a,double b,int n) //計算函數(shù)的定積分
{ double dx,y,sy,x;
if(n=1)return 0.0;
dx=(b-a)/n;
x=a;
sy=0.0;
for(int i=0;i=n;i++,x+=dx)
sy+=f(x);
sy-=f(a)/2.0;
sy-=f(b)/2.0;
return sy*dx;
}
void main()
{ double s;
s=Integrate(f, 1, 3, 100000);
printf("s=%lf\n",s);
}
#includestdio.h
float f(float x)
{
return x*x+2*x+1;
}
void main()
{
float a,b,len,F=0;//
int n,i;
printf("Please input a,b: ");
scanf("%f%f",a,b);
printf("Please input n: ");
scanf("%d",n);
len=(a+b)/n;//區(qū)間長度
for(i=0;in;i++)
{
F+=len*f(a);
a+=len;
}
printf("%f\n",F);
}
結(jié)果例如:
Please input a,b: 0 10.0
Please input n: 100
437.349792
積分分為兩種,數(shù)值積分,公式積分。
公式積分:部分函數(shù)可以直接用公式求得其不定積分函數(shù)。C語言中可以直接用積分公式寫出其積分函數(shù)。
數(shù)值積分:按照積分的定義,設(shè)置積分范圍的步長,用梯形面積累加求得其積分。
以【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;?/*積分步長*/
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ù),步長=(上限-下限)/步數(shù)*/
printf("y=%f\n",y);
return?0;
}
#include
float f(float x)
{
return x*x+2*x+1;
}
void main()
{
float a,b,len,F=0;//
int n,i;
printf("Please input a,b: ");
scanf("%f%f",a,b);
printf("Please input n: ");
scanf("%d",n);
len=(a+b)/n;//區(qū)間度
for(i=0;in;i++)
{
F+=len*f(a);
a+=len;
}
printf("%f\n",F);
}
結(jié)例:
Please input a,b: 0 10.0
Please input n: 100
437.349792