辛普森积分——自适应辛普森积分

发布时间 2023-09-05 16:58:08作者: 是胡某某啊

辛普森积分的目的

求无原函数的函数\(\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;
}