二分模板

基本思想


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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章