2024/05/12

学习时长:3小时

代码行数:80行左右吧

博客数量:1篇

今天完成的主要内容是工程数学中的实验二的部分:

一、实验目的

通过一维寻优黄金分割法的程序设计,培养学生计算机的应用能力,并为今后无约束优化方法的学习和编程,奠定基础;掌握缩小寻优区间的黄金分割法。

二、实验内容

(1)请用0.618法求解优化问题:

 

的极小点和极小值(进退法确定初始区间),精度为10-6

(2)根据0.618法算法步骤编写Matlab的程序实现0.618搜索法;

(3)要求输出内容包括:极小点、极小值、每次迭代的abalak的值;

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

% 定义目标函数

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

 

% 最速下降法求解

% 设定初始点和迭代终止准则

x0_list = [-2, 5, 6, 7; 2 ,2 ,6 , 5; 0.5, -1.5, 2, 5]; % 多个不同的初始点

max_iter = 10000;

tol = 1e-5;

results = zeros(size(x0_list, 1), 4); % 存储最优结果

 

for i = 1:size(x0_list, 1)

    x0 = x0_list(i,:);

    x = x0';

    a = 0.01; % 步长

    iter = 0;

    grad_norm = inf;

    func_values = zeros(max_iter, 1); % 新增:记录每一步的函数值

    while grad_norm > tol && iter < max_iter

        iter = iter + 1;

        grad = [400*x(1)^3-400*x(1)*x(2)+2*x(1)-2;

                 200*(x(2)-x(1)^2);

                 10*(x(3)-x(4));

                 -10*(x(3)-x(4))];

        x_new = x - a*grad;

        if f(x_new) < f(x)

            x = x_new;

            a = a * 1.1;

        else

            a = a * 0.5;

        end

        grad_norm = norm(grad);

        func_values(iter) = f(x); % 记录当前迭代的函数值

    end

    results(i, :) = x;

    fprintf('初始点 (%g, %g, %g, %g)\n', x0(1), x0(2), x0(3), x0(4));

    fprintf('迭代次数: %d\n', iter);

    fprintf('最优点: (%g, %g, %g, %g)\n', x(1), x(2), x(3), x(4));

    fprintf('最优函数值: %g\n', f(x));

    fprintf('\n');

        % 绘制当前初始点对应的函数值变化曲线

    plot(1:iter, func_values(1:iter), 'LineWidth', 1.5, ...

         'DisplayName', sprintf('初始点%d', i));

    hold on;

end

 

% 添加标题、标签、图例和网格

xlabel('迭代次数');

ylabel('函数值');

title('函数值随迭代次数变化');

legend('show');

grid on;

hold off;

 

posted @ 2024-05-12 21:43  伐木工熊大  阅读(9)  评论(0编辑  收藏  举报