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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值