hdu 1724 Ellipse(辛普森公式)

题目:点击打开链接

辛普森公式:


C为斯科特系数。

证明:

知乎上看过一种方法,simpson其实就是用抛物线逼近,把f(x)设为抛物线,对抛物线求积分,整理就整理成上式。

所以对于2次方的函数,精度是足够的,但事实上,它具有三阶代数精度。

代码实现是使用Simpson对两端求积分,再分成两段求积分,差值足够小就返回,否则一直分段。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double eps=1e-6;

double a,b,l,r;

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

double simpson(double a,double b){
    double c=a+(b-a)/2;
    return (f(a)+4*f(c)+f(b))*(b-a)/6;
}

double asr(double a,double b,double eps,double A){
    double c=a+(b-a)/2;
    double L=simpson(a,c);
    double R=simpson(c,b);
    if(fabs(L+R-A)<=15*eps) return L+R+(L+R-A)/15.0;
    return asr(a,c,eps/2,L)+asr(c,b,eps/2,R);
}

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%lf%lf%lf%lf",&a,&b,&l,&r);
        printf("%.3f\n",2*asr(l,r,eps,simpson(a,b)));
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值