0.618代码如下:
import math
# 定义函数h(t) = t^3 - 2t + 1
def h(t):
??? return t**3 - 2*t + 1
# 0.618算法
def golden_section_search(a, b, epsilon):?
??? ratio = 0.618?
??? while (b - a) > epsilon:?
??????? x1 = b - ratio * (b - a)?
??????? x2 = a + ratio * (b - a)?
??????? h_x1 = h(x1)?
??????? h_x2 = h(x2)?
??????? if h_x1 < h_x2:?
??????????? b = x2?
??????? else:?
??????????? a = x1?
??? return a? # 或者返回 b,因为它们的值非常接近
# 在 t 大于等于 0 的范围内进行搜索
t_min_618 = golden_section_search(0, 3, 0.001)
print("0.618算法找到的最小值:", h(t_min_618))
基于Armijo准则的线搜索回退法代码如下:
import numpy as np?
? def h(t):?
??? return t**3 - 2*t + 1?
? def h_derivative(t):?
??? return 3*t**2 - 2?
? def armijo_line_search(t_current, direction, alpha, beta, c1):?
??? t = t_current?
??? step_size = 1.0?
??? while True:?
??????? if h(t + direction * step_size) <= h(t) + alpha * step_size * direction * h_derivative(t):?
??????????? return t + direction * step_size?
??????? else:?
??????????? step_size *= beta?
??????? if np.abs(step_size) < 1e-6:?
??????????? break?
??? return None?
? def gradient_descent(start, end, alpha, beta, c1, epsilon):?
??? t = start?
??? while True:?
??????? if t > end:?
??????????? break?
??????? direction = -h_derivative(t)? # 负梯度方向?
??????? next_t = armijo_line_search(t, direction, alpha, beta, c1)?
??????? if next_t is None or np.abs(h_derivative(next_t)) <= epsilon:?
??????????? return next_t?
??????? t = next_t?
??? return None?
? # 参数设置?
alpha = 0.1? # Armijo准则中的参数alpha?
beta = 0.5? # Armijo准则中的参数beta?
c1 = 1e-4? # 自定义参数,用于控制Armijo条件的满足程度?
epsilon = 1e-6? # 梯度范数的终止条件?
? # 搜索区间为[0,3]?
start = 0?
end = 3?
? # 执行梯度下降算法,求得近似最小值点?
t_min = gradient_descent(start, end, alpha, beta, c1, epsilon)?
print("求得的最小值点为:", t_min)?
print("最小值点的函数值为:", h(t_min))