自适应simpson公式解定积分


来自白书

反正基础就是极限思想嘛,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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值