%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import scipy.optimize as opt

"""
Explanation: Optimization Exercise 1
Imports
End of explanation
"""


# YOUR CODE HERE
# raise NotImplementedError()
def hat(x, a, b):
    c = x**2
    d = x**4
    p = -a * c + b * d
    q = np.array(p)
    return q


assert hat(0.0, 1.0, 1.0)==0.0
assert hat(0.0, 1.0, 1.0)==0.0
assert hat(1.0, 10.0, 1.0)==-9.0

"""
Explanation: Hat potential
The following potential is often used in Physics and other fields to describe symmetry breaking and is often known as the "hat potential":
$$ V(x) = -a x^2 + b x^4 $$
Write a function hat(x,a,b) that returns the value of this function:
End of explanation
"""


a = 5.0
b = 1.0

# YOUR CODE HERE
# raise NotImplementedError()
x = np.arange(-3.0,3.0,0.1)


plt.plot(x,hat(x,a,b))
plt.xlim(-3, 3)
plt.ylim(-7, 35)
plt.box(False)
plt.xlabel('Position')
plt.ylabel('Hat Potential')
plt.title('Hat Potential versus Position')

assert True # leave this to grade the plot

"""
Explanation: Plot this function over the range $x\in\left[-3,3\right]$ with $b=1.0$ and $a=5.0$:
End of explanation
"""


# YOUR CODE HERE
# raise NotImplementedError() 
# x0 = np.arange(-3.0, 0.0, 0.2)
minima_1 = opt.minimize(hat, -1.5, args = (5.0, 1.0))
minima_2 = opt.minimize(hat, 1.5, args = (5.0, 1.0))


x = np.arange(-3.0,3.0,0.1)
plt.plot(x,hat(x,a,b))
plt.xlim(-3, 3)
plt.ylim(-7, 35)
plt.box(False)
plt.scatter(minima_1.x, hat(minima_1.x, 5.0, 1.0), color = 'r')
plt.scatter(minima_2.x, hat(minima_2.x, 5.0, 1.0), color = 'r')
plt.xlabel('Position')
plt.ylabel('Hat Potential')
plt.title('Hat Potential versus Position')
plt.legend('Vm')

assert True # leave this for grading the plot

"""
Explanation: Write code that finds the two local minima of this function for $b=1.0$ and $a=5.0$.

Use scipy.optimize.minimize to find the minima. You will have to think carefully about how to get this function to find both minima.
Print the x values of the minima.
Plot the function as a blue line.
On the same axes, show the minima as red circles.
Customize your visualization to make it beatiful and effective.
End of explanation
"""


