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

代码如下:

#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;
}
posted @ 2019-10-30 23:46  WJSoj  阅读(438)  评论(0编辑  收藏  举报