#include?stdio.h
創(chuàng)新互聯(lián)公司于2013年開始,先為三門峽等服務建站,三門峽等地企業(yè),進行企業(yè)商務咨詢服務。為三門峽企業(yè)網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。
#define?RES?(1e-6)
double?integ(double?a,double?b,double?f(double))
{
double?sum;
for(sum=0;ab;a+=RES)
{
sum+=f(a)*RES;
}
return?sum;
}
double?f(double?x)
{
return?x*x;
}
int?main()
{
printf("%lf\n",integ(0,0.1,f));
return?0;
}
實際問題描述:
求定積分近似值
程序代碼如下:
#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
由上面的比較可知,梯形法的精度要高于矩形法。
積分分為兩種,數值積分,公式積分。
公式積分:部分函數可以直接用公式求得其不定積分函數。C語言中可以直接用積分公式寫出其積分函數。
數值積分:按照積分的定義,設置積分范圍的步長,用梯形面積累加求得其積分。
以【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)??/*修改此處可以改變被積函數*/
}
int?main(){
double?y;
y=integral(f,1.0,2.0,150);/*修改此處可以改變積分上下限和步數,步長=(上限-下限)/步數*/
printf("y=%f\n",y);
return?0;
}
問題就是出在數據類型上的選用上,precision=0.0000001時已經超過了float的數據范圍,所以導致數據截斷后precision=0.000000,從而程序在計算積分時可能陷入死循環(huán),應該采用double型數據類型。其實不推薦樓主用如此多的define語句,程序的可讀性和風格應該重于編程員的勞動度。。。
還有樓主對自然對數e的define也已經超過了計算機的可識別范圍。。您那樣精確的定義e并不會在結果上獲得更加精確地結果,其實反倒會起到相反的作用,要知道與其用一個這樣可能導致內存出錯以及必定會導致數據截斷的變量來實現(xiàn)精度的提高遠遠不如采用一個更精確的積分算法,而且c語言提供了自然數e為底的指數函數~而且貌似您的積分算法是不準確的,梯形積分的定義并非如此,其再兩端的函數值應該只取1/2.希望您多加細心~
如果不介意的話,就是你的precision應該改為step~這樣會能更加準備的表達了這個變量的作用,在你的程序中precision變量其實是積分步長~在數值計算方法中積分精度的控制往往不是通過細化步長來表達,而是通過后一個積分值-前一個積分值precision 這樣來實現(xiàn)精度控制~呵呵
對于一重定積分來說其求解可以使用梯形法進行求解,計算公式如下所示:
其中,f(x)為被積函數,為橫坐標的兩點間的間隔,越小,則計算出的結果越精確。
對于求解此類問題可以使用C語言中的回調函數編寫通用的計算函數,代碼如下:
#include?stdio.h
#include?stdlib.h
#includemath.h
//功能:返回f(x)在積分區(qū)間[a,b]的值
//參數:FunCallBack?指向用于計算f(x)的函數
//??????a??積分區(qū)間的起始值
//??????b??積分區(qū)間的結束值
//??????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
用小小梯形法。
即i從-PI/2開始,一直以一個較小的量加上去,加到PI /2為止,對于每一個量應用上的積分元算出結果,加起來就行了。
文章名稱:c語言定積分庫函數 c語言編程計算定積分
網站網址:http://jinyejixie.com/article4/dodppie.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站設計、網站設計公司、動態(tài)網站、定制開發(fā)、網站改版、ChatGPT
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)