无约束算法-最速下降,牛顿法,拟牛顿,共轭梯度完整代码求解二次函数极小值

本文通过完整代码实现,详细介绍了四种优化方法——最速下降法、牛顿法、拟牛顿DFGS方法和共轭梯度法,用于求解二次函数的极小值。实验结果显示,牛顿法和共轭梯度法在少数迭代次数内找到了精确解,而最速下降法和拟牛顿DFGS方法需要更多迭代次数。
摘要由CSDN通过智能技术生成

 

import numpy as np
import math
a=np.random.randint(1,10,size=[100,1])
G=(a*a.T)+np.random.randint(1,5)*np.eye(100)
b=np.dot(G,np.ones((100,1)))
x0=np.random.random(size=[100])
def Df(x):#求出梯度函数
    return (np.dot(x,G)+b.T).reshape(100)
def hessian(df,z):#求hessian矩阵并赋值
    return np.array(G)
def fun(x):
    return 0.5*np.dot(np.dot(x,G),x.T)+np.dot(x,b)
def consice(x,dk):#精确线搜索
    x=np.array(x)
    return (-np.dot(Df(x),dk)/(np.dot(np.dot(dk,G),dk)))
def stepest(x):#最速下降法
    return -Df(x)
def basicnewton(x):#牛顿法
    A=np.array(-np.dot(np.mat(G).I,Df(x)))
    A=A.reshape(100)
    return A
def Nnewton(x0,H0):#拟牛顿法
    return np.array(-np.dot(H0,Df(x0)))
def SR1(H0,sk,yk):#对称秩1修正公式
    return np.array(H0+((sk.T-np.dot(H0,yk.T))*(sk-np.dot(H0,yk.T).T))/np.array((np.dot(sk-np.dot(H0,yk.T).T,yk.T))).reshape(1)[0])
def DFP(H0,sk,yk):
    return np.array(H0+(sk.T*sk)/(np.array(yk*sk.T).reshape(1)[0])-np.dot(np.dot(H0,yk.T)*yk,H0)/np.array(np.dot(np.dot(yk,H0),yk.T)).reshape(1)[0])
def BFGS(H0,sk,yk):
    return np.array(H0+(yk.T*yk)/(np.array(sk*yk.T).reshape(1)[0])-np.dot(np.dot(H0,sk.T)*sk,H0)/np.array(np.dot(np.dot(sk,H0),sk.T)).reshape(1)[0])
def solve(x0,eps):#x0为一n维向量
    k=0
    H0=np.eye(100)
    dk=-Df(x0)
    while np.linalg.norm(Df(x0))>eps:
        if 0:
            dk=basicnewton(x0)#最速下降法:stepest,牛顿法:basicnewton
            ak=consice(x0,dk)#精确线搜索:consice,A
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值