用牛顿法求函数极小值,python求函数极大值

  用牛顿法求函数极小值,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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: