hdu1724 Ellipse(数值积分,自适应辛普森)

题意:

在这里插入图片描述

解法:

x 2 a 2 + y 2 b 2 = 1 \frac{x^2}{a^2}+\frac{y^2}{b^2}=1 a2x2+b2y2=1

b 2 x 2 + a 2 y 2 = a 2 b 2 b^2x^2+a^2y^2=a^2b^2 b2x2+a2y2=a2b2

y 2 = a 2 b 2 − b 2 x 2 a 2 y^2=\frac{a^2b^2-b^2x^2}{a^2} y2=a2a2b2b2x2

y = a 2 b 2 − b 2 x 2 a 2 y=\sqrt{\frac{a^2b^2-b^2x^2}{a^2}} y=a2a2b2b2x2

y = a 2 b 2 − b 2 x 2 a y=\frac{\sqrt{a^2b^2-b^2x^2}}{a} y=aa2b2b2x2

y = b ∗ a 2 − x 2 a y=\frac{b*\sqrt{a^2-x^2}}{a} y=aba2x2

答 案 为 y 在 [ l , r ] 上 的 积 分 ∗ 2 , 答案为y在[l,r]上的积分*2, y[l,r]2,

乘 2 是 因 为 有 上 下 两 部 分 . 乘2是因为有上下两部分. 2.

用 自 适 应 辛 普 森 来 计 算 积 分 的 值 . 用自适应辛普森来计算积分的值. .

code:

#include<bits/stdc++.h>
using namespace std;
const double eps=1e-6;
double a,b,l,r;
double f(double x){
    
    //被积函数求值
    return b*sqrt(a*a-x*x)/a;
}
double simpson(double l,double r){
    
    
    double mid=(l+r)/2;
    return (r-l)*(f(l)+4*f(mid)+f(r))/6;
}
double ask(double l,double r,double eps,double ans){
    
    
    double mid=(l+r)/2;
    double fl=simpson(l,mid),fr=simpson(mid,r);
    if(fabs(fl+fr-ans)<=15*eps)return fl+fr+(fl+fr-ans)/15;
    return ask(l,mid,eps/2,fl)+ask(mid,r,eps/2,fr);
}
signed main(){
    
    
    int T;scanf("%d",&T);
    while(T--){
    
    
        scanf("%lf%lf%lf%lf",&a,&b,&l,&r);
        double ans=2*ask(l,r,eps,simpson(l,r));
        printf("%.3f\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/115250731
今日推荐