最近在复习考研数学,复习到积分这一块的时候手痒了,就手撸了计算定积分的算法程序
//============================================================================
// Name : Integration.cpp
// Author : xycode
// Version :
// Copyright : Your copyright notice
// Description : caculate integration
//============================================================================
#include <iostream>
#include <iomanip>
#include <math.h>
#define EPS 1e-7
using namespace std;
bool isEqual(double a,double b){
if(fabs(a-b)<EPS){
return true;
}
return false;
}
double function(double x){
return x*x;
}
double function_2D(double x,double y){
return x*y;
}
//计算一元函数的定积分
/**
* a:积分下限
* b:积分上限
* 为了简便起见,保证b>a
* f:积分函数
* precision:精度等级,默认为100
*/
double caculate_integration(double a,double b,double(*f)(double x),int precision=100){
double len=b-a;
double interval=1.0/precision;
unsigned long N=(unsigned long)len/interval;
double result=0;
for(unsigned long i=0;i<N;++i){
result+=f(a+i*interval)*interval;
}
return result;
}
//计算二元函数的定积分,原理同上
double caculate_integration_2D(double ax,double bx,double ay,double by,
double(*f)(double x,double y),int precision=1000){
double lenx=bx-ax,leny=by-ay;
double interval=1.0/precision;
unsigned long Nx=lenx/interval,Ny=leny/interval;
double result=0;
for(unsigned long i=0;i<Nx;++i){
for(unsigned long j=0;j<Ny;++j){
result+=f(ax+i*interval,ay+j*interval)*(interval*interval);
}
}
return result;
}
int main() {
cout<<fixed<<setprecision(6);
//理论值:791.66666666666666666666666666667
cout<<caculate_integration(10.0,15.0,function)<<endl;
cout<<caculate_integration(10.0,15.0,function,1000)<<endl;
cout<<caculate_integration(10.0,15.0,function,10000)<<endl;
cout<<caculate_integration(1.0,10.0,exp,10000)<<endl;
//理论值:3,906.25
cout<<caculate_integration_2D(10.0,15.0,10.0,15.0,function_2D)<<endl;
return 0;
}