拟牛顿法及其matlab实现

article/2025/8/26 17:58:31

目录

一.前言

二.拟牛顿法的基本思想

三.秩1矫正Hk公式

四.算法步骤

 五.代码实现

1.秩1矫正算法

2.目标函数

3.目标函数梯度

4.主函数

六.仿真结果与分析


一.前言

   上上上篇文章介绍了牛顿法和修正牛顿法。想看的话可以往后翻。牛顿法有二阶的收敛速度,但Hess阵必须要正定,因为只有正定才能保证它的下降方向是正确的。虽然修正牛顿法克服了这个缺点,但是它的修正参数uk的选取很难,选得太大太小都会影响到算法的收敛速度。最重要的是,这两种方法都要用到Hess阵,计算量很大,所以都不实用。本文介绍的拟牛顿法很好的克服了这些缺点。

二.拟牛顿法的基本思想

   拟牛顿法的基本思想是把牛顿法中用到的Hess阵用一个Hk矩阵来代替。那么Hk是什么呢?Hk的三个特点如下:

(1)Hk近似等于牛顿法中的Hess阵,这样可以保证拟牛顿发所产生的方向与牛顿反向近似,从而保证了拟牛顿法的收敛速度。

(2)Hk是正定的

(3)Hk的更新规则有两种,即用秩1或秩2的矩阵矫正。这篇文章介绍的是秩1算法,秩2算法下篇文章再写吧。(秩1秩2法其实就是两个更新Hk的不同公式,应该是记住就行了吧,反正推导我也看不懂)

三.秩1矫正Hk公式

   在做matlab仿真时,H0通常用一个单位矩阵来代替。经过一次迭代后,Hk的秩1矫正公式如下:

H^{_{k+1}}=H_{k}+\frac{(S_{k }-H_{k}y_{k})(S_{k }-H_{k}y_{k})'}{(S_{k}-H_{k}y_{k})'y_{k}}

其中Sk=Xk+1-Xk(就是本次的迭代点减去上一个迭代点),yk=gk+1-gk(就是本次的梯度值减去上一次的梯度值)

四.算法步骤

步0:确定终止误差e=(0~1),设初始点x0,\delta=(0~1),\sigma=(0,0.5),初始对称正定阵H0=I(单位阵),令k=0 

步1:计算gk=\bigtriangledownf(xk).若||gk||<=e,停算,输出xk作为最优解。否则,转步2

 步2:计算搜索方向:dk=-Hk*gk

步3:用Armjio搜索技术求步长\alphak=\delta^mk,m的值从0开始

若f(xk+\delta ^m*dk)<=f(xk)+\alpha*\delta^m*gk'dk 

则 mk=m,步长\alphak=\delta^mk,若不满足上式,则m=m+1,直到满足上述不等式为止 

步4:令Xk+1=xk+ \alphak*dk,由矫正公式来确定Hk+1

H^{_{k+1}}=H_{k}+\frac{(S_{k }-H_{k}y_{k})(S_{k }-H_{k}y_{k})'}{(S_{k}-H_{k}y_{k})'y_{k}}

步5:k=k+1,转步1

 五.代码实现

1.秩1矫正算法

function [x,val,k]=sr1(fun,gfun,x0)
%功能:用秩1拟牛顿法求无约束问题 mini f(x)
%输入:fun,gfun分别是目标函数和梯度,x0是初始点
%输出:x,val分别是近似最优点和最优值,k表示迭代次数
k=0;
maxk=500;
rho=0.55;
sigma=0.4;
e=1e-5;%精度
n=length(x0);
Hk=eye(n);
while(k<maxk)gk=feval(gfun,x0);dk=-Hk*gk;if(norm(gk)<=e),break;end
m=0;
mk=0;
while(m<20)if(feval(fun,x0+rho^m*dk)<feval(fun,x0)+sigma*rho^m*gk'*dk)mk=m;break;endm=m+1;end
x=x0+dk*rho^mk;
sk=x-x0;
yk=feval(gfun,x)-gk;
Hk=Hk+(sk-Hk*yk)*(sk-Hk*yk)'/((sk-Hk*yk)'*yk);
k=k+1;
x0=x;
end
x0=x;
val=feval(fun,x0);
end

2.目标函数

function f= fun(x)
%目标函数
f=100*(x(1)^2-x(2))^2+(x(1)-1)^2;
end

3.目标函数梯度

function  g=gfun(x)
%目标函数的梯度
g=[400*x(1)*(x(1)^2-x(2))+2*(x(1)-1),-200*(x(1)^2-x(2))]';
end

4.主函数

%这个问题的精确值是x=(1,1)',f(x)=0;
clear all
clc
x0=[-1.2,1]';
[x,val,k]=sr1('fun','gfun',x0);
disp('迭代次数:k=')
disp(k)
disp(['最优解:x = '])
disp(x)
disp(['此时: f(x) = ',num2str(val)]) 

六.仿真结果与分析


http://chatgpt.dhexx.cn/article/piMkvRHw.shtml

相关文章

InnoDB数据库死锁

目录 场景描述问题分析解决方法延伸&#xff1a;数据库死锁数据库死锁例子 正文 回到顶部 场景描述 在update表的时候出现DeadlockLoserDataAccessException异常 (Deadlock found when trying to get lock; try restarting transaction...)。 回到顶部 问题分析 这个异常并不会…

mysql数据库死锁原因分析

一、死锁模拟复现 1、当前自己电脑的mysql版本8.0.22 2、数据库的隔离级别--可重复读&#xff08;默认隔离级别&#xff09; 3、自动提交关闭 4、表结构&#xff0c;age为非唯一索引&#xff0c;对下面整个案例非常重要 5、 1、事务A执行更新操作&#xff0c;更新成功 2、事务…

处理数据库死锁问题

在实际的项目环境中碰到了如下的问题 Microsoft.Data.SqlClient.SqlException (0x80131904): 事务(进程 ID 98)与另一个进程被死锁在 锁 资源上&#xff0c;并且已被选作死锁牺牲品。请重新运行该事务。 怀疑是因为数据库查询和修改中产生的死锁问题&#xff0c;造成的上述原因…

数据库死锁:原因和解决办法

理解数据库中的死锁 在数据库的上下文中&#xff0c;死锁是指两个或多个事务无法进行的情况&#xff0c;因为每个事务都在等待另一个事务释放资源。这可以类比为事务的循环链&#xff0c;每个事务都在等待链中的下一个事务释放资源。以下是一个死锁场景的视觉表示&#xff1a;…

Java面试必问:死锁(多线程死锁+数据库死锁)

死锁 接下来从几个方面介绍&#xff1a; 多线程死锁多线程死锁解决办法数据库死锁数据库死锁解决办法 多线程死锁是怎么造成的&#xff1f; 多线程锁定同一资源会造成死锁线程池中的任务使用当前线程池也可能出现死锁 参考连接&#xff1a; https://blog.csdn.net/qq_3506…

MySQL数据库死锁了,该怎么办?一文全解最新教程

文章目录 正文死锁的发生为什么会产生死锁&#xff1f;Insert 语句是怎么加行级锁的&#xff1f;1、记录之间加有间隙锁2、遇到唯一键冲突 如何避免死锁&#xff1f; 之前分享过 MySQL 死锁的文章&#xff0c;然后很多读者对「插入意向锁」认识很迷糊。 大家误以为「插入意向锁…

5 分钟理解数据库死锁

图片来源&#xff1a;网络 文章目录 死锁是如何产生的&#xff1f;如何解决并避免死锁总结 &#x1f37a;知人者智&#xff0c;自知者明。胜人者有力&#xff0c;胜己者强。知足者富&#xff0c;强行者有志。不失其所者久&#xff0c;死而不亡者寿。——老子 大家好&#xff01…

数据库死锁场景

场景一&#xff1a; 单一线程多次进入子事务发生死锁 问题&#xff1a; 线上问题发生了死锁&#xff0c;但通过死锁日志发现一直在等待查询结果。我们使用的数据库是PGsql&#xff0c;默认的隔离级别是“读已提交”&#xff0c;按理来说查询不会加锁&#xff0c;导致一度被带偏…

数据库常见死锁原因及处理

目录 前言什么是死锁死锁产生的四个必要条件 1. 表锁死锁死锁场景解决方案建议 2. 行锁死锁2.1 两个事务分别想拿到对方持有的锁&#xff0c;互相等待&#xff0c;于是产生死锁死锁场景解决方案 2.2 共享锁转换为排他锁死锁场景解决方案 3. INSERT ... ON DUPLICATE KEY UPDATE…

数据库死锁分析与解决

一、死锁的表现 1、错误信息是:事务(进程 ID)与另一个进程被死锁在 锁 资源上&#xff0c;并且已被选作死锁牺牲品。请重新运行该事务。 2、错误信息是:事务(进程 ID )与另一个进程被死锁在 锁 | 通信缓冲区 资源上&#xff0c;并且已被选作死锁牺牲品。请重新运行该事务。 二、…

数字 IC 技能拓展(1)Xilinx_Vivado_SDK_2019.1 安装详细教程

引言 工欲善其事必先利其器&#xff0c;而君之“器”尚无&#xff0c;就更别谈“事”了。赶紧&#xff01;我们需要下载并安装一个 Xilinx Vivado 软件&#xff01;&#xff01;接下来就飞速地开始我们的 Xilinx_Vivado_SDK_2019.1 详细安装教程&#xff01;&#xff01;&#…

win10安装vivado + vitis 2019.2 教程

win10安装vivado vitis 2019.2 教程 安装包&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1fPlNDzpC0EPXMhOloDyzfA 提取码&#xff1a;1234 网上其他博主的安装教程&#xff0c;比如&#xff1a;vivado2019.2的安装&#xff0c;最后是没有安装上vitis PS端开发软件…

vivado入门教程

vivado入门教程 基本步骤例程实现 第一次写博客&#xff0c;也是第一次使用vivado&#xff0c;自己也在学习之中&#xff0c;欢迎大家的评论啊&#xff01; 基本步骤 一、新建工程 二、选择工程路径及命名 三、一路next到下图&#xff0c;确定芯片的型号 四、添加源文件 五…

手把手教你安装vivado2015.4开发环境

//vivado2015.4安装教程 //作者&#xff1a;紫菜蛋花汤 //时间&#xff1a;2018.7.8 //版本&#xff1a;V1 准备工作&#xff1a; 1.vivado2015.4安装包 官方下载压缩包文件名&#xff1a;Xilinx_Vivado_SDK_2015.4_1118_2.tar 个人百度云连接&#xff1a;https://pan.ba…

Vivado 2015.4 安装教程(含license)

首先先下载vivado2015.4的压缩文件&#xff0c;可以从网盘里下载&#xff1a; 百度网盘链接&#xff1a;点击链接 下载后解压&#xff1a; 点击xsetup.exe文件 点击Next 点击Next 一定要选择第一个Vivado HL WebPack&#xff0c;不要像图中那样选择第三个&#xff0c;因为第一…

vivado 2017.4安装步骤

目录&#xff1a;windows安装vivado2017.4&#xff1b;虚拟机ubuntu安装vivado 2017.4&#xff1b;ios安装vivado。 一&#xff0c;windows安装vivado2017.4 xilinx官网下载地址为&#xff1a;https://www.xilinx.com/support/download.html 下载完解压后&#xff0c;如图所示…

vivado2019.2安装+license添加教程

vivado2019.2安装license添加教程 注意&#xff1a; 1.电脑的账户名字一定是英文&#xff1b; 2.压缩文件夹有30个G&#xff0c;安装后会更大&#xff0c;需要预留足够的空间。 1.资源链接 百度网盘: https://pan.baidu.com/s/1xEuB-vzoXWpj40fd1wAEFg 密码&#xff1a;tkk1…

[Software]Vivado 2018.2 安装及激活教程

一、安装 1、 解压文件 注&#xff1a;要将压缩文件解压至无中文的路径中。 2、 双击“xsetup.exe”文件&#xff0c;开始安装 3、 不选择新版本&#xff0c;选择继续安装此版本 4、 点击“Next”出现协议&#xff0c;在“I Agree”前都打勾 5、 版本选择&#xff0c;用户可以…

Vivado的下载和安装

本文是自己在安装和使用vivado的一个简单记录。 在安装之前进入官网下载好自己需要版本的安装包&#xff0c;软件安装包比较大&#xff0c;需要花费比较长的一段时间。 vivado官网下载地址 &#xff1a;下载地址 安装好软件后需要使用到license文件&#xff0c;可以去官网申…

Vivado2021.2版本安装教程

Vivado2021.2版本安装教程 2021.2版本提取链接&#xff1a;https://pan.baidu.com/s/12P7twkEVErKmqTmkhTnvMg 提取码&#xff1a;2hyr。 第一步&#xff1a;首先打开解压好的软件&#xff0c;找到xsetup.exe,然后管理员模式运行&#xff0c;出现以下界面&#xff0c;点击Next。…