import numpy as np

# Function to minimize
def function ( X ):
   return (X[0]-2)**2 + 2*(X[1]-3)**2

# Gradient of the function
def gradient (X):
    return np.array([ 2*X[0]-4 , 4*X[1]-12 ])

# Starting point
X = np.array([30,20])

# Step size multiplier
alpha=0.05

# Gradient descent (200 steps)
for x in range(0, 200):
    X = X - alpha*gradient(X)
    #print (X)

# Print results
print ('X=', X)
print ('f=', function(X))

# Output expected:
# X= [2.00000002 3.        ]
# f= 3.9022927947211357e-16