自适应辛普森法(入门)

定义

简而言之,就是一种用二次函数来逼近被积函数。把求原来函数的积分换成求二次函数的积分的一种近似求积分的方法。

公式:

自适应

可以理解成我们学过的二分算法。
就是我们可以以二分的方式,把函数划分成一个个小的区间进行求和,使得函数划分的区间和精度满足题里的要求。

板子训练

#include<bits/stdc++.h>
#define int long long
#define rint register int
using namespace std;
using PII = pair<int,int>;
typedef long long ll;
template<typename T> inline void ckmax(T& x,T y){x=(y>x?y:x); }
template<typename T> inline void ckmin(T& x,T y){x=(y<x?y:x); }
namespace Fast{
	inline int read(){
        int t=0;
        char c=getchar();
        while(c<'0'||c>'9') c=getchar();
        while(c>='0'&&c<='9') t=10*t+(c^48),c=getchar();
        return t;
    }
    inline void write(int x){
        if(x<10){
            putchar(x|48);
            return;
        }
        write(x/10);
        putchar((x%10)|48);
}}
using namespace Fast;
double long a,b,c,d,L,R;
namespace gj{
	#define dl double long 
	#define eps 1e-20
}
using namespace gj;
inline dl F(dl x){return (c*x+d)/(a*x+b);}
inline dl simpson(dl l,dl r){
	dl mid=(l+r)/2.0;
	return (r-l)*(F(l)+4.0*F(mid)+F(r))/6.0;
}
inline dl SOLVE(dl l,dl r,dl ans){
	dl mid=(l+r)/2.0,le=simpson(l,mid),ri=simpson(mid,r);
	if(fabs(le+ri-ans)<eps)	return le+ri;
	else return SOLVE(l,mid,le)+SOLVE(mid,r,ri);
}
signed main(){
	//freopen("sim.in","r",stdin);
	//freopen("sim.out","w",stdout);
	//fclose(stdin);
	//fclose(stdout);
	cin.tie(0),cout.tie(0); 
	cin>>a>>b>>c>>d>>L>>R;
	printf("%.6llf\n",SOLVE(L,R,simpson(L,R)));
	return 0;
}
posted @ 2022-04-23 23:01  PassName  阅读(84)  评论(0编辑  收藏  举报