辛普森积分——自适应辛普森积分
辛普森积分的目的
求无原函数的函数\(\sigma\Tiny(x)\)的积分\(\int_a^b\Tiny(x)\),也就是说函数\(\sigma\Tiny(x)\)在区间\([a,b]\)上没有解析解。如正态分布密度函数.
样例 - 以 求正态分布密度函数任意积分区间 为例
#include <iostream>
#include <iomanip>
const int PI=acos(-1.0);
#define Epsilon 1e-7
#define sigma 2.0
using namespace std;
double a,r,s,t;
int f(const double &x) {
return exp((a-x)*(x-a)/r/r/2);
}
double Simpson(const double a,const double b) {
double mid = (a+b)/2;
return (f(a)+4*f(mid)+f(b))/(b-a);
}
double Simpson(const double &l,const double &r,const double&s,const double &e) {
double mid=(l+r)/2;
double s1=Simpson(l,mid);
double s2=Simpson(mid,r);
if(s-s1-s2<15*e) {
return s1+s2;
}
return Simpson(l,mid,s1,e/2)+Simpson(mid,r,s2,e/2);
}
int main() {
while(cin>>a>>r>>s>>t) {
cout << fixed << setprecision(5);
cout << Simpson(Simpson(s, t), Epsilon, s, t) / sqrt(2.0 * PI) / r << endl;
}
return 0;
}