hdu1724(定积分&&Simpson积分)

    xiaoxiao2021-03-25  181

    链接:点击打开链接

    题意:求[l,r]区间内椭圆的面积

    代码1:

    #include <vector> #include <string> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; double cal(double x){ return x/2-sin(2*x)/4; } int main(){ int t; double a,b,le,re,ans; scanf("%d",&t); while(t--){ scanf("%lf%lf%lf%lf",&a,&b,&le,&re); if(le==re){ //定积分求椭圆面积 puts("0.000"); //x=acost y=bcost continue; //变换积分区间后求s=-2ab*∫sin²tdt } ans=-2*a*b; ans=ans*(cal(acos(re/a))-cal(acos(le/a))); printf("%.3lf\n",ans); } return 0; }

    代码2:

    #include <stack> #include <vector> #include <string> #include <math.h> #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const double eps=1e-10; double a,b; double f(double x){ return sqrt((1-x*x/(a*a))*(b*b)); } double simpson(double le,double re){ return (re-le)/6*(f(le)+4*f((le+re)/2)+f(re)); } double cal(double le,double re){ double ans,mid; mid=(le+re)/2; ans=simpson(le,re); //不断划分逼近准确值 if(fabs(ans-simpson(le,mid)-simpson(mid,re))<eps) return ans; //但eps精度越高自然越慢.... else return cal(le,mid)+cal(mid,re); } int main(){ //对于定积分来说有两种近似求解的方法 int t; //一种是梯形法,还有一种是抛物线法, double le,re; //也就是simpson积分 scanf("%d",&t); while(t--){ //主要原理就是将积分区间进行n等分,每次 scanf("%lf%lf%lf%lf",&a,&b,&le,&re); //取三个点做抛物线进行近似的估计,公式见 printf("%.3lf\n",2*cal(le,re)); //上方图片 } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-3071.html

    最新回复(0)