漫步最优化三十五——共轭



穿









——

对于前面描述的多维优化方法,每次迭代搜索的方向依赖于目标函数的局部特性,虽然相邻搜索方向可能存在关系,但是这个关系是随机的。接下来我们介绍的方法中相邻的搜索方向严格满足某种数学关系,其中最重要的一类方法是基于共轭方向的。

与牛顿法类似,共轭方向法发展于二次优化问题,然后扩展到一般的优化问题。对于二次问题,只需要有限的迭代次数就能达到收敛。

其实很多类型的问题应用共轭方向法都非常有效,并且在以前已经被广泛使用,下面是四类最重要的这类方法:

  • 共轭梯度法
  • Fletcher-Reeves法
  • Powell法
  • Partan法

接下里会介绍涉及到的主要原则以及基于这些方法的算法。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是两种MATLAB编写的最优化共轭梯度法的代码: 1. 使用黄金分割法精确一维搜索的最优化共轭梯度法代码: ```matlab function [x, fval] = conjugate_gradient_golden(x0, epsilon) % 初始化 x = x0; fval = objective_function(x); grad = gradient(x); d = -grad; % 迭代 while norm(grad) > epsilon alpha = golden_section_search(x, d); x = x + alpha * d; grad_new = gradient(x); beta = norm(grad_new)^2 / norm(grad)^2; d = -grad_new + beta * d; grad = grad_new; fval = objective_function(x); end end function fval = objective_function(x) % 目标函数 fval = x(1)^2 + 2 * x(2)^2; end function grad = gradient(x) % 数值微分法计算梯度 h = 1e-6; grad = zeros(size(x)); for i = 1:length(x) x_plus_h = x; x_plus_h(i) = x_plus_h(i) + h; grad(i) = (objective_function(x_plus_h) - objective_function(x)) / h; end end function alpha = golden_section_search(x, d) % 黄金分割法精确一维搜索 a = 0; b = 1; rho = 0.618; epsilon = 1e-6; while abs(b - a) > epsilon x1 = a + (1 - rho) * (b - a); x2 = a + rho * (b - a); f1 = objective_function(x + x1 * d); f2 = objective_function(x + x2 * d); if f1 < f2 b = x2; else a = x1; end end alpha = (a + b) / 2; end ``` 2. 使用Wolfe-Powell非精确一维搜索的最优化共轭梯度法代码: ```matlab function [x, fval] = conjugate_gradient_wolfe_powell(x0, epsilon) % 初始化 x = x0; fval = objective_function(x); grad = gradient(x); d = -grad; % 迭代 while norm(grad) > epsilon alpha = wolfe_powell_search(x, d); x = x + alpha * d; grad_new = gradient(x); beta = norm(grad_new)^2 / norm(grad)^2; d = -grad_new + beta * d; grad = grad_new; fval = objective_function(x); end end function fval = objective_function(x) % 目标函数 fval = x(1)^2 + 2 * x(2)^2; end function grad = gradient(x) % 数值微分法计算梯度 h = 1e-6; grad = zeros(size(x)); for i = 1:length(x) x_plus_h = x; x_plus_h(i) = x_plus_h(i) + h; grad(i) = (objective_function(x_plus_h) - objective_function(x)) / h; end end function alpha = wolfe_powell_search(x, d) % Wolfe-Powell非精确一维搜索 alpha = 1; c1 = 0.1; c2 = 0.9; rho = 0.618; epsilon = 1e-6; while true f0 = objective_function(x); g0 = gradient(x); f1 = objective_function(x + alpha * d); if f1 > f0 + c1 * alpha * g0' * d || (f1 >= objective_function(x + alpha * d) && alpha < epsilon) alpha = zoom(x, d, alpha); break; end g1 = gradient(x + alpha * d); if abs(g1' * d) <= -c2 * g0' * d break; end if g1' * d >= 0 alpha = zoom(x, d, alpha); break; end alpha = rho * alpha; end end function alpha = zoom(x, d, alpha_lo) % Wolfe-Powell非精确一维搜索中的zoom函数 alpha_hi = alpha_lo * 2; c1 = 0.1; c2 = 0.9; epsilon = 1e-6; while true alpha = (alpha_lo + alpha_hi) / 2; f0 = objective_function(x); g0 = gradient(x); f1 = objective_function(x + alpha * d); if f1 > f0 + c1 * alpha * g0' * d || f1 >= objective_function(x + alpha * d) alpha_hi = alpha; else g1 = gradient(x + alpha * d); if abs(g1' * d) <= -c2 * g0' * d break; end if g1' * d * (alpha_hi - alpha_lo) >= 0 alpha_hi = alpha_lo; end alpha_lo = alpha; end if abs(alpha_hi - alpha_lo) < epsilon break; end end end ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值