自适应Simpson积分

自适应Simpson积分

简介:

Simpson积分是解决一重积分问题的强大公式

公式

由公式可以看出,我们可以通过积分上下界来近似逼近积分的值。
但具体如何实现呢?

我们可以二分区间然后递归的方法来求积分。
由积分的可叠加性:

∫ a b f ( x ) d x = ∫ a c f ( x ) d x + ∫ c b f ( x ) d x \int^b_af(x)dx= \int^c_af(x)dx + \int^b_cf(x)dx abf(x)dx=acf(x)dx+cbf(x)dx

所以当我们可以将一个误差较大的区间拆成几个小区间,最后再叠加起来求解即可。
具体细节可以参见下面的例题。


例题

HDU1724

题目链接

裸的Simpson积分,直接套模板即可。

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;

#define MP                        make_pair

const int INF   =    1e9         +        7;
const int N     =    100000      +       10;
const int M     =    10000       +       10;
const int Q     =    1000        +       10;
const int A     =    1000        +       10;

const double esp = 1e-10;
ll a,b;

double f(double x){
    return b * sqrt(1.0 - (x*x)/(a*a));
}

double Simpson(double l,double r){
    return (f(l) + 4*f((l+r)/2.0) + f(r)) * (r - l) / 6.0;

}

double solve(double l,double r){
    double mid = (l + r) / 2;

    double res = Simpson(l,r);

    if(fabs(res - Simpson(l,mid) - Simpson(mid,r)) < esp) return res;
    else    return solve(l,mid) + solve(mid,r);
}

int main(){
    int T;
    cin >> T;

    while(T--){
        double l,r;

        cin >> a >> b >> l >> r;

        printf("%.3f\n",2 * solve(l,r));
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值