Finding Stable Structures on Potential Energy Surfaces
Introduction
Today, we’ll explore molecular geometry optimization - a fundamental technique in computational chemistry. We’ll find the most stable structure of a molecule by minimizing its potential energy with respect to atomic positions. Think of it as finding the lowest point in a valley where a ball would naturally settle.
The Problem: Water Molecule (H₂O) Optimization
Let’s optimize the geometry of a water molecule starting from a non-optimal structure. We’ll use the Lennard-Jones potential and harmonic bond stretching to model the potential energy surface.
The total potential energy is:
Etotal=Ebond+ELJ
Where the bond stretching energy is:
Ebond=∑bonds12k(r−r0)2
And the Lennard-Jones potential between non-bonded atoms:
ELJ=∑i<j4ϵ[(σrij)12−(σrij)6]
Source Code
1 | import numpy as np |
Code Explanation
1. WaterMolecule Class Structure
The WaterMolecule
class encapsulates all the physics and optimization logic:
__init__
: Initializes force field parameters including the equilibrium O-H bond length (r0=0.96 Å) and the harmonic force constant (k=500 kcal/mol/Ų)bond_energy
: Computes the harmonic potential for bond stretchinglennard_jones
: Calculates the LJ potential for non-bonded H-H interactions using the 12-6 formpotential_energy
: The main function that computes total energy by summing bond and non-bonded contributions
2. Energy Function Design
The potential energy function takes a 9-dimensional vector (3 coordinates × 3 atoms) and:
- Reshapes it into atomic positions
- Calculates all relevant distances
- Evaluates bond stretching energies for both O-H bonds
- Adds the repulsive H-H interaction
- Stores the geometry and energy in history arrays for visualization
3. Optimization Algorithm
We use SciPy’s minimize
function with the BFGS (Broyden-Fletcher-Goldfarb-Shanno) algorithm:
- BFGS is a quasi-Newton method that approximates the Hessian matrix
- It’s ideal for smooth potential energy surfaces
- The algorithm iteratively updates atomic positions to minimize energy
4. Geometry Analysis
After optimization, we calculate:
- Bond lengths: Using Euclidean distance
- Bond angle: Using the dot product formula: cos(θ)=→v1⋅→v2|→v1||→v2|
5. Visualization Components
The code creates six subplots:
- Energy Convergence: Shows how total energy decreases over iterations
- Initial Geometry: 3D view of the starting structure
- Optimized Geometry: 3D view of the final stable structure
- Bond Length Convergence: Tracks how O-H bonds approach equilibrium
- Angle Convergence: Shows the H-O-H angle optimization
- Energy Components: Breaks down contributions from bonds and non-bonded terms
Execution Results
============================================================ INITIAL GEOMETRY ============================================================ O position: (0.000, 0.000, 0.000) H1 position: (1.200, 0.300, 0.000) H2 position: (-0.500, 1.000, 0.000) Initial Energy: 28.1086 kcal/mol Current function value: 1.332705 Iterations: 15 Function evaluations: 612 Gradient evaluations: 60 ============================================================ OPTIMIZED GEOMETRY ============================================================ O position: (0.233, 0.433, -0.000) H1 position: (1.168, 0.149, -0.000) H2 position: (-0.701, 0.718, 0.000) Optimized Energy: 1.3327 kcal/mol Bond distances: O-H1: 0.9768 Å O-H2: 0.9768 Å H1-H2: 1.9536 Å H-O-H angle: 180.00° ============================================================
============================================================ ANALYSIS COMPLETE ============================================================ Visualizations saved as 'water_optimization.png'
Expected Results & Discussion
When you run this code, you should observe:
Energy Convergence: The total energy drops from a high initial value (due to stretched bonds and unfavorable geometry) to a minimum, typically stabilizing within 10-20 iterations.
Bond Optimization: Both O-H bonds converge to approximately 0.96 Å, the equilibrium distance specified in our potential.
Angle Formation: The H-O-H angle settles around 104-109°, determined by the balance between bond stretching and H-H repulsion.
Energy Components: You’ll see that bond stretching energies decrease dramatically as bonds reach their equilibrium length, while the H-H LJ energy finds an optimal balance between the attractive and repulsive parts of the potential.
This simple example demonstrates the fundamental principle of computational chemistry: molecules naturally adopt geometries that minimize their potential energy. Real quantum chemistry programs use much more sophisticated potentials (Hartree-Fock, DFT, etc.), but the optimization principle remains the same!