assignment1.py 1.53 KiB
iimport numpy as np
# Initialize iteration counter
# Import text files
Q = np.asmatrix(np.loadtxt('Q.txt'))
b = np.asmatrix(np.loadtxt('b.txt'))
c = np.asmatrix(np.loadtxt('c.txt'))
b = np.transpose(b) #make b a column vector
D = np.asmatrix(np.ones(np.size(b)))
m = 0
# Make a guess for x vector
x = np.asmatrix(np.zeros(np.size(b)))
x = np.transpose(x) #make column vector
alpha0 = 1
count = 0
# Define f(x)
def f(Q,b,c,x):
return np.transpose(x)*Q*x + np.transpose(b)*x + c
# Define gradient f(x)
def gradf(Q,b,x):
return 2*Q*x + b
# Define algorithm for Armijos rule
def armijo(alpha0,Q,b,c,D,m):
alpha = alpha0
s = 1
sigma = 10e-1
beta = 1/10
if f(Q,b,c,x+np.transpose(alpha*D)) <= f(Q,b,c,x) + sigma*alpha*(np.transpose(gradf(Q,b,x)))*np.transpose(D):
return alpha
else:
m+=1
#print('m is ', m)
alpha = beta**m*s
alpha = armijo(alpha,Q,b,c,D,m)
return alpha
def xval():
return x
def countval():
return count
# Begin Gradient Descent Algorithm
def grad_opt(epsilon,x,count):
alpha = armijo(alpha0,Q,b,c,D,m)
print('alpha is ', alpha)
f1 = f(Q,b,c,x)
x = x - alpha*np.transpose(gradf(Q,b,x))*(np.identity(np.size(b)))*gradf(Q,b,x)
if np.linalg.norm(gradf(Q,b,x))>= epsilon:
count += 1
print('x is ', x)
grad_opt(epsilon,x,count)
return 0
else:
print('Done')
print('x* is ', x)
print('f(x*) is ', f(Q,b,c,x))
print('epsilon is ', epsilon)
return 0
def run(epsilon):
xstart = xval()
countstart = countval()
epsilon = 0.1
grad_opt(epsilon,xstart,countstart)
#def simpgrad_opt(e)