最速下降法python_算法最优化之最速下降法

article/2025/9/14 4:34:10

适应范围:无约束非线性规划问题

例子:

equation?tex=min+f%28x%29%3D2x_1%5E2%2Bx_2%5E2

初始化

equation?tex=x%5E%7B%281%29%7D%3D%281%2C1%29%5ET ,

equation?tex=%5Cvarepsilon%3D%5Cfrac%7B1%7D%7B10%7D%3D0.1

第一次迭代:

equation?tex=%5Cnabla+f%28x%29%3D4x_1%2B2x_2%3D%5Cbegin%7Bbmatrix%7D+4x_1+%5C%5C+2x_%7B2%7D+%5Cend%7Bbmatrix%7D

equation?tex=d%5E%7B%281%29%7D%3D%5Cnabla+f%28x%5E%7B%281%29%7D%29%3D%5Cbegin%7Bbmatrix%7D-4%5C%5C-2%5Cend%7Bbmatrix%7D

equation?tex=%7C%7Cd%7C%7C%3D%5Csqrt%7B16%2B4%7D%3D2%5Csqrt%7B5%7D%3E%5Cfrac%7B1%7D%7B10%7D%3D%5Cvarepsilon

equation?tex=x%5E%7B%281%29%7D%3D%281%2C1%29%5ET 出发,沿方向

equation?tex=d%5E%7B%281%29%7D 进行一维搜索,求步长

equation?tex=%5Clambda_1 ,即

equation?tex=%5Cmin_%7B%5Clambda%3E%3D0%7D%5Cvarphi%28%5Clambda%29%3Df%28x%5E%7B%281%29%7D%2B%5Clambda+d%5E%7B%281%29%7D%29

equation?tex=x%5E%7B%281%29%7D%2B%5Clambda+d%5E%7B%281%29%7D%3D%5Cbegin%7Bbmatrix%7D1%5C%5C1%5Cend%7Bbmatrix%7D%2B%5Clambda%5Cbegin%7Bbmatrix%7D-4%5C%5C-2%5Cend%7Bbmatrix%7D%3D%5Cbegin%7Bbmatrix%7D1-4%5Clambda%5C%5C1-2%5Clambda%5Cend%7Bbmatrix%7D

equation?tex=%5Cvarphi%28%5Clambda%29%3D2%281-4%5Clambda%29%5E2%2B%281-2%5Clambda%29%5E2

equation?tex=%5Cvarphi%5E%7B%27%7D%28%5Clambda%29%3D-16%281-4%5Clambda%29-4%281-2%5Clambda%29%3D0

equation?tex=%5Clambda_1%3D%5Cfrac%7B5%7D%7B18%7D

在直线的极小点

equation?tex=x%5E%7B%282%29%7D%3Dx%5E%7B%281%29%7D%2B%5Clambda+d%5E%7B%281%29%7D%3D%5Cbegin%7Bbmatrix%7D-%5Cfrac%7B1%7D%7B9%7D%5C%5C-%5Cfrac%7B4%7D%7B9%7D%5Cend%7Bbmatrix%7D

第二次迭代:

equation?tex=d%5E%7B%282%29%7D%3D-%5Cnabla+f%28x%5E%7B%282%29%7D%29%3D%5Cbegin%7Bbmatrix%7D-%5Cfrac%7B4%7D%7B9%7D%5C%5C%5Cfrac%7B8%7D%7B9%7D%5Cend%7Bbmatrix%7D

equation?tex=%7C%7Cd%7C%7C%3D%5Csqrt%7B%5Cfrac%7B16%7D%7B81%7D%2B%5Cfrac%7B61%7D%7B81%7D%7D%3D%5Cfrac%7B%5Csqrt%7B77%7D%7D%7B9%7D%3E%5Cfrac%7B1%7D%7B10%7D%3D%5Cvarepsilon

equation?tex=x%5E%7B%282%29%7D%3D%28-%5Cfrac%7B1%7D%7B9%7D%2C%5Cfrac%7B4%7D%7B9%7D%29%5ET 出发,沿方向

equation?tex=d%5E%7B%282%29%7D 进行一维搜索,求步长

equation?tex=%5Clambda_2

equation?tex=%5Cmin_%7B%5Clambda%3E%3D0%7D%5Cvarphi%28%5Clambda%29%3Df%28x%5E%7B%282%29%7D%2B%5Clambda+d%5E%7B%282%29%7D%29

equation?tex=x%5E%7B%282%29%7D%2B%5Clambda+d%5E%7B%282%29%7D%3D%5Cbegin%7Bbmatrix%7D-%5Cfrac%7B1%7D%7B9%7D%5C%5C%5Cfrac%7B4%7D%7B9%7D%5Cend%7Bbmatrix%7D%2B%5Clambda+%5Cbegin%7Bbmatrix%7D-%5Cfrac%7B4%7D%7B9%7D%5C%5C%5Cfrac%7B8%7D%7B9%7D%5Cend%7Bbmatrix%7D%3D%5Cbegin%7Bbmatrix%7D-%5Cfrac%7B1%7D%7B9%7D-%5Clambda+%5Cfrac%7B4%7D%7B9%7D%5C%5C%5Cfrac%7B4%7D%7B9%7D%2B%5Clambda+%5Cfrac%7B8%7D%7B9%7D%5Cend%7Bbmatrix%7D

equation?tex=%5Cvarphi%28%5Clambda%29%3D2%28-%5Cfrac%7B1%7D%7B9%7D-%5Clambda%5Cfrac%7B4%7D%7B9%7D%29%5E2%2B%28%5Cfrac%7B4%7D%7B9%7D%2B%5Clambda%5Cfrac%7B8%7D%7B9%7D%29%5E2

equation?tex=%5Cvarphi%5E%7B%27%7D%28%5Clambda%29%3D-%5Cfrac%7B16%7D%7B9%7D%28-%5Cfrac%7B1%7D%7B9%7D-%5Clambda%5Cfrac%7B4%7D%7B9%7D%29%2B%5Cfrac%7B16%7D%7B9%7D%28%5Cfrac%7B4%7D%7B9%7D%2B%5Clambda%5Cfrac%7B8%7D%7B9%7D%29%3D0

解得:

equation?tex=%5Clambda_2%3D-%5Cfrac%7B27%7D%7B92%7D

equation?tex=x%5E%7B%283%29%7D%3Dx%5E%7B%282%29%7D%2B%5Clambda+d%5E%7B%282%29%7D%3D%5Cbegin%7Bbmatrix%7D-%5Cfrac%7B65%7D%7B207%7D%5C%5C%5Cfrac%7B130%7D%7B207%7D%5Cend%7Bbmatrix%7D

第三次迭代:

equation?tex=d%5E%7B%283%29%7D%3D-%5Cnabla+f%28x%5E%7B%283%29%7D%29%3D%5Cbegin%7Bbmatrix%7D%5Cfrac%7B260%7D%7B207%7D%5C%5C-%5Cfrac%7B260%7D%7B207%7D%5Cend%7Bbmatrix%7D

equation?tex=%7C%7Cd%7C%7C%3D%5Csqrt%7B2%7D%5Cfrac%7B260%7D%7B207%7D%3D1.776%3E%5Cfrac%7B1%7D%7B10%7D

最终结果展示:使用python实现结果

实现代码展示:

import random

import numpy as np

import matplotlib.pyplot as plt

"""

最速下降法

Rosenbrock函数

函数 f(x) = 2*x(1)^2+x(2)^2

梯度 g(x)=(4*x(1)),2*x(2))^(T)

"""

def goldsteinsearch(f,df,d,x,alpham,rho,t):

'''

线性搜索子函数

数f,导数df,当前迭代点x和当前搜索方向d

'''

flag = 0

a = 0

b = alpham

fk = f(x)

gk = df(x)

phi0 = fk

dphi0 = np.dot(gk, d)

# print(dphi0)

alpha=b*random.uniform(0,1)

while(flag==0):

newfk = f(x + alpha * d)

phi = newfk

# print(phi,phi0,rho,alpha ,dphi0)

if (phi - phi0 )<= (rho * alpha * dphi0):

if (phi - phi0) >= ((1 - rho) * alpha * dphi0):

flag = 1

else:

a = alpha

b = b

if (b < alpham):

alpha = (a + b) / 2

else:

alpha = t * alpha

else:

a = a

b = alpha

alpha = (a + b) / 2

return alpha

def rosenbrock(x):

# 函数:f(x) = 2*x(1)^2+x(2)^2

return 2*x[0]**2+x[1]**2

def jacobian(x):

# 梯度 g(x)=(4*x(1)),2*x(2))^(T)

return np.array([4*x[0],2*x[1]])

def steepest(x0):

print('初始点为:')

print(x0,'\n')

imax = 20000

W = np.zeros((2, imax))

epo=np.zeros((2, imax))

W[:, 0] = x0

i = 1

x = x0

grad = jacobian(x)

delta = sum(grad ** 2) # 初始误差

f=open("最速.txt",'w')

while i < imax and delta > 10 ** (-5):

p = -jacobian(x)

x0 = x

alpha = goldsteinsearch(rosenbrock, jacobian, p, x, 1, 0.1, 2)

x = x + alpha * p

W[:, i] = x

epo[:,i] =np.array((i,delta))

f.write(str(i)+" "+str(delta)+"\n")#

print(i,np.array((i,delta)))

grad = jacobian(x)

delta = sum(grad ** 2)

i = i + 1

print("迭代次数为:", i)

print("近似最优解为:")

print(x, '\n')

W = W[:, 0:i] # 记录迭代点

return [W,epo]

if __name__=="__main__":

X1 = np.arange(-1.5, 1.5 + 0.05, 0.05)

X2 = np.arange(-3.5, 4 + 0.05, 0.05)

[x1, x2] = np.meshgrid(X1, X2)

f = 2*x1**2+x2**2

plt.contour(x1, x2, f, 20) # 画出函数的20条轮廓线

x0 = np.array([1, 1])

list_out = steepest(x0)

W=list_out[0]

epo=list_out[1]

plt.plot(W[0, :], W[1, :], 'g*-') # 画出迭代点收敛的轨迹

plt.show()

参考文献:最速下降法(梯度下降法)python实现_码神岛​msd.misuland.com0dcac61b3ea9b8f72a78577e7b4029fb.png


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

相关文章

最速梯度下降法及matlab实践,最速下降法以及代码实现

由于最近复习最优化考试,为了防止考完即忘,这里做个笔记用于备忘,本文讲解一下无约束优化问题中的最速下降法。 一、解决的问题 最速梯度下降法解决的问题是无约束优化问题,而所谓的无约束优化问题就是对目标函数的求解,没有任何的约束限制的优化问题,比如求下方最小值:…

运筹学(1)-最速下降法

运筹学&#xff08;1&#xff09; 多维无约束优化算法——梯度法之最速下降法 最近学习运筹学开始学习一些优化的算法&#xff0c;之后的一系列博客我会分享一些我学到的运筹学方法。这次我总结了我学习的最速下降法。 1. 原理 最速下降法是一个优化算法&#xff0c;用于求…

SSM 三大框架

文章目录 一、SpringMVC- 1.SpringMVC(Spring Model View Controller) 框架介绍- - 1.概述- - 2.MVC模型- - 3.工作原理 - 2.创建Module- 3.入门案例&#xff1a;展示汽车数据需求创建Maven module创建RunApp.javaCar.javaCarController.java测试 - 4.处理请求参数- - 1.概述- …

SSH三大框架整合

文章目录 一. SSH 简单的回顾1. Hibernate框架2. Struts2框架3. Spring框架 二. ssh整合思想三. 整合struts2和spring框架&#xff08;把struts2的action交给spring管理&#xff09;1. 导入相关jar包2. 创建action3. 创建struts2核心配置文件&#xff0c;配置action(1). 位置在…

三大框架的基础知识

三大框架的基础知识 1&#xff0c;hibernate的工作原理及为什么要用&#xff1f; &#xff08;1&#xff09;通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件&#xff1b; &#xff08;2&#xff09;由 hibernate.cfg.xml读取并解析映射信息&#xff1b…

三大前端框架

互联网发展速度是非常快的&#xff0c;程序员用的前端框架也在不断的迭代和变化&#xff0c;以前大家常用的是JQuery、Bootstrap框架&#xff0c; 现在形成React、Vue、Angular三大主流框架&#xff0c;这三个框架各有各的优势&#xff0c;而且较为成熟 01、React React框架是起…

前端三大主流框架的区别(三)

前面两篇已经做了细致的分析&#xff0c;这一篇就总结总结三大主流框架吧 1.angular 1.1. 简介: angular是最早出现的框架&#xff0c; angularjs是通过directive&#xff08;指令&#xff09;去封装组件&#xff0c;react和vue是通过component。 1.2. 优点&#xff1a; 1、…

三大框架-Spring

一 .概述 spring框架是以一个分层架构,有七个定义良好的模块组成,Spring模块构建在核心容器之上,核心容器定义了创建,配置和管理bean方式: 1.Spring Core:核心容器 ,提供Spring的基本功能. 2.SPring Contest:Spring上下文,是一个配置文件 3.Spring AOP : Spring 中面向切面…

JAVA的三大框架是什么?

Java自1995年发布以来&#xff0c;凭借着其跨平台、面向对象、泛型编程的特性发展至今可以说无Java不大厂。目前国内所有的大厂或多或少都在使用Java进行后端服务开发。 一、Java开发的三大框架 在14年以前&#xff0c;行业内用得最多的Java三大框架是Struts、Spring和Hiberna…

SSM三大框架Spring

一、三大框架基本结构 1.为什么需要框架 说明: 如果生产环境下的项目,都是从头(从底层写起)开发,难度太大了,并且开发的效率极其低下. 所以为了让项目快速的上线部署. 将某些特定的功能.进行了高级的封装. 那么我们如果需要使用封装后的API.,则必须按照人家的要求编码 2.框架…

外键的设置

关键词&#xff1a;外键 | 索引 | InNoDB和MyISAM | 引用 | Mysql 设置外键的目的&#xff1a;保证数据的一致性&#xff01; 一、外键的使用条件&#xff1a; ① 两个表必须是InnoDB表&#xff0c;MyISAM表暂时不支持外键 #查看表类型SHOW TABLE STATUS#查询结果的Engine字…

外键(FOREIGN KEY)

引子&#xff1a;把所有数据都存放于一张表的弊端 1、表的组织结构复杂不清晰 2、浪费空间 3、扩展性极差 为了解决上述的问题&#xff0c;就需要用多张表来存放数据。 表与表的记录之间存在着三种关系&#xff1a;一对多、多对多、一对一的关系。 处理表之间关系问题就会…

什么是外键? 为什么需要外键?怎么使用外键?

首先我们先思考一个问题&#xff1a; 如何将京东"fuliuqingfeng"的用户信息及其多个邮寄商品地址保存到数据库中? 我们第一步会这样操作实现&#xff1a; create table user_info(id char(36) primary key,user_name varchar(30) not null,password varchar(30) …

MySQL外键(详解)

MySQL外键&#xff08;详解&#xff09; 什么是外键&#xff1a;    外键是指引用另外一个表中的一列或多列数据&#xff0c;被引用的列应该具有主键约束或者唯一性约束&#xff08;简单来说外键是另一个表的主键或者唯一约束&#xff09;。外键可以有重复的, 可以是空值&…

C/C++unlink函数的使用

一、头文件 #include<unistd.h> 二、函数原型 int unlink(const char *pathname); 三、函数介绍 unlink()函数功能即为删除文件。执行unlink()函数会删除所给参数指定的文件。 注意&#xff1a; 执行unlink()函数并不一定会真正的删除文件&#xff0c;它先会检查文件…

Linux下unlink函数的使用

一、头文件 #include<unistd.h> 二、函数原型 int unlink(const char *pathname); 三、函数介绍 unlink()函数功能即为删除文件。执行unlink()函数会删除所给参数指定的文件。 注意&#xff1a; 执行unlink()函数并不一定会真正的删除文件&#xff0c;它先会检查文件系…

Universal link的坑

当你觉得Universal link所有配置都没问题&#xff0c;但是通过浏览器打开Universal Link没有命中的时候看下这里 看了很多篇文章对比了Universal Link配置和流程之后没问题&#xff0c;浏览器打开还是不生效&#xff0c;最终在最关键的配置apple-app-site-association文件破案了…

unlink 和 remove 的区别

Linux下开发的时候,会经常使用unlink来删除文件的,而用C的时候,经常用remove删除文件. 这两者的去区别通过man手册发现&#xff1a;  当remove() 中的pahtname指定为目录时,相当于调用rmdir 删除目录,当remove() 中的pathname指定问文件时,相当于调用unlink 删除文件链接 所以…

004link()unlink()_LINUX

Linux的学习笔记 link、unlink1. 共享盘块2. link() 为已经存在的文件创建目录项&#xff08;硬链接&#xff09;头文件包含和函数声明 3. unlink() 删除一个文件的目录项头文件包含和函数声明Linux下删除文件的机制&#xff1a;demo 4. unlink 使用注意及隐性回收demo4.1 编译…

CTF PWN之heap入门 unlink

环境 ubuntu20 pwndbg patchelf glibc-all-in-one 为什么要用ubuntu不用kali&#xff0c;这里不做解释&#xff0c;总之就是自己在搭环境时出现了各种问题&#xff0c;但用ubuntu20不会出现&#xff0c; pwndbg&#xff0c;打pwn题必备&#xff0c;具体安装过程见gdb与ped…