Skip to content
Snippets Groups Projects
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)