一維搜尋 二分法

2021-08-22 07:21:56 字數 2432 閱讀 3564

二分法是用來求函式零點的方法,如果函式可導,那麼函式的一階導的零點就是原函式的極值點。但是如果原函式沒有極值點,比如乙個單調函式,其最值在某一端點。這樣求導後就不滿足二分法求零點的條件。

1.二分法演算法步驟:

1.二分法**maltab實現:

測試函式:

clc,clear

f = @(x) 2*x.^2 - x - 1; %原函式

df = @(x)4*x - 1; %一階導數

a = -3;

b = 0.25;

epsilon = 1e-4;

ticres = binarysearch(df,a,b,epsilon)

toc% 符號函式實現

func = sym('2*x^2 - x - 1');

ticres1 = binarysearch1(func,a,b,epsilon)

toc

傳函式控制代碼方式:

% binarysearch 二分法

% - 優點:計算量少,而且總能收斂到乙個區域性極小點,不需要計算導數

% - 缺點:收斂速度慢,需要函式可導

% inputs:

% - df 函式的一階導數

% - a 搜尋區間下限

% - b 搜尋區間下限

% - epsilon 精度:用區間長度衡量

% outputs:

% -res 搜尋結果

function

res = binarysearch

(df,a,b,epsilon)

% 檢查輸入

if df(a)*df(b) > 0

display('binarysearch: 二分法區間端點值同號……');

return;

end%初始化

x1 = a;

x2 = b;

mean = 0.5*(x1 + x2);

%計算while(true)

% state = [x1 x2]

if(abs(x1-x2)break; end

if(df(x1)*df(mean) > 0)

x1 = mean;

elseif(df(x1)*df(mean) < 0)

x2 = mean;

elseif(df(x1)*df(mean) == 0)

res = mean; break;

endmean = 0.5*(x1 + x2);

endres = 0.5*(x1 + x2);

end

傳符號函式方式:

% binarysearch 二分法

% - 優點:計算量少,而且總能收斂到乙個區域性極小點,不需要計算導數

% - 缺點:收斂速度慢

% inputs:

% - func 原函式的符號函式

% - a 搜尋區間下限

% - b 搜尋區間下限

% - epsilon 精度:用區間長度衡量

% outputs:

% -res 搜尋結果

function

res = binarysearch1

(func,a,b,epsilon)

df = diff(func);

% 檢查輸入

if subs(df,a)*subs(df,b) > 0

display('binarysearch: 二分法區間端點值同號……');

return;

end%初始化

x1 = a;

x2 = b;

mean = 0.5*(x1 + x2);

%計算while(true)

% state = [x1 x2]

if(abs(x1-x2)break; end

if(subs(df,x1)*subs(df,mean) > 0)

x1 = mean;

elseif(subs(df,x1)*subs(df,mean) < 0)

x2 = mean;

elseif(subs(df,x1)*subs(df,mean) == 0)

res = mean; break;

endmean = 0.5*(x1 + x2);

endres = 0.5*(x1 + x2);

end

結果如下圖(函式控制代碼的方式比符號函式方式計算速度快很多):

搜尋 二分法

input 待搜尋目標整數,目標陣列 output 找到目標整數的索引,找不到則 1 constraints 目標陣列有序排列 公升降序 二分法搜尋思想 舉例說明 你是個摸牌高手,不用掀開麻將只需用手摸就能摸出牌面,桌面扣著80個麻將牌,不同的是麻將上刻的是80個1到500的公升序不連續數字,形如 ...

二分法,二分搜尋

二分法是乙個應用很廣泛的演算法 好吧,剛說出這句話的時候,我查了一下資料,發現我了解的應用寥寥無幾.ok,既然不知道,那就下次補充把。咱們直接進入主題。二分法 bisection method 是一種方程式根的近似值求法。演算法 若要求已知函式f x 0的值則 1.先找出乙個區間 a,b 使得f a...

二分搜尋 二分法及運用

二分法查詢 通過不斷縮小解存在的範圍,在有序陣列中查詢特定元素的搜尋演算法。經常可見 二分法 與其他演算法結合的題目 1 首先,從陣列的中間開始搜尋,如果該位置的值剛好是目標,則表示找到,結束搜尋。2 如果第一步的搜尋到的值大於目標,則把陣列分成兩半,在陣列右邊區域查詢,然後重複步驟 1 的操作。如...