二分模板

来源:互联网 发布:java行业 编辑:程序博客网 时间:2024/06/07 07:40

基本思想


把函数f(x)的零点所在的区间[a,b](满足f(a)●f(b)<0)“一分为二”,得到[a,m]和[m,b]。根据“f(a)●f(m)<0”是否成立,取出零点所在的区间[a,m]或[m,b],仍记为[a,b]。所对得的区间[a,b]重复上述步骤,直到包含零点的区间[a,b]“足够小”,则[a,b]内的数可以作为方程的近似解。

证明方法


二分法(dichotomie) 即一分为二的方法. 设[a,b]为R的闭区间. 逐次二分法就是造出如下的区间序列([an,bn]):a0=a,b0=b,且对任一自然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表示[an,bn]的中点.

 求法


给定精确度ξ,用二分法求函数f(x)零点近似值的步骤如下:

1 确定区间[a,b],验证f(a)·f(b)<0,给定精确度ξ.

2 求区间(a,b)的中点c.

3 计算f(c).

(1) 若f(c)=0,则c就是函数的零点;

(2) 若f(a)·f(c)<0,则令b=c;

(3) 若f(c)·f(b)<0,则令a=c.

(4) 判断是否达到精确度ξ:即若|a-b|<ξ,则得到零点近似值a(或b),否则重复2-4.

这些百科里有,可以查一下看一下仔细理解 

模板代码:

left = 0, right = n-1;//定义边界时要注意度while(left <= right)//退出循环的条件{mid = (left + right) / 2; //或者(left + right) << 1 if(solve(mid) /*判断方案*/ ){ans = a[mid];//答案存放点left = mid + 1;//满足之后往右走一步,因为左边的都已经满足条件,且已经存入答案,放弃}else{right = mid - 1;//不满足的时候往左走一步,因为右边的都不满足条件,放弃}}


原创粉丝点击