2024.6.6

所学时间:2.2小时

代码行数:62

博客园数:1篇

所学知识:今天学习了工程数学的Newton法程序设计。

掌握Hesse矩阵的计算方法和Newton法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。

实验内容

1)求解无约束优化问题:

2)终止准则取

3)完成Newton法(牛顿法)的MATLAB编程、调试;

4)选取几个与实验二中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);

5)按照模板撰写实验报告,要求规范整洁。

算法步骤、代码、及结果

1. 算法步骤

(1).初始化变量 x 为初始猜测。

(2).设置迭代停止条件 epsilon,即迭代过程中的步长小于该值时停止迭代。

(3).进入迭代循环,直到满足停止条件为止。

(4).在每次迭代中,计算目标函数关于变量 x 的梯度和海森矩阵。

(5).根据梯度和海森矩阵计算更新步长 step,使用线性方程求解方法求解方程 ( H \Delta x = \nabla f ),其中 ( H ) 是海森矩阵,( \nabla f ) 是目标函数的梯度。

(6).更新变量 x,即 ( x = x - \Delta x )

(7).计算目标函数的值 f_val

(8).输出当前迭代次数、更新后的变量 x 和目标函数值 f_val

(9).如果更新步长 step 的范数小于设定的停止条件 epsilon,则满足停止条件,跳出循环。

2. 代码

function newtons_method()

    % 初始猜测

    x = [1; 1; 1; 1];

    % 设定迭代停止条件

    epsilon = 1e-6;

    % 迭代

    iter = 0;

    while true

        % 计算梯度和海森矩阵

        grad = [2*(x(1)+10*x(2))+40*(x(1)-x(4))^3; 20*(x(1)+10*x(2))+4*(x(2)-2*x(3))^3; 10*(x(3)-x(4))-8*(x(2)-2*x(3))^3; -10*(x(3)-x(4))-40*(x(1)-x(4))^3];

        hessian = [2+120*(x(1)-x(4))^2, 20, 0, -120*(x(1)-x(4))^2; 20, 200+12*(x(2)-2*x(3))^2, -24*(x(2)-2*x(3))^2, 0; 0, -24*(x(2)-2*x(3))^2, 10+48*(x(2)-2*x(3))^2, -10; -120*(x(1)-x(4))^2, 0, -10, 10+120*(x(1)-x(4))^2];

        % 计算步长

        step = hessian\grad;

        % 更新解

        x = x - step;

        % 计算目标函数值

        f_val = (x(1)+10*x(2))^2+5*(x(3)-x(4))^2+(x(2)-2*x(3))^4+10*(x(1)-x(4))^4;

        % 输出迭代信息

        disp(['迭代次数: ', num2str(iter), ': x = ', num2str(x'), ', f(x) = ', num2str(f_val)]);

        % 判断是否满足停止条件

        if norm(step) < epsilon

            disp(['最优解 x = ', num2str(x'), ', 最优值f(x) = ', num2str(f_val)]);

            break;

        end

        iter = iter + 1;

    end

    disp(['共迭代:',num2str(iter),'']);

end

3. 结果

 

 

posted @ 2024-06-06 20:41  kuku睡  阅读(14)  评论(0编辑  收藏  举报