精確線搜索花費的計算量一般較大。一般問題中,特別是初始迭代點具體目標點較遠時,不精確線搜索的效率往往要高於精確線搜索。並且牛頓法和擬牛頓法的收斂速度不依賴於步長的搜索,因此可以對α進行不精確線搜索。
不精確線搜索包括Goldstein准則、Wofle准則和Armijo准則。
1. GoldStein准則

其中0<ρ<1/2,第一個不等式是充分下降條件,第二個不等式表示αk不會太小.
也可以寫成

2. Wolfe准則
Goldstein准則的第二個不等式可能造成把極小點排除在可接受區間外,為了解決這個問題,提出了下面的代替條件
σ∈(ρ,1)
即

這個條件叫做曲率條件
充分下降條件與曲率條件一起構成了Wolfe准則

其中 
但曲率條件的不足之處是即使σ→0時也不能精確線搜索,因此有了強Wolfe准則

3. Armijo准則
給定β∈(0,1),ρ∈(0,1/2),τ>0,mk是使不等式

成立的最小非負整數,令

上面的不等式實際上就是充分下降條件,這個方法可以令α從1開始縮小(增大m),直到滿足充分下降條件
下面給出這幾種算法的python實現
Goldstein准則:
1 from linear_search.Function import * 2 from numpy import * 3 4 5 def goldstein(f, val, d): 6 a = 0 7 b = 10000 8 alpha = 1 9 10 def _fi(_alpha): 11 return f(val + _alpha * array(d)) 12 13 fi = Function(_fi) 14 fi0 = fi.value(0) 15 dfi0 = fi.diff(0) 16 while True: 17 fi_alpha = fi.value(alpha) 18 if fi_alpha > fi0 + 1 / 3 * alpha * dfi0: 19 b = alpha 20 alpha = (a + b) / 2 21 elif fi_alpha < fi0 + 2 / 3 * alpha * dfi0: 22 a = alpha 23 if b == 10000: 24 alpha = 2 * alpha 25 else: 26 alpha = (a + b) / 2. 27 else: 28 return alpha
Wolfe准則:
1 from linear_search.Function import * 2 from numpy import * 3 4 5 def wolfe(_f, val, d): 6 a = 0.0 7 b = 10000.0 8 9 def _fi(_alpha): 10 return _f(val + _alpha * array(d)) 11 12 fi = Function(_fi) 13 f = Function(_f) 14 15 fi1 = f.value(val) 16 g=f.grad(val) 17 print(f.part(0,[1,2])) 18 print(f.part(1,[1,2])) 19 dfi1 = dot(g,array(d).T) 20 dfi0 = fi.diff(0) 21 alpha = 1.0 22 23 while True: 24 fi_=fi.value(alpha) 25 if fi_-fi1>1/3*alpha*dfi1: 26 alpha_=a+(alpha-a)/2/(1+(fi1-fi_)/(alpha-a)/dfi1) 27 b=alpha 28 alpha=alpha_ 29 else: 30 dfi_alpha=fi.diff(alpha) 31 if dfi_alpha<1/2*dfi1: 32 alpha_=alpha+(alpha-a)*dfi_alpha/(dfi1-dfi_alpha) 33 a=alpha 34 fi1=fi_ 35 dfi1=dfi_alpha 36 alpha=alpha_ 37 else: 38 return alpha
Armijo准則:
1 from linear_search.Function import * 2 from numpy import * 3 4 5 def armijo(_f, val, d): 6 alpha=1 7 8 def _fi(_alpha): 9 return _f(val + _alpha * array(d)) 10 11 fi = Function(_fi) 12 f = Function(_f) 13 fi_=fi.value(alpha) 14 f_=f.value(val) 15 while True: 16 if fi_>f_+1/3*alpha*dot(f.grad(val),array(d).T): 17 alpha=0.7*alpha 18 else: 19 return alpha
