题目:Ellipse
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1724
题目简述:给定一个椭圆,求椭圆上一个区间[l,r]的面积。
分析:
(1)椭圆方程式:$frac{x^2}{a^2}+frac{y^2}{b^2}=1$。
(2)椭圆上[l,r]区间的面积由X轴上方与X轴下方2部分组成,由于两部分面积一样,我们只考虑X轴上方的那部分面积。
(3)椭圆上y关于x的变化函数:$y=f(x)=frac{b}{a}*sqrt{a^2-x^2}$
(4)椭圆上表达式:$S=2*int_l^r{f(x)dx}=2*int_l^r{frac{b}{a}*sqrt{a^2-x^2} dx}$
(5)算法一:用自适应希普森积分法:
(6)算法二:数学好的可以计算这个积分式,然后直接用。
代码:
#include <cstdio> #include <cmath> const double eps=1e-10; double a,b; double F(double x){ return sqrt(a*a-x*x); } double Simpson(double l,double r){ return (r-l)*(F(l)+4*F((l+r)/2)+F(r))/6; } double Integral(double l,double r,double S){ double mid=(l+r)/2; double A=Simpson(l,mid); double B=Simpson(mid,r); if(A+B-S<eps)return S; return Integral(l,mid,A)+Integral(mid,r,B); } int main(){ int Case;scanf("%d",&Case); for(double l,r,S;Case--;){ scanf("%lf %lf %lf %lf",&a,&b,&l,&r); S=2*b/a*Integral(l,r,Simpson(l,r)); printf("%.3f ",S); } return 0; }
#include<cstdio> #include<cmath> double a,b,l,r; double F(double x){ double t=asin(x/a); return 0.5*a*b*(t+0.5*sin(2*t)); } int main(){ int Case;scanf("%d",&Case); for(;Case--;){ scanf("%lf%lf%lf%lf",&a,&b,&l,&r); printf("%.3lf ",2*(F(r)-F(l))); } return 0; }