用牛顿法求函数极小值,python求函数极大值
介绍
我们初中学过一元二次函数。解题时引入了求根公式,代入公式可以得到不同的根。想计算一个高阶方程的解,可以推导出求根的公式吗?
在群论中,伽罗瓦证明了五次以上的多项式方程没有给出根公式,但在行星轨道计算等科学研究中,确实需要求解高阶方程。由于我们得不到一个明确的求根公式,所以可以用迭代法逼近真解。
多项式方程的求解问题,其实可以看成是求函数的极值,如果我们是对的。
解决的办法是获得居民,并定居下来。
可以计算出函数的极值。显然,低阶方程的解可以用求根公式精确计算。
但是求解高次方程,就要用近似的思路,比如梯度下降法、最速下降法、彗发睫毛膏法等。本文主要讨论如何利用coma睫毛膏法和python求一元函数和多元函数的极值。
2.彗发睫毛膏法的基本原理
2.1.一元功能睫毛膏方法
功能时间
是一元函数,可以用鸡鸭公式的二次近似得到。
一元函数极值的条件是
分别导出两端(下面公式的等号写成等号)。
做完后,拿出来
的迭代公式
然后写出迭代关系,得到
因为彗形睫毛膏法的迭代关系是基于导数图像中需要求极值函数的点的斜率进行迭代的,所以没有步长的概念,能得到极值的点只取决于迭代的步数。相应地,迭代次数越多,越接近极值点。
上面介绍完抽象表达式,我们再来看这样一个小例子。该函数是已知的
如果没有其他限制,那就去了解一下。
的极值。
在用彗发睫毛膏法计算极值之前,先用软件画出来。
图像,用肉眼粗略观察极值在哪里,有助于在后续计算中验证是否正确。
image.png
首先,你需要给出初始值。
这是迭代开始的地方;
然后,计算初始位置的第一微分值和第二微分值,
和
;
然后,代入迭代公式。
;
最后,获得第一次迭代的值。
重复上述两个步骤以获得
在,
停止条件是重复步骤的设定次数。
2.2.一元函数coma睫毛膏方法的python程序
来自sympy import *
# step是重复步数,x0是初始位置,obj是需要极值的函数。
DefNewtons(step,x0,obj):
I=1 #记录迭代次数的变量
X0=float(x0) #浮点数的计算速度更快。
Obj_Deri=diff(obj,x)定义对应于上述表达式的一阶导数。
Obj_sec_Deri=diff(obj,x,2) #定义对应于上述公式的二次导数
同时I=步骤:
如果i==1:
#第一次迭代的更新表达式
xnew=x0-(obj_Deri.subs(x,x0 )/obj_sec_deri.subs(x ) x,x0))
Print(迭代%d: %.5f)% (I,xnew))))))))))。
i=i 1
否则:
#后续迭代更新表达式
xnew=xnew-(obj_Deri.subs(x,xnew )/obj_sec_deri.subs(x ) x,xnew))
Print(迭代%d: %.5f)% (I,xnew))))))))))。
i=i 1
返回xnew
X=symbols(x)) x是一个字符变量。
结果=牛顿(50,10,x**6 x))
Print(最佳迭代位置:% . 5f“%结果”)))))))))。
执行程序的结果如下。
第一次迭代:8.00000
第二次迭代:6.39999
第三次重复:5.11997
第四次迭代:4.09593
第五次迭代:3.27662
第六次迭代:
2.62101
第7次迭代:2.09610
第8次迭代:1.67515
第9次迭代:1.33589
第10次迭代:1.05825
第11次迭代:0.82002
第12次迭代:0.58229
第13次迭代:0.17590
第14次迭代:-34.68063
第15次迭代:-27.74450
第16次迭代:-22.19560
第17次迭代:-17.75648
第18次迭代:-14.20519
第19次迭代:-11.36415
第20次迭代:-9.09132
第21次迭代:-7.27306
第22次迭代:-5.81846
第23次迭代:-4.65480
第24次迭代:-3.72391
第25次迭代:-2.97930
第26次迭代:-2.38386
第27次迭代:-1.90812
第28次迭代:-1.52901
第29次迭代:-1.22931
第30次迭代:-0.99804
第31次迭代:-0.83203
第32次迭代:-0.73518
第33次迭代:-0.70225
第34次迭代:-0.69886
第35次迭代:-0.69883
第36次迭代:-0.69883
第37次迭代:-0.69883
第38次迭代:-0.69883
第39次迭代:-0.69883
第40次迭代:-0.69883
第41次迭代:-0.69883
第42次迭代:-0.69883
第43次迭代:-0.69883
第44次迭代:-0.69883
第45次迭代:-0.69883
第46次迭代:-0.69883
第47次迭代:-0.69883
第48次迭代:-0.69883
第49次迭代:-0.69883
第50次迭代:-0.69883
迭代的最佳位置:-0.69883
进程结束,退出代码为0
函数的极值点为-0.69883,与我们之前画的图的观测值一致。
2.3.多种功能昏睡的睫毛膏方法
用昏昏欲睡的睫毛膏法求多元函数极值的思路,还是用别致的小鸭公式近似展开,但是这里
以向量的形式,假设
是一个二元函数:
求上式两边的梯度使其等于零,然后整理得到迭代公式(因为涉及矩阵求导等一系列复杂运算,这里可以理解为):
在上面的第一个公式中
表示在
该点的梯度值,
点的二阶次也可以写成Hessian矩阵,利用Hessian矩阵的逆和梯度值确定迭代公式。
2.3.python程序实现睫毛膏的多功能昏睡方法
来自sympy import *
将numpy作为np导入
#假设多元函数是二维形式
# x_init是一个二维向量(x1,x2)
def newton_dou(step,x_init,obj):
I=1 #记录迭代次数的变量
同时i=步骤:
如果i==1:
grandient _ obj=NP . array([diff(obj,x1)。subs (x1,x _ init [0])。subs (x2,x _ init [1]),diff (obj,x2)。subs (x1,x _ init [0])
Hessian _ obj=np.array ([diff (obj,x1,2),diff (obj,x1,x2)],[diff (diff (obj,x2),x1),diff (obj,x2,2)]),DT
inverse=NP . Lina LG . inv(Hessian _ obj)# Hessian矩阵求逆
X _ new=x _ init-np.matmul (inverse,grandient _ obj) #第一次迭代公式
打印(x_new)
# print(迭代%d: %.5f %(i,x_new))
i=i 1
否则:
grandent _ obj=NP . array([diff(obj,x1)。subs (x1,x _ new [0])。subs (x2,x _ new [1]),diff (obj,x2)。subs (x1,x _ new [0])
Hessian _ obj=np.array ([diff (obj,x1,2),diff (obj,x1,x2)],[diff (diff (obj,x2),x1),diff (obj,x2,2)]),DT
inverse=NP . Lina LG . inv(Hessian _ obj)# Hessian矩阵求逆
X _ new=x _ new-NP。matmul (inverse,grandient _ obj) #迭代公式
打印(x_new)
# print(迭代%d: %.5f% (i,x_new))
i=i 1
返回x_new
x0=np.array([0,0],dtype=float)
x1=符号( x1 )
x2=符号( x2 )
newton_dou(5,x0,x1**2 2*x2**2-2*x1*x2-2*x2)
程序执行的结果如下:
[1.1.]
[1.1.]
[1.1.]
[1.1.]
[1.1.]
进程结束,退出代码为0
实际计算功能后
的极端点是
,只需要一次迭代就能收敛到极值点。
3.结束语
本文仅在语言和程序上简要描述了昏睡睫毛膏方法的原理,没有过多讨论具体实现的细节。在实践中,机器学习和其他相关算法在迭代昏睡睫毛膏方法时不是这样编程的。sleep睫毛膏方法是由sleep睫毛膏发现并命名的,但是sldlt在sleep睫毛膏被发现的46年前就提出了这个算法。现在瞌睡睫毛膏法也叫瞌睡睫毛膏-sldlt法。瞌睡睫毛膏法有很多缺点,这里就不讨论了。比如一元函数的情况,会出现导数为零无法进行迭代,或者迭代点振荡往复的情况。多函数的hessian矩阵计算困难,收敛太慢。因此,产生了一些改进的方法,如假性嗜睡的睫毛膏法和阻尼嗜睡的睫毛膏法。想进一步学习的读者可以参考非线性优化领域的相关书籍。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。