实验三:牛顿法
一、实验目的
掌握Hesse矩阵的计算方法和Newton法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。
二、实验内容
(1)求解无约束优化问题: ;
(2)终止准则取 ;
(3)完成Newton法(牛顿法)的MATLAB编程、调试;
(4)选取几个与实验二中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);
(5)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
1. 定义目标函数:
给定一个多元函数 f(x),其中 x 是一个向量,包含多个变量(在这个例子中,x 有四个分量)。
2. 定义目标函数的梯度:
计算目标函数在每个点的梯度向量 grad_f(x),它包含了函数在每个变量方向上的偏导数。
3. 定义目标函数的海森矩阵:
海森矩阵 hess_f(x) 是一个二阶偏导数的矩阵,用于描述函数的局部曲率。在这个例子中,它是一个 4x4 的矩阵。
4. 选择初始点:
选择一个初始点 x0 作为算法的起始位置。
5. 设定停止准则:
设定一个容差 tol,当梯度的范数小于这个容差时,算法停止迭代。
6. 牛顿法迭代:
a. 初始化迭代计数器 iter 为 0,设置当前点为 x = x0。
b. 计算当前点的梯度 gradient = grad_f(x)。
c. 检查停止准则:如果 norm(gradient) <= tol,则输出最优解和最优值,并结束算法。
d. 否则,计算当前点的海森矩阵 hess。
e. 使用海森矩阵求解线性方程组,得到搜索方向 d = -hess\gradient(在MATLAB中,\ 表示左除,即求解线性方程组)。
f. 更新当前点 x = x + d。
g. 迭代计数器 iter 自增 1。
h. 回到步骤 b,继续迭代。
7. 输出最优解和最优值:
当算法停止时,输出得到的最优解 x(最优的 x 值向量),最优值 f(x)(在最优解处的函数值),以及迭代次数 iter。
2. 代码
% 定义目标函数
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))^4;
% 定义目标函数梯度
grad_f = @(x) [2*(x(1) + 10*x(2)); 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(1) - x(4))^4 - 5*(x(3) - x(4))];
% 定义目标函数海森矩阵
hess_f = @(x) [2, 20, 0, -40*(x(1) - x(4))^3;
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;
-40*(x(1) - x(4))^3, 0, -10, 10];
% 初始点
x0 = [1; 1; 1; 1];
% 设定停止准则
tol = 1e-6;
% 牛顿法
x = x0;
iter = 0;
gradient = grad_f(x);
while norm(gradient) > tol
hess = hess_f(x);
d = -hess\gradient;
x = x + d;
gradient = grad_f(x);
iter = iter + 1;
end
% 输出最优解和最优值
disp('最优解为:');
disp(x');
disp(['最优值为:', num2str(f(x))]);
disp(['迭代次数:', num2str(iter)]);
3. 结果
四、心得体会
知道了牛顿法的实现原理
Newton法是一种基于函数泰勒级数展开的优化算法,它利用函数的二阶导数(Hessian矩阵)信息来加速收敛。在每一步迭代中,Newton法通过求解当前点的Hessian矩阵的逆与梯度向量的乘积来得到搜索方向,并沿该方向进行一步搜索,更新当前点。
我对比了Newton法与最速下降法在求解无约束优化问题时的性能差异,并分析了两种算法在最优解、最优值以及收敛速度等方面的差异。这次实验不仅加深了我对优化算法的理解,还提高了我的编程和调试能力。
代码量 50行