代码参数说明
其中d为下降方向,这里取grad(梯度)的负数方向,其中armijo搜索旨在寻找合适的步长
代码
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import LinearLocator, FormatStrFormatter
from mpl_toolkits.mplot3d import Axes3D
def sdm(fun, gfun, x0, rho, sigma, epsilon):
'''
最速下降法
:param fun: 目标函数
:param gfun: 梯度函数
:param x0: 初始点
:param rho: armijo搜索参数
:param sigma: 同上
:param epsilon: 终止调节参数
:return:
'''
max_iter_k = 5000
max_m = 20
k = 0
while k < max_iter_k:
grad = gfun(x0)
d = -grad
if np.linalg.norm(d) < epsilon:
break
m = 0
mk = 0
while m < max_m: # armijo 搜索
print('f(x + rho^m * d) = {}'.format(fun(x0 + pow(rho, m) * d)))