最速下降法(适用于求二阶极小值)

最速下降法

  • 过程
  • 代码

过程

最速下降法步骤
给:min{f(x)},初始点:x0=(a0,b0)T,精度ε。
过程①
求出求出下降方向d,步长α,
下降方向:d = ▽f(x);
下次更新x的最优步长α:Φ’(x) = [f(x + αd)]’ = 0;
过程②
更新x:x1 = x0 + αd0
过程③
当||▽f(x)|| < ε,则停,最小值x* = x;
最速下降法(适用于求二阶极小值)_第1张图片

代码

##最速下降法+精确搜索
import sympy
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
ax = plt.axes(projection='3d')
x1=sympy.Symbol('x1')
x2=sympy.Symbol('x2')
mu=sympy.Symbol('u')
f=(x1-2)**2+(x1-2*x2)**2
fx1=sympy.diff(f,x1)
fx2=sympy.diff(f,x2)
x=np.array([0,3]).T

# xmin=np.array([0,0]).T
epsi=0.00001
lx1=[]
lx2=[]
ly=[]
def accucy(x,num):
    dk1=fx1.evalf(subs={
     x1:x[0],x2:x[1]})
    dk2=fx2.evalf(subs={
     x1:x[0],x2:x[1]})
    dk=np.array([dk1,dk2]).T
    length=np.linalg.norm(np.float32(dk))
    fx = f.evalf(subs={
     x1:x[0],x2:x[1]})
    lx1.append(x[0])
    lx2.append(x[1])
    ly.append(fx)
    if length<epsi:
        print(length,x)
        ax.plot3D(lx1, lx2, ly, marker="o", color="red", label="最速下降法")
        return x
    else:
        ##下面两句是精确搜索
        xk=x-mu*dk
        dk1=fx1.subs({
     x1:xk[0],x2:xk[1]})
        dk2=fx2.subs({
     x1:xk[0],x2:xk[1]})
        fmu=np.inner([dk1,dk2],dk)
        muk=sympy.solve(fmu,mu)
        xk=x-muk*dk
        print('%d x=(%+.2f,%+.2f) length=%.3f'%(num,xk[0],xk[1],length))
        accucy(xk,num+1)
def Graph():
    lx1=[]
    lx2=[]
    ly=[]
    for j in np.arange(0,3,0.3):
        for i in np.arange(0,3,0.3):
            lx1.append(i)
            lx2.append(j)
            fx=f.evalf(subs={
     x1:i,x2:j})
            ly.append(fx)
    ax.plot3D(lx1, lx2, ly, marker="o", color="blue", label="f函数")
    lx1 = []
    lx2 = []
    ly = []
    for i in np.arange(0,3,0.3):
        for j in np.arange(0,3,0.3):
            lx1.append(i)
            lx2.append(j)
            fx=f.evalf(subs={
     x1:i,x2:j})
            ly.append(fx)
    ax.plot3D(lx1, lx2, ly, marker="o", color="blue", label="f函数")
accucy(x,1)
Graph()
plt.show()

最速下降法(适用于求二阶极小值)_第2张图片

你可能感兴趣的:(最优化)