%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

from IPython.display import Image
from IPython.html.widgets import interact, interactive, fixed

"""
Explanation: Interact Exercise 6
Imports
Put the standard imports for Matplotlib, Numpy and the IPython widgets in the following cell.
End of explanation
"""


Image('fermidist.png')

"""
Explanation: Exploring the Fermi distribution
In quantum statistics, the Fermi-Dirac distribution is related to the probability that a particle will be in a quantum state with energy $\epsilon$. The equation for the distribution $F(\epsilon)$ is:
End of explanation
"""


def fermidist(energy, mu, kT):
    F=1/(np.exp((energy-mu)/kT)+1)
    return F
    

assert np.allclose(fermidist(0.5, 1.0, 10.0), 0.51249739648421033)
assert np.allclose(fermidist(np.linspace(0.0,1.0,10), 1.0, 10.0),
    np.array([ 0.52497919,  0.5222076 ,  0.51943465,  0.5166605 ,  0.51388532,
               0.51110928,  0.50833256,  0.50555533,  0.50277775,  0.5       ]))

"""
Explanation: In this equation:

$\epsilon$ is the single particle energy.
$\mu$ is the chemical potential, which is related to the total number of particles.
$k$ is the Boltzmann constant.
$T$ is the temperature in Kelvin.

In the cell below, typeset this equation using LaTeX:
\begin{equation}
F(ϵ)=\frac{1}{e^{(ϵ-\mu)/kT}+1}
\end{equation}
Define a function fermidist(energy, mu, kT) that computes the distribution function for a given value of energy, chemical potential mu and temperature kT. Note here, kT is a single variable with units of energy. Make sure your function works with an array and don't use any for or while loops in your code.
End of explanation
"""


def plot_fermidist(mu, kT):
    energy = np.linspace(0,10.0,100) # Energy ranges from 0-10 with 100 points
    F=1/(np.exp((energy-mu)/kT)+1)     # We want this to be our Y axis.
    plt.plot(energy,F,'g')                # We want to plot the fermidist versus energy
    plt.xlabel('Energy')
    plt.ylabel('Fermidist Function')   
    plt.title(' My Beautiful Graph')
    plt.box(False)
    plt.grid(True)
    

plot_fermidist(4.0, 1.0)

assert True # leave this for grading the plot_fermidist function

"""
Explanation: Write a function plot_fermidist(mu, kT) that plots the Fermi distribution $F(\epsilon)$ as a function of $\epsilon$ as a line plot for the parameters mu and kT.

Use enegies over the range $[0,10.0]$ and a suitable number of points.
Choose an appropriate x and y limit for your visualization.
Label your x and y axis and the overall visualization.
Customize your plot in 3 other ways to make it effective and beautiful.
End of explanation
"""


interact(plot_fermidist, mu=(0.0,5.0,.1),kT=(0.1,10.0,.1))

"""
Explanation: Use interact with plot_fermidist to explore the distribution:

For mu use a floating point slider over the range $[0.0,5.0]$.
for kT use a floating point slider over the range $[0.1,10.0]$.
End of explanation
"""


