最速下降法的python實現

代碼一:

from sympy import *
import numpy as np
def backtracking_line_search(f,df,x,x_k,p_k,alpha0):
    rho=0.5
    c=10**-4
    alpha=alpha0
    replacements1=zip(x,x_k)
    replacements2=zip(x,x_k+alpha*p_k)
    f_k=f.subs(replacements1)
    df_p=np.dot([df_.subs(replacements1) for df_ in df],p_k)
    while f.subs(replacements2)>f_k+c*alpha*df_p:
        alpha=rho*alpha
        replacements2 = zip(x, x_k +alpha * p_k)
    return alpha
def stepest_line_search(f,x,x0,alpha0):
    df = [diff(f, x_) for x_ in x]
    x_k=x0
    alpha=alpha0
    replacements=zip(x,x_k)
    len_df = sqrt(np.sum([df_.subs(replacements) ** 2 for df_ in df]))
    while len_df>1e-6:
        p_k=-1*np.array([df_.subs(replacements) for df_ in df])
        alpha = backtracking_line_search(f, df, x, x_k, p_k, alpha)
        x_k=x_k+alpha*p_k
        replacements = zip(x, x_k)
        len_df=np.sum([df_.subs(replacements)**2 for df_ in df])
    return x_k
if __name__=="__main__":
    init_printing(use_unicode=True)
    x1 = symbols("x1")
    x2 = symbols("x2")
    x = np.array([x1, x2])
    f = 100 * (x2 - x1 ** 2)**2 + (1 - x1) ** 2
    ans=stepest_line_search(f, x, np.array([1.2, 1]), 1)
    print "the minimal value in point:",ans

分析1:
這個採用的是backtracking line search來尋找alpha。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章