牛顿法(Newton‘s method)求函数极小值

article/2025/9/14 23:04:10

牛顿法一般指牛顿迭代法,也叫做牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),其最初的作用是用来求解函数的零点,但是也可以像梯度下降方法一样,以迭代的形式来求函数的极值。而事实上,牛顿法求零点和极值的思想是一样的,因为函数的极值点对应就是函数的导数的零点(但导数零点有时可能是函数的极大、极小或驻点)。所以牛顿法求函数极小值还是有许多的问题的。

(一)牛顿法求零点。

(1)基本原理

牛顿法的思想就是在函数曲线上初始一个点,做该点的切线与x轴交于x0,然后再过(x0,f(x0))点作函数切线,切线与x轴交下一个点x0......依次迭代,最终x便趋近于零点。公式的推导需要泰勒展开等内容,也并不复杂,兔兔把结论直接写在下面了:

x_{n+1}=x_{n}-\frac{f(x_{n})}{f^{'}(x_{n})}

初始的x0可以随机初始,最终可以收敛到零点的。

(2)算法实现

兔兔这里以函数f(x)=2x^{2}-20在区间[10,10]的零点求解为例。

import numpy as np
import matplotlib.pyplot as plt
def f(x):'''待求解函数'''return 2*x**2-20
def df(x):'''函数导数'''return 4*x
x=np.arange(-10,10,0.1)
y=f(x)
x0=-8 #初始x0
xt=[x0] #记录每次迭代的点x
for i in range(20):x0=x0-f(x0)/df(x0)xt.append(x0)
xt=np.array(xt)
plt.plot(x,y)
plt.scatter(xt,f(xt),color='red')
plt.show()

运行结果如下:

 我们发现,结果可以很快收敛到零点,最终的零点计算得-3.16227766,与实际值-\sqrt {10}很接近了。而且我们还发现,这个函数其实是有两个零点的,而该方法最终只收敛得到一个零点,所以最终结果是严重依赖于初始值x0的选取,如果x0在右侧选取,最终得到的结果就是\sqrt{10}

(二)牛顿法求函数极小值

(1)基本原理

 实质上,兔兔前面提到了,我们最终求的是函数的导数的零点,那么就不一定是极小值,也可能是极大值或驻点。但是在实际问题中,一方面,我们遇到的函数(如构造损失函数)都是类似于抛物线形状,也就是只有下限却没有上限,另一方面,我们需要求解函数的极小值点,所以在这种情况下可以用牛顿法去求极小值点或优化参数等。但是,由于牛顿法迭代最终结果严重依赖初始值的选取,所以该方法往往会收敛到局部最优(或是极小值点),而不是全局最优(或是最大值点)。这些问题也只能用其它的方法来改进了。

回到(一)中(1)的迭代公式,我们这里是求f^{'}(x)的零点,所以可以把f^{'}(x)替换公式中的f(x),最终的迭代公式为:

x_{n+1}=x_{n}-\frac{f^{'}(x_{n})}{f^{''}(x_{n})}

(2)算法实现

兔兔这里还是以上一个函数为例。

import numpy as np
import matplotlib.pyplot as plt
def f(x):'''待求解函数'''return 2*x**2-20
def df(x):'''函数导数'''return 4*x
def ddf(x):'''函数二阶导数'''return 4
x=np.arange(-10,10,0.1)
y=f(x)
x0=-8 #初始x0
xt=[x0] #记录每次迭代的点x
for i in range(20):x0=x0-df(x0)/ddf(x0)xt.append(x0)
xt=np.array(xt)
plt.plot(x,y)
plt.scatter(xt,f(xt),color='red')
plt.show()

兔兔在(一)的基础上稍稍改动了一下代码。运行结果如下:

 我们发现,基本迭代一次就达到极小值点了。

但事实上,在很多时候是很难达到这样的效果的。比如对于sin(x)这样的函数,它可能就随着初始值的不同而可能达到极大或极小值点,有时弄不好会导致二阶导数值为0,从而报错,导致程序无法进行。

(三)总结

牛顿法作为一种迭代方法,虽然有着收敛速度快、算法简便等优点,但是也有很多的问题。所以之后才会有牛顿下山法、拟牛顿法(或共轭方法发)系列、阻尼牛顿法等方法的出现,而且还有多元函数牛顿法等。本文的牛顿法所解决的仅限于一元函数,关于其它的方法兔兔会逐步深入讲解的。

 


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

相关文章

牛顿法(Newton Method)的原理和实现步骤

牛顿法的法的目的 牛顿法不仅可以用来求解函数的极值问题,还可以用来求解方程的根,二者在本质上是一个问题,因为求解函数极值的思路是寻找导数为0的点,这就是求解方程。 牛顿法的法的原理 一元函数的情况 根据一元函数的泰勒展…

牛顿法

《牛顿法》   牛顿法(Newton method)和拟牛顿法(quasi Newton method)是求解无约束最优化问题的常用方法,有收敛速度快的优点。牛顿法是迭代算法,每一步都需求解目标函数的海塞矩阵(Hessian …

使用Andriod Device Moniter时用正则表达式筛选指定日志

有时候我们想过滤出指定的一个或者几个日志,又或者屏蔽掉一些无意义的日志,那么可以创建一个筛选,在此页面的by Log Tag填写如下格式的表达式: 过滤出指定tag的日志信息:^(?:tag1|tag2|tag3) 忽略指定tag的日志信息…

使用Memberane Moniter监控HTTP SOAP requests

Memberane Moniter 使用方法见左侧Documentation 此工具可以监控到每一次发生在指定端口的http请求或者soap请求,如图所示。 但是个人认为仍然有几个问题: 1.不能真正的监控8080端口,我个人认为他的原理是类似于复制了一遍8080端口的内容&am…

linux( sudo bmon ) 流量监控工具----类似于 moniter interface

sudo bmon monitor bandwidth interface eth0 &#xff08;vyos 把 bmon 的linux 改为 了 moniter interface 了&#xff0c;底层还是调用的 bmon&#xff09; Linux:~$ sudo bmon -h bmon 3.5 Copyright (C) 2001-2013 by Thomas Graf <tgrafsuug.ch> Copyright (C) 2…

Android Device Moniter部分问题的解决办法:

一、Android Device Moniter中File explorer显示空白的问题不显示内容&#xff1a; 解决办法&#xff1a; 如上图所示 1.Tools->Android->Enable ADB Integration处于关闭状态。 2.重新打开Android Device Moniter。 3.若还处于空白状态&#xff0c;则极有可能是ja…

操作系统锁的实现方法有哪几种_深入理解多线程(四)——Moniter的实现原理...

本文是《深入理解多线程系列文章》的第四篇。点击查看原文&#xff0c;阅读该系列所有文章。 在深入理解多线程(一)——Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter…

操作系统锁的实现方法有哪几种_深入理解多线程(四)—— Moniter的实现原理

文章来源&#xff1a;深入理解多线程&#xff08;四&#xff09;—— Moniter的实现原理 原文作者&#xff1a;Hollis 来源平台&#xff1a;微信公众号 在深入理解多线程&#xff08;一&#xff09;——Synchronized的实现原理 中介绍过关于Synchronize的实现原理&#xff0c;无…

【深入理解多线程】 Moniter的实现原理(四)

在深入理解多线程&#xff08;一&#xff09;——Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的&#xff0c;那么这篇来介绍下什么…

synchronized实现原理之---Moniter的实现原理

上一篇synchronized的实现原理提到了moniter&#xff0c;当时没有介绍它。 无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的&#xff0c;那么这篇来介绍下什么是Monitor。 操作系统中的管程 如果你在大…

dubbokeeper-moniter部署指南

moniter在整个dubbo架构中的角色: 使用的1.0.1版本: ## 1.0.1版本变动内容 dubbokeeper在1.0.1版本对监控数据存储模块抽离出来&#xff0c;做为单独的应用部署&#xff0c;而不是和1.0.0版本和前端展示集成在一个应用里面在1.0.0版本中暂时提供了mysql以及1.0.0中已有的lucene…

Abaqus2022不能进行多核计算问题以及提交运算moniter不显示信息问题

近期换了新电脑&#xff0c;安装了abaqus2022&#xff0c;但出现了使用多核无法计算的问题&#xff0c;只能使用单核&#xff1b;另外使用单核计算时&#xff0c;moniter中不显示计算的信息&#xff0c;只能看到结果等。 问题如下&#xff1a; 在网上也找了好多的解决方式&…

深入理解多线程(四)— Moniter的实现原理

深入理解多线程&#xff08;四&#xff09;— Moniter的实现原理 在深入理解多线程&#xff08;一&#xff09;—Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、mon…

锁机制初探(五)Moniter的实现原理

在深入理解多线程&#xff08;一&#xff09;——Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的&#xff0c;那么这篇来介绍下什么…

Moniter

了解这个Moniter的实现原理之前&#xff0c;可以说大家已经初步了解了synchronized的底层原理了。无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的。 那我们就简单了解下什么Monitor吧&#xff01;&#…

java什么是monitor和Monitor监视器锁、对象布局

文章目录 Monitor监视器锁什么是moniter对象布局 Monitor监视器锁 每个同步对象都有一个自己的Monitor(监视器锁)&#xff0c;加锁过程如下图所示&#xff1a; 任何一个对象都有一个Monitor与之关联&#xff0c;当且一个Monitor被持有后&#xff0c;它将处于锁定状态。Synchro…

Dense Teacher

“从稀疏到密集”的范式使SSOD的流程复杂化&#xff0c;同时忽略了强大的直接、密集的教师监督 - 最新半监督检测框架 论文地址&#xff1a;https://arxiv.org/pdf/2207.05536.pdf Mean-Teacher (MT) 方案在半监督目标检测 (SSOD) 中被广泛采用。在MT中&#xff0c;由教师的最…

Sequential模型、Flatten层、Dense层

Sequential模型 顺序模型 核心操作是添加layers,有两种方法 第一种:通过add()添加 model Sequential() model.add(tf.keras.layers.Dense(10,input_shape(1,)&#xff0c;activationrelu))#10表示输出数据的维度&#xff0c;后面表示输入的形状,激活函数为relu model.add(tf…

【Python-Keras】keras.layers.Dense层的解析与使用

1 Dense解析 keras.layers.Dense(units, activationNone, use_biasTrue, kernel_initializerglorot_uniform, bias_initializerzeros, kernel_regularizerNone, bias_regularizerNone, activity_regularizerNone, kernel_constraintNone, bias_constraintNone)实现神经网络里的…

tf.layers.dense()的用法

dense &#xff1a;全连接层 相当于添加一个层 函数如下&#xff1a; tf.layers.dense( inputs, units, activationNone, use_biasTrue, kernel_initializerNone, ##卷积核的初始化器 bias_initializertf.zeros_initializer(), ##偏置项的初始化器&#xff0c;默认初始化为…