步长怎么设置 – MATLAB中文论坛
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了步长怎么设置 – MATLAB中文论坛相关的知识,希望对你有一定的参考价值。
参考技术A 要设置步长的话可以在这里面设置。假设t是0~10,我们设置的步长是10^(-5),那么tspan就可以表示成[0:1e-5:10],这样就可以了。采用非精确线搜索求步长的Armjio准则--MATLAB实现
实现原理
具体数学实现原理可参考这篇文章:用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则
代码实现
以下编译环境为 MATLAB R2019b 下编译运行,不同版本可能略有出入。
function [alpha, xk, f, k] = Armjio(fun, grid, x0, dk)
%
% Function [alpha, xk, fx, k] = Armjio(fun, grid, x0, dk)
% 求出函数fun在x0处以dk为下降方向时的步长alpha,同时返回相对应的下
% 一个下降点xk以及xk处的函数值fx,k为迭代次数
% -----------------------------------------------------------
% 输入:
% fun 函数名称(字符变量)
% grid 梯度函数名称(字符变量)
% x0 迭代点(列向量)
% dk 函数在迭代点处的下降方向(列向量)
%
% 输出:
% alpha 函数在x0处以dk为下降方向时的下降步长
% xk 函数在x0处以dk为下降方向,以alpha为步长
% 求得的下降点
% fx 函数在下降点xk处的函数值
% k 求步长算法迭代次数
% -----------------------------------------------------------
% by Zhi Qiangfeng
%
beta = 0.333; % 步长 alpha 的迭代系数,小于 1
rho = 1e-3; % 泰勒展开式补足系数,0 < rho < 1/2
alpha = 1; % 初始步长为 1
k = 0; % 统计迭代次数
gk = feval(grid, x0); % x0处的梯度值
fd = feval(fun, x0 + alpha * dk); % 函数在下一个迭代点处的目标函数值
fk = feval(fun, x0) + alpha * rho * gk' * dk; % 函数在下一个迭代点处的泰勒展开值
while fd > fk
alpha = beta * alpha;
fd = feval(fun, x0 + alpha * dk);
fk = feval(fun, x0) + alpha * rho * gk' * dk;
k = k + 1;
end
xk = x0 + alpha * dk; % 下降点
f = feval(fun, xk); % 下降点处函数值
end
输出示例
以Rosenbrock函数为例,这是优化领域中一个著名的检验函数,其函数与其梯度函数如下:
函数图像如下:
编写函数文件 Rosenbrock.m 如下:
function f = Rosenbrock(x)
f = 100 * (x(2) - x(1)^2)^2 + (1 - x(1))^2;
end
随后是梯度函数文件 grid.m 如下:
function g = grid(x)
g = [-400 * x(1) * x(2) + 400 * x(1)^3 + 2 * x(1) - 2;
200 * x(2) - 200 * x(1)^2];
end
接着我们求 Rosenbrock 函数在 [-1; 1] 点处以负梯度方向为下降方向的迭代步长,调用我们上面的 Armjio 函数,输出结果如下:
>> x0 = [-1; 1];
>> dk = -grid(x0);
>> [alpha, xk, fx, k] = Armjio("Rosenbrock", "grid", x0, dk)
alpha =
0.0014
xk =
-0.9945
1.0000
fx =
3.9900
k =
6
结论:Rosebrock 函数在 [-1; 1] 点处以负梯度方向为下降方向的迭代步长为 0.0014,下一个迭代点为 [-0.9945; 1],且下一步函数值为 3.99。
附
最优化相关算法设计数学原理:最优化/Optimization文章合集
有帮助可以点赞哦,谢谢大家的支持~
以上是关于步长怎么设置 – MATLAB中文论坛的主要内容,如果未能解决你的问题,请参考以下文章