#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));
}
把積分算式算出來,然后用C寫。
比如[a,b]的積分上限和下限,對x積分,就是x^2/2, 代入a,b
對于一重定積分來說其求解可以使用梯形法進行求解,計算公式如下所示:
其中,f(x)為被積函數,為橫坐標的兩點間的間隔,越小,則計算出的結果越精確。
對于求解此類問題可以使用C語言中的回調函數編寫通用的計算函數,代碼如下:
#include?stdio.h
#include?stdlib.h
#includemath.h
//功能:返回f(x)在積分區間[a,b]的值
//參數:FunCallBack?指向用于計算f(x)的函數
//??????a??積分區間的起始值
//??????b??積分區間的結束值
//??????dx?橫坐標的間隔數,越小計算結果越準確
double?Calculate(double?(*FunCallBack)(double?x),
double?a,double?b,double?dx)
{
double?doui;
double?total?=?0;????????//保存最后的計算結果
for?(doui?=?a;?doui?=?b;?doui?+=?dx)
{
total?+=?FunCallBack(doui)*dx;
}
return?total;
}
double?f2(double?x)
{
return?x*x;
}
double?f(double?x)
{
return?x;
}
double?f3(double?x)
{
return?x*x*x?;
}
int?main()
{
double?total;
total?=?(Calculate(f,?2,?3,?0.000001));
printf("total?=?%lf\n",?total);
total?=?(Calculate(f2,?2,?3,?0.000001));
printf("total?=?%lf\n",?total);
total?=?(Calculate(f3,?2,?3,?0.000001));
printf("total?=?%lf\n",?total);
return?0?;
}
其中,函數f,f2,f3為自行編寫的關于x的被積函數。
運行結果:
total?=?2.500000
total?=?6.333331
total?=?16.249991
我給一樓加的注釋以及修改:
#includestdio.h
#includemath.h
#define ARRAYBOUND 10001
void main()
{
int i = 0; //輔助變量,最常見那種
int n = 0; //將所求定積分函數曲線在x軸方向,平均分成n等分;n越大,結果越精確;不過限于此算法限制nARRAYBOUND,否則溢出.
float x[ARRAYBOUND];//ARRAYBOUND維浮點數組,存放離散的x坐標值
float y[ARRAYBOUND];//ARRAYBOUND維浮點數組,存放每個x坐標對應的函數值;x[i],y[i]滿足y[i]=f(x[i]),f是你要求定積分的函數
float x0 = 0.0; //定積分下限
float xn = 0.0; //定積分上限
float h = 0.0; //面積微元寬度
float J = 0.0; //輔助變量
/*f=x^3*/ //這里說明要求定積分的是函數f(x)=x*x*x;(y等于x的立方,x^3是vb的寫法)
// printf("input x0,xn,n:");
printf("請分別輸入下限(x0),上限(xn),精度(n):");
scanf("%f",x0);
scanf("%f",xn);
scanf("%d",n);
h=(xn-x0)/n;//將函數圖形在x方向平分成n份,h是每個面積微元的寬度
x[0]=x0; //將積分下限賦值給x[0]
for(i=0;i=n nARRAYBOUND;i++)
{
x[i]=x[0]+i*h; //計算n個離散的橫坐標值,存入x[]數組
y[i]=(float)pow(x[i],3);//計算n個橫坐標對應的函數值,存入y[]數組。在此可以改變要求積分的函數
}
// J=0.0;
for(i=0;in;i++)
{
//J=J+y[i]+y[i+1];
J+=y[i];//將所有縱坐標值代數相加,存入J
}
//J=J*h/2.0;
J=J*h;//所有微元面積一次求解,因為∑h*y[i]=h*∑y[i];
printf("\nn=%d \n所求定積分值是: %f\n",n,J);
}
我將//J=J+y[i]+y[i+1]改為J+=y[i];將//J=J*h/2.0;改為J=J*h只是幫助lz理解
其實,這兩種表達在理論上是等價的,不過我發現修改后,在n同樣大小的情況下,結果的精度有一點點下降,還真不知為什么???
這樣的話lz應該能理解了吧,其實一樓的算法還有不少值得改進的地方,希望lz能有所突破!!
#includestdio.h
#includemath.h//pow()指數函數頭文件;
#define e 2.71828//定義自然常數e;
int main ()
{
double a,b,n1,n2,n3,n4,n5,t;
scanf("%lf%lf",a,b);
if(ab)//保證上限比下限大;
{
t=a;
a=b;
b=t;
}
n1=a-b+0.5*(a*a-b*b);//a和b是未知數,積分運算后,原式=a和b混合運算的代數式;
n2=a*a-b*b+3*a-3*b;
n3=e*0.5*(a*a-b*b)+a-b;
n4=(pow(a+1,3)-pow(b+1,3))/3;
n5=(pow(a,4)-pow(b,4))/4;
printf("%.2lf %.2lf %.2lf %.2lf %.2lf",n1,n2,n3,n4,n5);
return 0;
}
圖1是運行結果,圖2是原題的積分結果;通過數學的積分結果可以看出,積分符號的不在了;只剩下上下限a,b組成的代數式;