hdu 1724 自适应 simpson 算法 求积分


题意: 给出椭圆, l  和 r  求 在这之间的椭圆的面积。


#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <cstring>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <assert.h>
#include <queue>
#define REP(i,n) for(int i=0;i<n;i++)
#define TR(i,x) for(typeof(x.begin()) i=x.begin();i!=x.end();i++)
#define ALLL(x) x.begin(),x.end()
#define SORT(x) sort(ALLL(x))
#define CLEAR(x) memset(x,0,sizeof(x))
#define FILLL(x,c) memset(x,c,sizeof(x))
using namespace std;
const double eps = 1e-6;
#define LL long long 
#define pb push_back
const int maxn  = 11000;

double a,b , l, r;
// simpson公式用到的函数  
double F(double x){
     return sqrt(b*b*(1-x*x/(a*a)));
}

// 三点simpson法。这里要求F是一个全局函数  
double simpson(double a,double b){
	double c =  a+(b-a)/2;
	return (F(a) + 4*F(c) + F(b))*(b-a)/6;
}
// 自适应Simpson公式(递归过程)。已知整个区间[a,b]上的三点simpson值A 
double asr(double a , double b ,double eps ,double A){
	double c = a+ (b-a)/2;
	double L = simpson(a,c) ,R = simpson(c,b);
	if(fabs(A-L-R)<=15*eps) return L + R +(A-L-R)/15;
	return asr(a,c,eps/2,L) + asr(c,b,eps/2,R);
}
// 自适应Simpson公式(主过程)  
double asr(double a, double b, double eps) {  
  return asr(a, b, eps, simpson(a, b));  
}  


int main(){
    int t ;
    cin >>t ;
    while(t--){
    	scanf("%lf%lf%lf%lf",&a,&b,&l,&r);
    	double ans = asr(l,r,eps);
    	ans *= 2;
    	printf("%.3f\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值