[作业]如何二分法求函数零点

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long double dl;
dl ansl,ansr;
map <dl,dl> vis;            //一个小优化,没有多大作用

dl cal(dl n)                //计算f(n)的函数值
{
    if(vis[n])
        return vis[n];
    return vis[n]=((pow(2.0,n))+(3.0*n)-6.0);
}

void solve(dl l,dl r,dl exp)//当前二分区间及精度
{
    if(r-l<exp)             //区间长度小于给定精度            
    {
        ansl=l,ansr=r;
        return;
    }
    dl mid=(l+r)/2;
    dl a=cal(l),b=cal(r),c=cal(mid);
    if(c==0)                //区间中点就是零点  
        solve(mid,mid,exp);
    if(a*c<0)               //零点位于左半区间
        solve(l,mid,exp);
    if(b*c<0)
        solve(mid,r,exp);   //零点位于右半区间
    return;
}

int main(int argc, char const *argv[])
{
    vis.clear();
    dl a,b,exp;
    cin>>a>>b>>exp;
    solve(a,b,exp);
    cout<<fixed<<setprecision(10)<<ansl<<" "<<ansr<<endl;//强行精度控制
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wjsoj/p/11768842.html