問題就是出在數(shù)據(jù)類型上的選用上,precision=0.0000001時已經(jīng)超過了float的數(shù)據(jù)范圍,所以導(dǎo)致數(shù)據(jù)截斷后precision=0.000000,從而程序在計算積分時可能陷入死循環(huán),應(yīng)該采用double型數(shù)據(jù)類型。其實(shí)不推薦樓主用如此多的define語句,程序的可讀性和風(fēng)格應(yīng)該重于編程員的勞動度。。。

我們提供的服務(wù)有:成都網(wǎng)站制作、網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、復(fù)興ssl等。為成百上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的復(fù)興網(wǎng)站制作公司
還有樓主對自然對數(shù)e的define也已經(jīng)超過了計算機(jī)的可識別范圍。。您那樣精確的定義e并不會在結(jié)果上獲得更加精確地結(jié)果,其實(shí)反倒會起到相反的作用,要知道與其用一個這樣可能導(dǎo)致內(nèi)存出錯以及必定會導(dǎo)致數(shù)據(jù)截斷的變量來實(shí)現(xiàn)精度的提高遠(yuǎn)遠(yuǎn)不如采用一個更精確的積分算法,而且c語言提供了自然數(shù)e為底的指數(shù)函數(shù)~而且貌似您的積分算法是不準(zhǔn)確的,梯形積分的定義并非如此,其再兩端的函數(shù)值應(yīng)該只取1/2.希望您多加細(xì)心~
如果不介意的話,就是你的precision應(yīng)該改為step~這樣會能更加準(zhǔn)備的表達(dá)了這個變量的作用,在你的程序中precision變量其實(shí)是積分步長~在數(shù)值計算方法中積分精度的控制往往不是通過細(xì)化步長來表達(dá),而是通過后一個積分值-前一個積分值precision 這樣來實(shí)現(xiàn)精度控制~呵呵
對于一重定積分來說其求解可以使用梯形法進(jìn)行求解,計算公式如下所示:
其中,f(x)為被積函數(shù),為橫坐標(biāo)的兩點(diǎn)間的間隔,越小,則計算出的結(jié)果越精確。
對于求解此類問題可以使用C語言中的回調(diào)函數(shù)編寫通用的計算函數(shù),代碼如下:
#include?stdio.h
#include?stdlib.h
#includemath.h
//功能:返回f(x)在積分區(qū)間[a,b]的值
//參數(shù):FunCallBack?指向用于計算f(x)的函數(shù)
//??????a??積分區(qū)間的起始值
//??????b??積分區(qū)間的結(jié)束值
//??????dx?橫坐標(biāo)的間隔數(shù),越小計算結(jié)果越準(zhǔn)確
double?Calculate(double?(*FunCallBack)(double?x),
double?a,double?b,double?dx)
{
double?doui;
double?total?=?0;????????//保存最后的計算結(jié)果
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?;
}
其中,函數(shù)f,f2,f3為自行編寫的關(guān)于x的被積函數(shù)。
運(yùn)行結(jié)果:
total?=?2.500000
total?=?6.333331
total?=?16.249991
積分分為兩種,數(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;
}
分享文章:c語言定積分函數(shù)庫,求定積分的c語言程序
當(dāng)前路徑:http://chinadenli.net/article5/dsioioi.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、虛擬主機(jī)、網(wǎng)頁設(shè)計公司、網(wǎng)站制作、響應(yīng)式網(wǎng)站、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)