精確線搜索-黃金分割法python實現

條件

  • 函數在所選區間爲單峯函數
  • 大概知道極值所在的一個區間
    在這種條件下其算法有效性很高

代碼如下

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

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