2024/05/12
学习时长:3小时
代码行数:80行左右吧
博客数量:1篇
今天完成的主要内容是工程数学中的实验二的部分:
一、实验目的
通过一维寻优黄金分割法的程序设计,培养学生计算机的应用能力,并为今后无约束优化方法的学习和编程,奠定基础;掌握缩小寻优区间的黄金分割法。
二、实验内容
(1)请用0.618法求解优化问题:
的极小点和极小值(进退法确定初始区间),精度为10-6;
(2)根据0.618法算法步骤编写Matlab的程序实现0.618搜索法;
(3)要求输出内容包括:极小点、极小值、每次迭代的a、b、al、ak的值;
(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;