基本思想
把函數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; //不滿足的時候往左走一步,因爲右邊的都不滿足條件,放棄
}
}