import numpy as np
import pandas as pd
from scipy import spatial
import matplotlib.pyplot as plt
from ipywidgets import interact
%matplotlib inline
Use proper vectors (r is a vector as function arguments and force should have direction)
V(r)=4ε[(σr)12−(σr)6]r−12 term is repulsion due to Pauli Exclusion Principle and r−6 term is attraction due to dipole-dipole interaction (van der Waals) between non-polar atoms.
V(σ)=0. and V(21/6σ)=Vmin=−ε
F(r)=−∇V=24εσ[2(σr)13−(σr)7]For Argon the values are
We'll choose all units as 1.0. m=1,σ=1,ε=1. Which gives a time unit
τ=√mσ2ε=2.7×10−12sThis means a time duration Δt=1.0 correspondes to 2.7 picoseconds in a simulation.
def lennard_jones_potential(r, epsion=1.0, sigma=1.0):
sigma12 = np.power(sigma, 12.0)
sigma6 = np.power(sigma, 6.0)
return 4.0 * epsion * (sigma12 * np.power(r, -12.) - sigma6 * np.power(r, -6.))
def lennard_jones_force(r, epsilon=1.0, sigma=1.0):
sigma13 = np.power(sigma, 12.0)
sigma7 = np.power(sigma, 6.0)
return 24.0 * epsilon / sigma * (2.0 * sigma13 * np.power(r, -12.) - sigma7 * np.power(r, -6.))
def plot_lj_pot(r, epsilon=1.0, sigma=1.0):
pot = lennard_jones_potential(r, epsilon, sigma)
plt.plot(r, pot, lw=2, label='LJ potential')
def plot_lj_force(r, epsilon=1.0, sigma=1.0):
force = lennard_jones_force(r, epsilon, sigma)
plt.plot(r, force, lw=2, label='LJ force')
r = np.linspace(0.5, 2.5, 100)
def plot_lj(epsilon=1.0, sigma=1.0):
fig = plt.figure(figsize=(10, 6))
plot_lj_pot(r, epsilon=epsilon, sigma=sigma)
plot_lj_force(r, epsilon=epsilon, sigma=sigma)
plt.ylim([-4.0, 4.0])
plt.axvline(sigma, linestyle=':', color='blue', label='V = 0')
plt.axvline(np.power(2.0, 1./6.) * sigma, linestyle=':', color='red', label='$r^*$')
plt.axhline(-epsilon, linestyle=':', color='orange', label='$V_\mathrm{min}$')
plt.legend()
plt.title('')
plt.grid()
# plot_lj_pot(r, 1.0, 1.0)
interact(plot_lj, epsilon=(0.1, 2.0), sigma=(0.1, 2.0));