软件工程日报(5.8)
题目:
上机实验三:Newton法程序设计
1、基本要求
掌握Hesse矩阵的计算方法和Newton法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。
2、主要内容
(1)求解无约束优化问题:;
(2)终止准则取;
(3)完成Newton法(牛顿法)的MATLAB编程、调试;
(4)选取几个与实验二中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);
(5)按照模板撰写实验报告,要求规范整洁。
3、操作要点
(1)通过编程实现牛顿法;
(2)使用MTALAB调试程序,并将实验结果保存到文件中;
(3)撰写实验报告。
4、主要仪器设备
微机及Matlab软件
代码:
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. 结果
newtonMethod
最优解为:
0 0 0 0
最优值为:0
迭代次数:0
>> newtonMethod
警告: 矩阵接近奇异值,或者缩放错误。结果可能不准确。RCOND = 1.041602e-18。
> In newtonMethod (line 26)
最优解为:
-0.0104 0.0010 0.0040 0.0040
最优值为:4.2704e-07
迭代次数:69
>> newtonMethod
警告: 矩阵接近奇异值,或者缩放错误。结果可能不准确。RCOND = 1.041602e-18。
> In newtonMethod (line 26)
最优解为:
-0.0100 0.0010 0.0038 0.0038
最优值为:3.6836e-07
迭代次数:80
>> newtonMethod
警告: 矩阵接近奇异值,或者缩放错误。结果可能不准确。RCOND = 7.004046e-19。
> In newtonMethod (line 26)
最优解为:
-0.0105 0.0011 0.0041 0.0041
最优值为:4.5519e-07
迭代次数:91
>> newtonMethod
警告: 矩阵接近奇异值,或者缩放错误。结果可能不准确。RCOND = 7.004046e-19。
> In newtonMethod (line 26)
最优解为:
-0.0103 0.0010 0.0040 0.0040
最优值为:4.1945e-07
迭代次数:4662
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律