最优化最速下降法
打出来全是nan
额,有空(也许永远没空)修复
import math
import numpy as np
from numpy.linalg import inv
from numpy.linalg.linalg import norm
from numpy.ma.core import getmask
def fun(x):
return 100 * (x[0] ** 2 - x[1]) ** 2 + (x[0] - 1) ** 2
def gfun(x):
# return np.matrix([[400*x[0]*(x[0]**2-x[1])+2*(x[0]-1)],[-200*(x[0]**2-x[1])]])
return np.array([(400*x[0]*(x[0]**2-x[1])+2*(x[0]-1)), -4 * (-200*(x[0]**2-x[1]))])
def dampnm(fun, gfun,x0):
maxk = 100
rh0 = 0.55
sigma = 0.4
k = 0
epsilon = 1e-5
while(k<maxk):
g = gfun(x0)
d = -g
if(np.linalg.norm(d)<epsilon):
break
m = 0
mk = 0
while(m<20):
if(fun(x0+rh0**m*d)<fun(x0)+sigma**m*g.T*d):
mk = m
break
m = m + 1
x0 = x0 + rh0**mk*d
k = k + 1
x = x0
val = fun(x0)
print(x)
print(val)
if __name__ == '__main__':
x0 = np.array([[1], [0]])
dampnm(x0)