用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
浙公网安备 33010602011771号