黃金分割法求極值點


我們先來了解什么是黃金分割算法:

    黃金分割法也稱0.618算法,屬於區間收縮法,首先找出包含極小點的初始搜索區間,然后黃金分割點通過對函數值的比較不斷縮小搜索區間(當然要保證極小點在搜素區間),當定義域的長度縮小的一定長度時候,就可以用當前區間的端點值的平均近似代替極小值點。

注:適用范圍是單谷函數(就是只有一個極大值(轉化成求極小值問題)或者極小值點)

通俗點講就是講先給定搜索區間比如[a b],然后另x1 = a + 0.382(b - a),x2 = a + 0.618(b - a),然后把x1和x2代入到函數f(x)中比較f(x1)和f(x2)的大小,如果f(x1)>f(x2),則讓a = x1,否則b = x2,然后在新的搜索區間[a b]內,重新找到x1和x2重復以上過程,直到b - a<ξ(這個是給出的最小精度),然后取a,b的平均值近似代替f(x)min。

代碼實現如下:

 1 import numpy as np
 2 import matplotlib.pyplot as plt
 3 import time as tm
 4 
 5 x = np.random.rand(100)
 6 x.sort()
 7 plt.figure()
 8 plt.xlabel("t")
 9 plt.ylabel("y")
10 plt.title("0.618")
11 plt.plot(x,x*x - x + 1)
12 plt.show()
13 
14 def fun(x):
15     y = x*x - x + 1
16     return y
17 def digu(left,right,fun,dis):
18     a = left
19     b = right
20     while True:
21         c = a + 0.382*(b - a)
22         d = a + 0.618*(b - a)
23         if(abs(c-d) < dis):
24             return (c+d)/2
25         else:
26             if((fun(c) - fun(d)) > 0):
27                 a = c
28             else:
29                 b = d
30 start = tm.perf_counter()
31 print(digu(-2000,1000.,fun,0.002))
32 end = tm.perf_counter()
33 print(end-start)

運行結果:

0.4980379375572119
0.0003180240000002499


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM