Skip to content
Snippets Groups Projects
assignment1.py 1.52 KiB
import 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 = 10
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
	print('alpha is ', alpha)
	s = 1
	sigma = 10e-1
	beta = 1.0/2
	while 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):
		m+=1
		#print('m is ', m)
		alpha = beta**m*s
		#print('alpha is ', alpha)
	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)
	xnew = x
	#print('alpha is ', alpha)
	while np.linalg.norm(gradf(Q,b,x))>= epsilon:
		count += 1
		#print('f(x) is ', f(Q,b,c,x))
		print('norm of gradf(x) is ', np.linalg.norm(gradf(Q,b,x)))
		xnew -= alpha*gradf(Q,b,x)
				
	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()
	grad_opt(epsilon,xstart,countstart)
	return 0 
	
run(0.8895)


		
		
#def simpgrad_opt(e)