工程数学实验2

代码

function [xopt, fopt, iter] = grad_descent(x0, f, g, eps, alpha)

 

% x0: 初始搜索点

% f: 目标函数

% g: 梯度函数

% eps: 迭代收敛的精度

% alpha: 步长

 

iter = 1; % 迭代计数器

max_iter = 10000; % 最大迭代次数

x = x0;

 

while iter <= max_iter

    

    % 计算梯度

    grad = g(x);

    

    % 计算下降方向

    d = -grad;

    

    % 计算步长

    t = backtracking_line_search(x, d, f, grad, alpha);

    

    % 更新搜索点

    x1 = x + t * d;

    

    % 计算函数变化量

    df = f(x1) - f(x);

    

    % 判断停止条件

    if abs(df) < eps

        xopt = x1;

        fopt = f(x1);

        return;

    else

        % 继续迭代

        x = x1;

        iter = iter + 1;

    end

 

end

 

% 达到最大迭代次数仍未收敛

xopt = x;

fopt = f(x);

 

end

 

% 回溯线性搜索

function t = backtracking_line_search(x, d, f, grad, alpha)

 

c = 0.5;

rho = 0.5;

t = alpha;

 

while f(x+t*d) > f(x) + c*t*grad'*d

    t = rho*t;

end

 

end   

  1. 结果

 

初始点

迭代次数

最优解

最优值

[-1.2,1]

1798

[-0.9995, 0.999]**

4.0187

[-0.3, 1]

3847

[0.9993, 0.9986]**

3.2615

[1.2,1]

1518

[1.0000, 1.0000]

0

[1.2,-1]

10000

由于步长alpha选取不当,程序未能收敛

不适用

[2, 2]

9978

由于步长alpha选取不当,程序未能收敛

不适用

 

四、心得体会

可以发现,与实验一中的结果相比,最速下降法的迭代次数更多,但在这个问题上仍旧表现不错。同时,我们也发现,步长alpha的选取在最优值的求解过程中极其关键,在实现中需要仔细调整。最终,我们得到了代表最优解的点,以及该点对应的最优值。

posted @ 2023-05-29 10:52  云边上打盹  阅读(54)  评论(0)    收藏  举报