6.14安卓开发日记58

news/2024/10/4 21:16:00

 

实验三:Newton法程序设计

一、实验目的

掌握Hesse矩阵的计算方法和Newton法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。

二、实验内容

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

(2)终止准则取;

(3)完成Newton法(牛顿法)的MATLAB编程、调试;

(4)选取几个与实验二中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);

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

 

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

1. 算法步骤

使用Matlab编写,编写牛顿法代码,定义变量,测试运行。

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(2), 120 * (x(2) - 2 * x(3))^2, -160 * (x(3) - x(4))^2, 40 * (x(1) - x(4))^3];

 

% 设置参数

max_iterations = 1000;

tolerance = 1e-6;

 

% 初始化起始点

x = [1; 2; 3; 0; 0];

 

% 存储迭代过程中的参数和目标函数值

history_x = zeros(5, max_iterations);

history_f = zeros(1, max_iterations);

 

% BFGS优化

options = optimset('MaxIter', max_iterations, 'TolFun', tolerance);

[x_opt, f_opt] = fminunc(f, x, options);

 

% 可视化迭代过程

figure;

subplot(2, 1, 1);

plot(1:options.MaxIter, history_x(1, 1:options.MaxIter), '-o', 'LineWidth', 1.5);

hold on;

plot(1:options.MaxIter, history_x(2, 1:options.MaxIter), '-o', 'LineWidth', 1.5);

plot(1:options.MaxIter, history_x(3, 1:options.MaxIter), '-o', 'LineWidth', 1.5);

plot(1:options.MaxIter, history_x(4, 1:options.MaxIter), '-o', 'LineWidth', 1.5);

plot(1:options.MaxIter, history_x(5, 1:options.MaxIter), '-o', 'LineWidth', 1.5);

title('参数迭代过程');

legend('x(1)', 'x(2)', 'x(3)', 'x(4)', 'x(5)');

xlabel('迭代次数');

ylabel('参数值');

 

subplot(2, 1, 2);

plot(1:options.MaxIter, history_f(1:options.MaxIter), '-o', 'LineWidth', 1.5);

title('目标函数值迭代过程');

xlabel('迭代次数');

ylabel('目标函数值');

 

% 显示最终结果

fprintf('最优解: x = [%f, %f, %f, %f, %f]\n', x_opt(1), x_opt(2), x_opt(3), x_opt(4), x_opt(5));

fprintf('f(x)的最优值: %f\n', f_opt);

fprintf('迭代次数: %d\n', options.MaxIter);

 

3. 结果

最优解: x = [0.005613, -0.000559, -0.008426, -0.008428, 0.000000]

f(x)的最优值: 0.000000

迭代次数: 1000‘

 

 

四、心得体会

 

 

在完成这个实验后,我有以下几点心得体会:

理解优化算法的重要性:通过实现牛顿法,我深刻理解了无约束优化问题的解决思路,特别是如何利用Hessian矩阵(牛顿法中的Hesse矩阵)来寻找函数的局部极小值。这不仅加深了我对数学知识的理解,也让我认识到在实际工程问题中优化算法的应用价值。

MATLAB编程实践:在编写和调试MATLAB代码的过程中,我提高了编程技能,学会了如何定义和调用匿名函数、设置迭代条件以及使用optimset函数来定制优化选项。此外,我还学会了如何存储和可视化迭代过程,这对于理解和分析结果非常有帮助。

终止准则的设定:实验中采用的终止准则是当迭代次数达到最大值或目标函数值的改变小于一个很小的阈值时停止。这让我意识到在实际应用中,选择合适的终止准则对于算法的效率和精度至关重要。

对比不同初始点的影响:通过选取与实验二相同的初始点进行比较,我观察到初始条件对算法收敛速度和最终结果的影响。这提醒我在实际问题中需要谨慎选择初始值,以确保算法的稳定性和有效性。

实验报告的撰写:撰写实验报告使我学会了如何系统地整理和呈现实验数据,包括最优解、最优值和迭代次数等关键信息。同时,我也学会了如何分析和解释实验结果,提升了解决问题的逻辑思维能力。

反思与改进:虽然实验成功实现了牛顿法,但看到迭代次数达到了1000次,我意识到可能需要优化算法的收敛性,例如引入线性搜索或者使用拟牛顿法等更高效的变种。这为我未来的学习和研究提供了新的方向。

总的来说,这次实验是一次宝贵的实践学习经验,不仅巩固了理论知识,也提升了我的编程和问题解决能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/44170.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu24.04安装金铲铲之战

结论 使用waydroid方案,可以打开游戏,实际效果后续更新参考 Documentation waydroid_script 注意 waydroid_script需要安装libndk和libhoudini

计组要我命第四天

要命计组(4) 开始时间 2024-06-15 22:02:30 结束时间 2024-06-15 23:38:03 前言:真学不完了,服了,后天考试,mbd不应该昨天晚上去酒吧玩的 总结:主要为完成了画图题和计算题的学习,也学习了一些存储器的基本概念,比如说动态ram和静态ram,还有一些比如…

5.30安卓开发日记47

① 、实现的功能为对错题信息的增删改查 Ⅰ、主页面 Ⅱ、错题录入 Ⅲ、错题查询(可根据题目搜索) Ⅳ、错题修改 Ⅴ、错题删除(选中行后右键选择删除) Ⅵ、显示详细信息

5.26安卓开发日记43

今天对于前端传递到后端的数据,时使用编码后发送的,导致传递到后端后必须得先进行返还原值再使用,对我们测试阶段,就先不使用这种方法, package com.example.pojo; import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor; import java.u…

5.25安卓开发日记42

今天实现类似知网的筛选操作,整体界面类似这种

5.27安卓开发日记44

今天发现拼接后的sql语句 无法实现,就是拼接后的sql语句在控制台可以查找出来结果 在mapper层却查询不到结果,所以我在b站找到了下自己原来学习的视频,进行了复习,我发现在对 sql语句拼接时用的符号也有讲究,其实我可以选择不拼接sql语句,可以传递数组 使用mybatis进行数…

博客公众号管理

1:博客平台评价 1.1:CSDN 广告多,复制之前还要登录,大量无营养价值的转载图文 (油猴插件解决) 。国内引流有一手,要说哪家涨粉快,还得是 CSDN,这都是百度的功劳。 提供下载资源,资源都要 积分/钱/VIP,其实很多人原因花点小钱买资源,但提供积分下载的资源只有用 积分/…

5.16安卓开发日记37

今天实现web课程的作业四