zoukankan      html  css  js  c++  java
  • [日常摸鱼]HDU1724 Ellipse自适应Simpson法

    模板题~

    QAQ话说Simpson法的原理我还是不太懂…如果有懂的dalao麻烦告诉我~

    意:每次给一个椭圆的标准方程,求夹在直线$x=l$和$x=r$之间的面积


    • Simpson法

    (好像有时候也被叫Simpson公式,Simpson积分什么的…看到这里的人应该都知道这个是用来干嘛的吧)

    对一段小区间$[l,r]$取奇数个点,然后把区间平均分成$n$段:$x_0,x_1,x_2, \cdots,x_n$,每段长度$\Delta x$,那么:

    $\int_l^r f(x) dx \approx  \frac{\Delta x}{3}(f(x_0)+4f(x_1)+f(x_2))+ \frac{\Delta x}{3}(f(x_2)+4f(x_3)+f(x_4)) + \cdots +\frac{\Delta x}{3}(f(x_{n-2})+4f(x_{n-1})+f(x_n))$

    $n$取得越多答案越准确,时间开销也就越大,然后$n$取多少就是个问题了~

    • 三点Simpson法

    对一个区间$[l,r]$,直接划分成两段三个点,也就是取中点$mid$,然后用Simpson法算出答案

    • 自适应Simpson法(Adaptive Simpson's Rule)

    可以根据情况来划分区间,下面就说一下过程…

    设精度要求为$eps$,我们对于每一段区间$[l,r]$,取中点$mid$,分别用三点Simpson法算出区间$[l,r],[l,mid],[mid,r]$的值$S_1,S_2,S_3$,如果$|S1-S2-S3|<15 eps$那么就直接得出结果$S_2+S_3-(S_2+S_3-S_1)/15)$,否则递归处理左右两断区间,精度减小一半

    然后回到这题就很简单啦,化简一下直接套模板

    具体看代码

     1 #include<cstdio>
     2 #include<cmath>
     3 using namespace std;
     4 
     5 int T;
     6 
     7 double a,b;
     8 
     9 inline double F(double x)
    10 {
    11     return sqrt(b*(1-x*x/(a)));
    12 }
    13 
    14 inline double simpson(double l,double r)
    15 {
    16     double mid=l+(r-l)/2;
    17     return (F(l)+F(r)+4*F(mid))*(r-l)/6;
    18 }
    19 
    20 inline double asr(double l,double r,double eps,double A)
    21 {
    22     double mid=l+(r-l)/2;
    23     double L,R;L=simpson(l,mid);R=simpson(mid,r);  
    24     if(fabs(L+R-A)<=15.0*eps)return L+R+(L+R-A)/15.0;
    25     return asr(l,mid,eps/2,L)+asr(mid,r,eps/2,R);
    26 }
    27 
    28 inline double solve(double l,double r,double eps)
    29 {
    30     return asr(l,r,eps,simpson(l,r));
    31 }
    32 
    33 int main()
    34 {
    35     scanf("%d",&T);
    36     
    37     while(T--)
    38     {
    39         double eps=1e-4;
    40         double l,r;
    41         scanf("%lf%lf%lf%lf",&a,&b,&l,&r);a=a*a;b=b*b;
    42         printf("%.3lf\n",solve(l,r,eps)*2.0);
    43     }
    44     
    45     return 0;
    46 }
    View Code
  • 相关阅读:
    徒手用Java来写个Web服务器和框架吧<第二章:Request和Response>
    徒手用Java来写个Web服务器和框架吧<第一章:NIO篇>
    Linux使用小笔记<进程操作篇>
    shell条件判断
    rz和sz上传下载文件
    vim 快捷键
    while read读取文本内容
    云主机启动提示Booting from Hard Disk GRUB
    centos7进入单用户模式
    账号被锁无法ssh登陆
  • 原文地址:https://www.cnblogs.com/yoshinow2001/p/7921524.html
Copyright © 2011-2022 走看看