栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

全CSDN最拉跨的最速下降法,懒得写注释,自己看,复杂度爆炸

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

全CSDN最拉跨的最速下降法,懒得写注释,自己看,复杂度爆炸

全CSDN最拉跨的最速下降法,懒得写注释,自己看,复杂度爆炸
import numpy as np
import sympy as sympy
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


def f(x):
    return 3*x[0]**2/2 + x[1]**2/2 - x[0]*x[1] -2*x[0]

def grad(x,f):
    gd = np.zeros(x.shape)
    m = np.zeros(x.shape)
    epsilon = 1e-9
    # print(f(x[0],x[1]))
    # gd[0] = (f(x[0]+epsilon,x[1]) - f(x[0],x[1]))/epsilon
    # gd[1] = (f(x[0] , x[1]+ epsilon) - f(x[0], x[1])) / epsilon
    for i in range(0,len(x)):
        m = x.copy()
        m[i] = m[i]+epsilon
        gd[i] = (f(m) - f(x))/epsilon
    return np.around(gd,10)

x = np.asarray([-2.0,4.0])

h = np.zeros((100,2))
sv = np.zeros((100,))
h1 = []
h2 = []
sv1 = []
h[0] = x
sv[0] = f(h[0])
i = 0
h1.append(list(h[0])[0])
h2.append(list(h[0])[1])
while True:
    try:
        i += 1
        alpha = sympy.Symbol("alpha")
        gd = grad(h[i-1],f)
        solve = sympy.solve( 3*(h[i-1][0] - alpha*gd[0])**2/2 + (h[i-1][1] - alpha*gd[1])**2/2 - (h[i-1][0] - alpha*gd[0])*(h[i-1][1] - alpha*gd[1]) -2*(h[i-1][0] - alpha*gd[0]), alpha)
        solve = round((solve[0]+solve[1])/2,10)
        h[i] = h[i-1] - solve*grad(h[i-1],f)
        sv[i] = f(h[i])
        h1.append(list(h[i])[0])
        h2.append(list(h[i])[1])
        sv1.append(sv[i])
        print("第%d次迭代得到的坐标为"%i,h[i])
        print("第%d次迭代得到的最小值为"%i,sv[i])
    except:
        break

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.plot(h1,h2,'*--r')
plt.title('迭代过程坐标')
plt.show()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/580521.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号