实验二:最速下降法程序设计

一、实验目的

 

通过最速下降法的程序设计,为今后的约束优化方法的学习和编程奠定基础;掌握负梯度方向的定义和最速下降法的迭代公式;

通过此次实验,进一步巩固最速下降法的基本 原理和思想

 

二、实验内容

 

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

(2)终止准则取

(3)完成最速下降法(负梯度法)的 MATLAB 编程、调试;

(4)要求选取多个不同的初始点,并给出迭代次数,最优函数值等相关信息,有能力的同学尝

试画出最优值随迭代次数变化的曲线图;

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

 

三、算法步骤、代码、及结果

   1. 算法步骤

1步:选取初始点 x^0给定终止误差 ε > 0  ,令 k = 0

2步:计算 ∇  f(x^k),若 ∣ ∣ ∇ f ( x^k ) ∣ ∣ ≤ ε 停止迭代,输出x^k 。否则进行第三步;

3步:取 p^k = −∇f(x^k )

4步:进行一维搜索,求 λ k  ,使得

f ( x k + λ k p k ) = min ⁡ λ ≥ 0 f ( x k + λ p k )

 x^{k+1} = x^k + p^kk=k+1,转第 2

 

复制代码
% 定义目标函数
f = @(x) 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

% 最速下降法求解
% 设定初始点和迭代终止准则
x0_list = [-1, 1; -2, 7; 3,10]; % 多个不同的初始点
max_iter = 10000;
tol = 1e-5;

for i = 1:length(x0_list)
    x0 = x0_list(i,:);
    x = x0';
    a = 0.01; % 步长
    iter = 0;
    grad_norm = inf; % 初始化为正无穷
    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)];
        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);
    end
    fprintf('初始点 (%g, %g)\n', x0(1), x0(2));
    fprintf('迭代次数: %d\n', iter);
    fprintf('最优点: (%g, %g)\n', x(1), x(2));
    fprintf('最优函数值: %g\n', f(x));
    fprintf('\n');
End

% 绘制最优值随迭代次数的变化曲线
x = linspace(1, 413, 413);
y = NaN(size(x));
for i = 1:413
    y(i) = f([-0.300609; 0.00015509]); %第一个初始点
end
plot(x, y);
hold on;
x = linspace(1, 560, 560);
y = NaN(size(x));
for i = 1:560
    y(i) = f([-0.300585; 0.000152774]); %第二个初始点
end
plot(x, y);
x = linspace(1, 87, 87);
y = NaN(size(x));
for i = 1:87
    y(i) = f([1; 1]); %第三个初始点
end
plot(x, y);
title('Optimal function value vs. Iteration');
xlabel('Iteration');
ylabel('Optimal function value');
legend('(-2,2)', '(-3,3)', '(0.5,-1.5)');
复制代码

 

posted @   旺旺大菠萝  阅读(147)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示