1. 程式人生 > >hdu1724 自適應辛普森積分 求面積 定積分

hdu1724 自適應辛普森積分 求面積 定積分

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
const double eps = 1e-6;//eps是整個辛普森應用的關鍵,取的大小根據題目要求的精度來確定,如果取的太小,會導致遞迴次數太多TLE
int T;
double a,b,l,r;
double f(double x) //定義函式
{
	return b * sqrt(1 - x * x / (a * a));
}
double simpson(double a, double b) //返回區間[a,b]的三點辛普森值
{
	double c = (a + b) / 2;
	return (f(a) + 4 * f(c) + f(b)) * (b-a) / 6;
}
double asr(double a, double b, double eps)
{
	double mid = (a + b) / 2;
	double L = simpson(a, mid), R = simpson(mid, b), S = simpson(a, b);
	if (fabs(S - L - R) <= 15 * eps) return L + R + (S - L - R) / 15;
	return asr(a, mid, eps /2) + asr(mid, b, eps / 2);
}
int main()
{
	scanf("%d", &T);
	while (T--)
	{
		scanf("%lf%lf%lf%lf", &a, &b, &l, &r);
		printf("%.3f\n", 2 * asr(l, r, eps));
	}
}