【问题标题】:Implementation of steepest descent in MatlabMatlab中最速下降的实现
【发布时间】:2017-07-23 03:33:48
【问题描述】:

我必须使用 Matlab 实现最速下降法并在两个变量的函数上对其进行测试。这是我到目前为止所做的:

x_0 = [0;1.5]; %Initial guess
alpha = 1.5; %Step size
iteration_max = 10000;
tolerance = 10e-10;

% Two anonymous function to compute 1st and 2nd entry of gradient
f = @(x,y) (cos(y) * exp(-(x-pi)^2 - (y-pi)^2) * (sin(x) - 2*cos(x)*(pi-x)));
g = @(x,y) (cos(x) * exp(-(x-pi)^2 - (y-pi)^2) * (sin(y) - 2*cos(y)*(pi-y)));

%Initiliazation
iter = 0;
grad = [1; 1]; %Gradient

while (norm(grad,2) >= tolerance)
    grad(1,1) = f(x_0(1), x_0(2));
    grad(2,1) = g(x_0(1), x_0(2));
    x_new = x_0 - alpha * grad; %New solution
    x_0 = x_new %Update old solution
    iter = iter + 1;

    if iter > iter_max
        break
    end
end

问题在于,与例如 WolframAlpha 的结果相比,我没有获得相同的值。对于这个特定的函数,我应该得到 (3.14,3.14) 或 (1.3,1.3) 但我得到 (0.03, 1.4)。

【问题讨论】:

    标签: matlab gradient-descent


    【解决方案1】:

    您应该知道,此方法是局部搜索,因此它可能会根据初始猜测和步长停留在局部最小值。

    • 使用不同的初始猜测,它会找到不同的局部最小值。

    • 步长很重要,因为大的步长会阻止算法收敛。小步长使算法非常慢。这就是为什么你应该随着函数值的减小而调整步长的大小。

    始终最好通过绘制来了解要优化的功能(如果可能)。您正在使用的函数如下所示(在[-pi pi] 范围内):

    使用以下参数值,您将获得所需的局部最小值。

    x_0 = [2;2]; %Initial guess
    alpha = 0.5; %Step size
    

    【讨论】:

    • 非常感谢。你知道我怎样才能用图形直观地显示该方法的收敛(或发散)吗?我正在考虑绘制迭代与梯度范数的关系。
    • 你需要有计算梯度的函数。考虑它们是FG,那么在x 的每一点你都可以生成J = 0.5*(F^2+G^2)。在iter 上绘制J 可以显示算法的收敛性。
    猜你喜欢
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    相关资源
    最近更新 更多