自适应simpson公式解定积分

来源:互联网 发布:某酒店2000w数据.rar 编辑:程序博客网 时间:2024/04/28 10:02


来自白书

反正基础就是极限思想嘛,simpson原理没深究了,当做模板用吧

求定积分:



#include<stdio.h>#include<string.h>#include<math.h>double f(double x){    return x;//自定义函数}double simpson(double a,double b){    double c=a+(b-a)/2;    return (f(a)+4*f(c)+f(b))*(b-a)/6;}//递归过程,可以保存la,rb,和simpson的值,若la,rb未变//则直接使用保存的simpson值不用再调用simpson函数,//若改变则调用函数并保存修改后的值//eps为自定义精度double asr(double a,double b,double eps,double A){    double c=a+(b-a)/2;    double L=simpson(a,c),R=simpson(c,b);    if(fabs(L+R-A)<=15*eps) return L+R+(L+R-A)/15.0;    return asr(a,c,eps/2,L)+asr(c,b,eps/2,R);}double asr_main(double a,double b,double eps){    return asr(a,b,eps,simpson(a,b));}int main(){    printf("%lf\n",asr_main(0,100,1e-5));    return 0;}



la 3485 Bridge

#include<stdio.h>#include<string.h>#include<math.h>double a;double f(double x){    return sqrt(1+4*a*a*x*x);}double simpson(double a,double b){    double c=a+(b-a)/2;    return (f(a)+4*f(c)+f(b))*(b-a)/6;}double asr(double a,double b,double eps,double A){    double c=a+(b-a)/2;    double L=simpson(a,c),R=simpson(c,b);    if(fabs(L+R-A)<=15*eps) return L+R+(L+R-A)/15.0;    return asr(a,c,eps/2,L)+asr(c,b,eps/2,R);}double asr_main(double a,double b,double eps){    return asr(a,b,eps,simpson(a,b));}double solve(double w,double h){    a=4*h/(w*w);    return asr_main(0,w/2,1e-5)*2;}int main(){    double h,d,b,l;    int n,cas;    scanf("%d",&cas);    for(int i=1;i<=cas;i++)    {        scanf("%lf%lf%lf%lf",&d,&h,&b,&l);        n=(b+d-1)/d;        double dd=b/n;        double ll=l/n;        double x=0,y=h;        while(x+1e-9<y)        {            double m=x+(y-x)/2;            if(solve(dd,m)<ll) x=m;            else y=m;        }        if(i!=1) printf("\n");        printf("Case %d:\n%.2lf\n",i,h-x);    }    return 0;}


0 0
原创粉丝点击