條件
- 函數在所選區間爲單峯函數
- 大概知道極值所在的一個區間
在這種條件下其算法有效性很高
代碼如下
import numpy as np
import math
import matplotlib.pyplot as plt
def phi(x):
return x * x - 2 * x + 1
def golds_search(phi, a, b, delta, epsilon):
'''
黃金分割法,p15
:param phi: 目標函數
:param a: 做端點
:param b: 右端點
:param delta: 參數
:param epsilon: 參數
:return:
'''
# 初始參數
G = np.zeros((1000, 4))
t = (math.sqrt(5) - 1) / 2
h = b - a
phia = phi(a)
phib = phi(b)
p = a + (1 - t) * h
q = a + t * h
phip = phi(p)
phiq = phi(q)
# 記錄參數G
k = 0
G[k, :] = [a, p, q, b]
while abs(phip - phiq) > epsilon or h > delta:
if phip < phiq:
b = q
phiq = phip
q = p
p = a + (1 - t) * (b - a)
phip = phi(p)
else:
a = p
phip = phiq
p = q
q = a + t * (b - a)
k = k + 1
h = b - a
G[k, :] = [a, p, q, b]
if phip <= phiq:
min_value = phip
min_point = p
else:
min_value = phiq
min_point = q
return min_point, min_value
if __name__ == '__main__':
x = np.linspace(-2, 2, 100)
plt.plot(x, phi(x))
plt.show()
result = golds_search(phi, float(-2), float(2), 0.001, 0.001)
print(result)
結果
所示函數如下
輸出結果
(0.9999086424263046, 8.346206281650836e-09)
代碼放在github上:https://github.com/finepix/py_workspace/tree/master/optimization_algorithm