尝试实现固定步长的梯度下降算法

时间:2021-05-10 07:44:30

标签: algorithm matlab gradient

我正在尝试在 MATLAB 上实现具有固定步长的梯度下降算法。\

syms x1 x2 x3 x4
f(x1,x2,x3,x4) = (x1+10*x2)^2 + 5*(x3-x4)^2 + (x2-2*x3)^4 + 10*(x1-x4)^4 ;
grad_f = gradient(f);
xk = [3;-1;0;1];
while euclidian(grad_f(xk(1),xk(2),xk(3),xk(4)),4) > 0.01
    xk = xk- 0.001*grad_f(xk(1),xk(2),xk(3),xk(4));
    double(xk)
end

这是主要部分,以下是欧几里德范数函数:

function euclidian_norm = euclidian (x,size)
    total = 0;
    for i = 1:size
        total = total + x(i)^2;
    end
    euclidian_norm = sqrt(total);
end

但是,当我尝试运行代码时,它需要永远计算它。我也不知道为什么。
提前致谢

编辑: 任何人都可以尝试运行代码并告诉我是否出现同样的问题?

1 个答案:

答案 0 :(得分:0)

将问题构建为向量点积,以利用 MATLAB 的内置线性代数例程,这比显式循环快得多:

function euclidean_norm = euclidean(x)
    euclidean_norm = x' * x;
end

您不需要 size 参数(即使在您现有的代码中,在函数内计算它而不是要求调用者计算并传入它也不太容易出错)。

我认为这甚至不需要是一个单独的函数,但它没有坏处。