#if 0
在好幾個網(wǎng)友的要求下,先給出一個簡單的逐次分半法梯形求積公式的C語言直接實現(xiàn) 。不過還是提醒一下如果學(xué)習(xí)算法的話,最好還是自己實際進行編碼的好。
#endif
#ifdef CODE1//g++ -DCODE1 thisfile.cpp #include <stdio.h> #include <math.h> // 梯形公式的逐次分半法求積函數(shù) double integral( double a,//積分區(qū)間起始值 double b,//積分區(qū)間終止值 double(*f)(double),//被積函數(shù) double eps//積分允許誤差 ) { double n = 1; double h = (b-a)/2; double Tn = h*(f(a)+f(b)); double T2n = 0; while(true) { double sumf = 0; for(int i=1;i<=n;++i) { sumf += f(a+(2*i-1)*h); } T2n = Tn/2+h*sumf; if(fabs(T2n-Tn)<3*eps)break; Tn = T2n; n *= 2; h /= 2; } return T2n; } // 自定義的被積函數(shù),只要滿足下面的形式的函數(shù)就可以了:) double func(double x) { return sin(x)*cos(x); } int main() { const double PI = 3.1415926535; printf("%s%.8f/n","sin(x)在[0,PI/2]的積分值為:",integral(0,PI/2,sin,1e-8)); printf("%s%.8f/n","func(x)在[0,PI/2]的積分值為:",integral(0,PI/2,func,1e-8)); return 0; } #endif// CODE1 //////////////////////////////////////////////////////////////////////////////// //該程序的運行結(jié)果如下: /******************************************************************************* sin(x)在[0,PI/2]的積分值為:1.00000000 func(x)在[0,PI/2]的積分值為:0.49999999 *******************************************************************************/ //////////////////////////////////////////////////////////////////////////////// #if 0
下面是能夠輸入?yún)?shù)的程序:
#endif #ifdef CODE2//g++ -DCODE2 thisfile.cpp #include <stdio.h> #include <math.h> // 梯形公式的逐次分半法求積函數(shù) double integral( double a,//積分區(qū)間起始值 double b,//積分區(qū)間終止值 double(*f)(double),//被積函數(shù) double eps//積分允許誤差 ) { double n = 1; double h = (b-a)/2; double Tn = h*(f(a)+f(b)); double T2n = 0; while(true) { double sumf = 0; for(int i=1;i<=n;++i) { sumf += f(a+(2*i-1)*h); } T2n = Tn/2+h*sumf; if(fabs(T2n-Tn)<3*eps)break; Tn = T2n; n *= 2; h /= 2; } return T2n; } // 自定義的被積函數(shù),只要滿足下面的形式的函數(shù)就可以了:) double func(double x) { return sqrt(x);//在這里修改你的被積函數(shù) } int main() { const double PI = 3.1415926535; double a,b,eps;//輸入的參數(shù)保存在此 scanf("%lf%lf%lf",&a,&b,&eps);//輸入?yún)?shù) printf("積分下界=%f,積分上界=%f,誤差=%f/n",a,b,eps);//顯示輸入的數(shù)據(jù) printf("%s%f%s%f%s%.8f/n","sqrt(x)在[",a,",",b,"]的積分值為:",integral(a,b,func,eps)); return 0; } #endif// CODE1 //////////////////////////////////////////////////////////////////////////////// //該程序的輸入: /******************************************************************************* E:/>a 0 0.5 1e-6 *******************************************************************************/ //相應(yīng)的輸出為: /******************************************************************************* 積分下界=0.000000,積分上界=0.500000,誤差=0.000001 sqrt(x)在[0.000000,0.500000]的積分值為:0.23570147 *******************************************************************************/ ////////////////////////////////////////////////////////////////////////////////
|