将下面这段源码转换为伪代码:def bfgs(fun, grad, x0, iterations, tol): """ Minimization of scalar function of one or more variables using the BFGS algorithm. Parameters ---------- fun : function Objective function. grad : function Gradient function of objective function. x0 : numpy.array, size=9 Initial value of the parameters to be estimated. iterations : int Maximum iterations of optimization algorithms. tol : float Tolerance of optimization algorithms. Returns ------- xk : numpy.array, size=9 Parameters wstimated by optimization algorithms. fval : float Objective function value at xk. grad_val : float Gradient value of objective function at xk. grad_log : numpy.array The record of gradient of objective function of each iteration. """ fval = None grad_val = None x_log = [] y_log = [] grad_log = [] x0 = asarray(x0).flatten() # iterations = len(x0) * 200 old_fval = fun(x0) gfk = grad(x0) k = 0 N = len(x0) I = np.eye(N, dtype=int) Hk = I old_old_fval = old_fval + np.linalg.norm(gfk) / 2 xk = x0 x_log = np.append(x_log, xk.T) y_log = np.append(y_log, fun(xk)) grad_log = np.append(grad_log, np.linalg.norm(xk - x_log[-1:])) gnorm = np.amax(np.abs(gfk)) while (gnorm > tol) and (k < iterations): pk = -np.dot(Hk, gfk) try: alpha, fc, gc, old_fval, old_old_fval, gfkp1 = _line_search_wolfe12(fun, grad, xk, pk, gfk, old_fval, old_old_fval, amin=1e-100, amax=1e100) except _LineSearchError: break x1 = xk + alpha * pk sk = x1 - xk xk = x1 if gfkp1 is None: gfkp1 = grad(x1) yk = gfkp1 - gfk gfk = gfkp1 k += 1 gnorm = np.amax(np.abs(gfk)) grad_log = np.append(grad_log, np.linalg.norm(xk - x_log[-1:])) x_log = np.append(x_log, xk.T) y_log = np.append(y_log, fun(xk)) if (gnorm <= tol): break if not np.isfinite(old_fval): break try: rhok = 1.0 / (np.dot(yk, sk)) except ZeroDivisionError: rhok = 1000.0 if isinf(rhok): rhok = 1000.0 A1 = I - sk[:, np.newaxis] * yk[np.newaxis, :] * rhok A2 = I - yk[:, np.newaxis] * sk[np.newaxis, :] * rhok Hk = np.dot(A1, np.dot(Hk, A2)) + (rhok * sk[:, np.newaxis] * sk[np.newaxis, :]) fval = old_fval grad_val = grad_log[-1] return xk, fval, grad_val, x_log, y_log, grad_log
时间: 2024-02-10 12:33:30 浏览: 136
伪代码如下:
函数 bfgs(fun, grad, x0, iterations, tol):
fval <- 空值
grad_val <- 空值
x_log <- 空列表
y_log <- 空列表
grad_log <- 空列表
x0 <- 将 x0 转换为一维数组
old_fval <- 调用 fun(x0)
gfk <- 调用 grad(x0)
k <- 0
N <- x0 的长度
I <- 生成 N*N 的单位矩阵
Hk <- I
old_old_fval <- old_fval + 计算 gfk 的范数 / 2
xk <- x0
将 xk 添加到 x_log 列表末尾
将 fun(xk) 添加到 y_log 列表末尾
将 xk 与 x_log 最后一个元素的差的范数添加到 grad_log 列表末尾
gnorm <- 计算 gfk 的绝对值的最大值
while (gnorm > tol) and (k < iterations):
pk <- - Hk * gfk
尝试:
alpha, fc, gc, old_fval, old_old_fval, gfkp1 <- _line_search_wolfe12(fun, grad, xk, pk, gfk, old_fval, old_old_fval, amin=1e-100, amax=1e100)
捕获 _LineSearchError:
跳出循环
x1 <- xk + alpha * pk
sk <- x1 - xk
xk <- x1
如果 gfkp1 是空值:
gfkp1 <- 调用 grad(x1)
yk <- gfkp1 - gfk
gfk <- gfkp1
k <- k + 1
gnorm <- 计算 gfk 的绝对值的最大值
将 xk 与 x_log 最后一个元素的差的范数添加到 grad_log 列表末尾
将 xk 添加到 x_log 列表末尾
将 fun(xk) 添加到 y_log 列表末尾
如果 (gnorm <= tol):
跳出循环
如果 old_fval 不是有限数:
跳出循环
尝试:
rhok <- 1.0 / (yk · sk)
捕获 ZeroDivisionError:
rhok <- 1000.0
如果 rhok 是正无穷:
rhok <- 1000.0
A1 <- I - sk·yk.T·rhok
A2 <- I - yk·sk.T·rhok
Hk <- A1·Hk·A2 + rhok·sk·sk.T
fval <- old_fval
grad_val <- grad_log 最后一个元素
返回 xk, fval, grad_val, x_log, y_log, grad_log
阅读全文