import os
import matplotlib.pyplot as plt
import numpy as np
import scipy
import sympy
os.chdir('/home/vg/Downloads/projects/ex18')
os.getcwd()
x1,x2=sympy.symbols("x_1,x_2")
f_sym=(x1-1)**4 + 5*(x2-1)**2 - 2*x1*x2
fprime_sym=[f_sym.diff(x_) for x_ in (x1,x2)]
sympy.Matrix(fprime_sym)
fhess_sym=[[f_sym.diff(x1_,x2_) for x1_ in (x1,x2)] for x2_ in (x1,x2)]
sympy.Matrix(fhess_sym)
f_lmbda=sympy.lambdify((x1,x2),f_sym,'numpy')
fprime_lmbda=sympy.lambdify((x1,x2),fprime_sym,'numpy')
fhess_lmbda=sympy.lambdify((x1,x2),fhess_sym,'numpy')
def func_XY_to_xy(f):
    return lambda X: np.array(f(X[0],X[1]))

f=func_XY_to_xy(f_lmbda)
fprime=func_XY_to_xy(fprime_lmbda)
fhess=func_XY_to_xy(fhess_lmbda)
x_opt=scipy.optimize.fmin_ncg(f,(0,0),fprime=fprime,fhess=fhess)
print(x_opt)
fig,ax=plt.subplots(figsize=(6,4))
x_=y_=np.linspace(-1,4,100)
X,Y=np.meshgrid(x_,y_)
c=ax.contour(X,Y,f_lmbda(X,Y),50)
ax.plot(x_opt[0],x_opt[1],'r*',markersize=15)
ax.set_xlabel(r"$x_1$",fontsize=18)
ax.set_ylabel(r"$x_2$",fontsize=18)
plt.colorbar(c,ax=ax)
plt.savefig("example18.png", dpi=100)
plt.show()
plt.close()
x_opt=scipy.optimize.fmin_bfgs(f,(0,0),fprime=fprime)
print(x_opt)
x_opt=scipy.optimize.fmin_cg(f,(0,0),fprime=fprime)
print(x_opt)
x_opt=scipy.optimize.fmin_bfgs(f,(0,0))
print(x_opt)
x_opt=scipy.optimize.fmin_cg(f,(0,0))
print(x_opt)


example18