用python实现最速下降法

#所求目标函数:min x**2 + 2*y**2 - 2*x*y - 2*y

from sympy import *
from matplotlib import pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei']    #指定默认字体 SimHei为黑体
plt.rcParams['axes.unicode_minus']=False

# 所求目标函数
def fx2(x):
    return x[0]**2 + 2*x[1]**2 - 2*x[0]*x[1] - 2*x[1]
# 所求目标函数梯度
def g(x):
    return [2*x[0]-2*x[1],4*x[1]-2*x[0]-2]
# 步长
def qiua(x0,fx):
    a = symbols('a')
    f0 = 2*(x0[0] + a*fx[0])*fx[0] - 2*(x0[1] + a*fx[1])*fx[0] + 4*(x0[1] + a*fx[1])*fx[1] - 2*(x0[0] + a*fx[0])*fx[1]-2*fx[1]
    r = float(solve(f0,a)[0])
    return r
# 迭代
def diedai():
    x0 = [0,0]
    x.append(x0[0])
    y.append(x0[1])
    cs = 1000
    for i in range(cs):
        print(f"第{i}次迭代,点:{x0},梯度:{g(x0)},函数值:{fx2(x0)}")
        # 方向
        fx = [-1*g(x0)[0],-1*g(x0)[1]]
        if math.sqrt(fx[0]**2+fx[1]**2) < 1e-6:
            break
        else:
            a = qiua(x0,fx)
            x0 = [x0[0] + a * fx[0],x0[1] + a * fx[1]]
            x.append(x0[0])
            y.append(x0[1])
# 绘图
x = []
y = []
diedai()
plt.plot(x,y,label='最速下降法')
plt.xlabel("x1")
plt.ylabel("x2")
plt.title("最速下降法迭代")
plt.savefig("./1.png")
plt.show()


运行结果:

 

 

 

 

 

2022-01-02  20:15:00

 

posted @ 2022-01-02 20:15  詮釋  阅读(471)  评论(0)    收藏  举报