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

时间秒杀一切 提交于 2019-12-03 00:21:30

代码如下:

#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;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!