The H\(_2^+\) Molecular Ion

Author

Daniel Fischer

Introduction

The hydrogen molecular ion, H\(_2^+\), is the simplest conceivable molecule: two protons and one electron. Despite its simplicity, it is of profound importance in molecular physics.

  • It provides the first step beyond the hydrogen atom, introducing the physics of chemical bonding within a fully quantum-mechanical framework.

  • As a one-electron system, H\(_2^+\) allows us to study molecular bonding without the complications of electron–electron interactions. It also provides an ideal setting for introducing approximation methods such as the Born–Oppenheimer approximation and the variational method.

  • Remarkably, within the fixed-nuclei approximation, the electronic Schrödinger equation is fully separable in prolate spheroidal (ellipsoidal) coordinates. This reduces the three-dimensional problem to ordinary differential equations, although determining their energy eigenvalues generally still requires numerical methods.

We will see that the key to understanding H\(_2^+\) lies in a clever choice of coordinates and the recognition that the electron experiences the combined Coulomb field of two fixed nuclei.


1. Setting up the System Hamiltonian

Let’s consider two protons, labeled A and B, separated by a distance \(R\). An electron with position vector \(\vec{r}\) moves in the combined potential of these two nuclei.

We define:

  • \(\vec{R}_A\) and \(\vec{R}_B\) as the position vectors of the nuclei,
  • \(\vec{r}_A = \vec{r} - \vec{R}_A\) and \(\vec{r}_B = \vec{r} - \vec{R}_B\) as the electron’s position relative to each nucleus.

Under the Born–Oppenheimer approximation, we assume that the nuclei are fixed in space (since they are much heavier than the electron). The electronic Hamiltonian then reads:

\[ \hat{H}_e = - \frac{\hbar^2}{2m_e} \nabla^2 - \frac{e^2}{4\pi \epsilon_0 r_A} - \frac{e^2}{4\pi \epsilon_0 r_B}. \]

The total energy of the system also includes the repulsive interaction between the two protons:

\[ E_\text{total} = E_e + \frac{e^2}{4\pi \epsilon_0 R}. \]


Here’s a sketch of the molecular geometry, including the relevant position vectors:

Code
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['text.usetex'] = True
plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.size'] = 12

fig, ax = plt.subplots(figsize=(7, 5))
ax.set_aspect('equal', adjustable='box')
ax.set_xlim(-1, 5)
ax.set_ylim(-1, 5)
ax.axis('off')

A = np.array([0, 0])
B = np.array([4, 0])
e_minus = np.array([3.5, 3.5])
S = np.array([2, 0])

# Nuclei
ax.plot(A[0], A[1], 'o', color='red', markersize=15)
ax.text(A[0]-0.2, A[1]+0.3, 'A', ha='right', va='bottom', fontsize=12)
ax.text(A[0]-0.2, A[1]-0.3, '$p^+$', ha='right', va='top', fontsize=12)

ax.plot(B[0], B[1], 'o', color='red', markersize=15)
ax.text(B[0]+0.2, B[1]+0.3, 'B', ha='left', va='bottom', fontsize=12)
ax.text(B[0]+0.2, B[1]-0.3, '$p^+$', ha='left', va='top', fontsize=12)

# Electron
ax.plot(e_minus[0], e_minus[1], 'o', color='green', markersize=10)
ax.text(e_minus[0]+0.2, e_minus[1]+0.2, '$e^-$', ha='left', va='center', fontsize=12)

# Center and vectors
ax.plot(S[0], S[1], 'x', color='black', markersize=10)
ax.text(S[0], S[1]-0.2, 'O', ha='center', va='top', fontsize=12)

# Vector annotations
ax.annotate('', xy=(S[0], S[1]), xytext=(A[0], A[1]),
            arrowprops={'arrowstyle': '<-', 'lw': 1.5, 'color': 'black'})
ax.text(1, -0.2, r'$\vec{R}_A$', ha='center', va='top', fontsize=12)

ax.annotate('', xy=(B[0], B[1]), xytext=(S[0], S[1]),
            arrowprops={'arrowstyle': '->', 'lw': 1.5, 'color': 'black'})
ax.text(3, -0.2, r'$\vec{R}_B$', ha='center', va='top', fontsize=12)

ax.annotate('', xy=(A[0], A[1]-0.7), xytext=(B[0], B[1]-0.7),
            arrowprops={'arrowstyle': '<->', 'lw': 1.5, 'color': 'black'})
ax.text(2, -0.9, r'$\vec{R}$', ha='center', va='top', fontsize=12)

ax.annotate('', xy=(e_minus[0], e_minus[1]), xytext=(A[0], A[1]),
            arrowprops={'arrowstyle': '->', 'lw': 1.5, 'color': 'black'})
ax.text(1.5, 1.7, r'$\vec{r}_A$', ha='center', va='bottom', fontsize=12)

ax.annotate('', xy=(e_minus[0], e_minus[1]), xytext=(B[0], B[1]),
            arrowprops={'arrowstyle': '->', 'lw': 1.5, 'color': 'black'})
ax.text(4, 1.7, r'$\vec{r}_B$', ha='center', va='bottom', fontsize=12)

ax.annotate('', xy=(e_minus[0], e_minus[1]), xytext=(S[0], S[1]),
            arrowprops={'arrowstyle': '->', 'lw': 1.5, 'color': 'black'})
ax.text(2.6, 1.7, r'$\vec{r}$', ha='center', va='bottom', fontsize=12)

plt.show()

Sketch of the molecular geometry, including the relevant position vectors.


2. Ellipsoidal Coordinates

Because the potential depends on the distances to the two nuclei, \((r_A,r_B)\), it is natural to choose coordinates that are built from those distances. Prolate spheroidal coordinates do exactly that and therefore align with the geometry and symmetry of the problem.

Concretely, define \[ \xi=\frac{r_A+r_B}{R},\qquad \eta=\frac{r_A-r_B}{R},\qquad \phi=\arctan\!\frac{y}{x}, \] with \[ 1 \leq \xi < \infty,\qquad -1 \leq \eta \leq 1,\qquad 0 \leq \phi < 2\pi, \] so that \[ r_A=\frac{R}{2}(\xi+\eta),\qquad r_B=\frac{R}{2}(\xi-\eta). \] Two geometric facts follow immediately:

  • Surfaces of constant \(\xi\) satisfy \(r_A+r_B=\text{const}\) and are therefore ellipsoids with foci at the nuclear positions.
  • Surfaces of constant \(\eta\) satisfy \(r_A-r_B=\text{const}\) and are therefore hyperboloids (level surfaces of the difference of distances to the foci).

These coordinate surfaces conform to the two-center geometry: one family of surfaces (the ellipsoids) encloses both nuclei, while the other family (the hyperboloids) separates regions nearer to one nucleus from regions nearer to the other. Because the physical potential is built from \(1/r_A\) and \(1/r_B\), expressing \(r_A,r_B\) in terms of \((\xi,\eta)\) yields compact algebraic formulae. For example, the two-center Coulomb potential becomes \[ \frac{1}{r_A}+\frac{1}{r_B} = \frac{2}{R}\!\left(\frac{1}{\xi+\eta}+\frac{1}{\xi-\eta}\right) = \frac{4\xi}{R(\xi^2-\eta^2)}. \] Thus the potential is a rational function of \(\xi\) and \(\eta\), and—crucially—has the simple factor structure \(\propto \xi/(\xi^2-\eta^2)\).

The figure visualizes the prolate spheroidal coordinate system: on the left, \(\xi\)– and \(\eta\)–lines form a two-dimensional grid in the \(xz\)–plane, while on the right, an ellipsoid of constant \(\xi\) is shown together with its \(\eta\)– and \(\phi\)–grid lines.

Code
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Line3DCollection

plt.rcParams['text.usetex'] = True
plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.size'] = 15


# Set up 1x2 subplots
# Create a figure and a standard 2D axes array
fig, axes = plt.subplots(1, 2, figsize=(10, 5))

# Remove the second (right-side) axis
axes[1].remove()

# Add a new 3D axis in the same position
ax3d = fig.add_subplot(1, 2, 2, projection='3d')


# --- 3D Ellipsoid Plot Setup ---
R = 0.25  # Half-distance between foci
f1 = np.array([0, 0, R])
f2 = np.array([0, 0, -R])

# Set viewing angle
view_azimuth = 45
view_elevation = 30
ax3d.view_init(elev=view_elevation, azim=view_azimuth)

# Calculate view direction vector
view_az_rad = np.radians(view_azimuth)
view_el_rad = np.radians(view_elevation)
view_dir = np.array([
    np.cos(view_el_rad) * np.cos(view_az_rad),
    np.cos(view_el_rad) * np.sin(view_az_rad),
    np.sin(view_el_rad)
])

def ellipsoidal_to_cartesian(mu, nu, phi, R):
    """Convert prolate spheroidal coordinates to Cartesian"""
    x = R * np.sqrt((mu**2 - 1) * (1 - nu**2)) * np.cos(phi)
    y = R * np.sqrt((mu**2 - 1) * (1 - nu**2)) * np.sin(phi)
    z = R * mu * nu
    return x, y, z

# --- Generate and plot ellipsoid surface ---
mu_surface = 2.0
nu_vals = np.linspace(-1, 1, 100)
phi_vals = np.linspace(0, 2 * np.pi, 100)
Nu, Phi = np.meshgrid(nu_vals, phi_vals)

X = R * np.sqrt((mu_surface**2 - 1) * (1 - Nu**2)) * np.cos(Phi)
Y = R * np.sqrt((mu_surface**2 - 1) * (1 - Nu**2)) * np.sin(Phi)
Z = R * mu_surface * Nu

ax3d.plot_surface(X, Y, Z, alpha=0.3, color='lightblue', edgecolor='none')


# --- Generate and plot phi lines ---
n_phi_lines = 12
phi_lines_visible = []
phi_lines_hidden = []
for phi in np.linspace(0, 2 * np.pi, n_phi_lines, endpoint=False):
    nu = np.linspace(-1, 1, 200)
    x, y, z = ellipsoidal_to_cartesian(mu_surface, nu, phi, R)

    points = np.column_stack([x, y, z])
    visibility = np.dot(points, view_dir)
    
    for i in range(len(nu) - 1):
        if (visibility[i] + visibility[i+1]) / 2 > 0:
            phi_lines_visible.append(np.array([x[i:i+2], y[i:i+2], z[i:i+2]]).T)
        else:
            phi_lines_hidden.append(np.array([x[i:i+2], y[i:i+2], z[i:i+2]]).T)

if phi_lines_visible:
    phi_vis_coll = Line3DCollection(phi_lines_visible, colors='g', linewidth=1.5, linestyle='-', alpha=0.8)
    ax3d.add_collection(phi_vis_coll)
if phi_lines_hidden:
    phi_hid_coll = Line3DCollection(phi_lines_hidden, colors='g', linewidth=0.8, linestyle='--', alpha=0.3)
    ax3d.add_collection(phi_hid_coll)


# --- Generate and plot nu lines ---
n_nu_lines = 9
nu_lines_visible = []
nu_lines_hidden = []
for nu in np.linspace(-0.9, 0.9, n_nu_lines):
    phi = np.linspace(0, 2 * np.pi, 200)
    x, y, z = ellipsoidal_to_cartesian(mu_surface, nu * np.ones_like(phi), phi, R)

    points = np.column_stack([x, y, z])
    visibility = np.dot(points, view_dir)

    for i in range(len(phi) - 1):
        if (visibility[i] + visibility[i+1]) / 2 > 0:
            nu_lines_visible.append(np.array([x[i:i+2], y[i:i+2], z[i:i+2]]).T)
        else:
            nu_lines_hidden.append(np.array([x[i:i+2], y[i:i+2], z[i:i+2]]).T)

if nu_lines_visible:
    nu_vis_coll = Line3DCollection(nu_lines_visible, colors='r', linewidth=1.5, linestyle='-', alpha=0.8)
    ax3d.add_collection(nu_vis_coll)
if nu_lines_hidden:
    nu_hid_coll = Line3DCollection(nu_lines_hidden, colors='r', linewidth=0.8, linestyle='--', alpha=0.3)
    ax3d.add_collection(nu_hid_coll)


# --- Finalize plot ---
ax3d.scatter(*f1, color='r', s=100, marker='o', label='Focus 1', zorder=10)
ax3d.scatter(*f2, color='r', s=100, marker='o', label='Focus 2', zorder=10)
ax3d.set_box_aspect(aspect=(1,1,1))
max_range = 0.3
ax3d.set_xlim([-max_range, max_range])
ax3d.set_ylim([-max_range, max_range])
ax3d.set_zlim([-max_range, max_range])
ax3d.set_axis_off()

# You can add a plot to the 2D axes here
# Plot constant mu lines (varying nu)
# --- Generate and plot grid on the 2D subplot (axes) ---
# Project onto the xz-plane, for phi = 0 and phi = 180 degrees
phi_xz_values = [0, np.pi] # 0 and 180 degrees in radians

for phi_xz in phi_xz_values:
    # Plot constant mu lines (varying nu)
    mu_lines_to_plot = [1., 1.25, 1.5, 1.75, 2.0]
    nu_vals = np.linspace(-1, 1, 100)
    for mu in mu_lines_to_plot:
        x_mu, _, z_mu = ellipsoidal_to_cartesian(mu, nu_vals, phi_xz, R)
        axes[0].plot(x_mu, z_mu, 'b-', alpha=0.6)
        # Add label for the mu line
        label_text = rf'$\xi={{{mu:.2f}}}$'
        # Position label near the line end. Adjust spacing as needed.
        if (phi_xz == 0): axes[0].text(x_mu[50]+0.025, z_mu[50]+0.015, label_text, fontsize=8, rotation=-90, ha='center', color='blue')


    # Plot constant nu lines (varying mu)
    nu_lines_to_plot = [-0.9, -0.6, -0.3, 0, 0.3, 0.6, 0.9]
    mu_vals = np.linspace(1.0, 2.0, 100) # mu > 1
    for nu in nu_lines_to_plot:
        x_nu, _, z_nu = ellipsoidal_to_cartesian(mu_vals, nu, phi_xz, R)
        axes[0].plot(x_nu, z_nu, 'r-', alpha=0.6)

axes[0].text(-0.225, 0.505, rf'$\eta=0.9$', fontsize=8, rotation=-61, ha='center', va='center', color='red')
axes[0].text(-0.41, 0.34, rf'$\eta=0.6$', fontsize=8, rotation=-35, ha='center', va='center', color='red')
axes[0].text(-0.48, 0.168, rf'$\eta=0.3$', fontsize=8, rotation=-15, ha='center', va='center', color='red')
axes[0].text(-0.5, 0, rf'$\eta=0$', fontsize=8, rotation=0, ha='center', va='center', color='red')
axes[0].text(-0.5, -0.18, rf'$\eta=-0.3$', fontsize=8, rotation=15, ha='center', va='center', color='red')
axes[0].text(-0.42, -0.35, rf'$\eta=-0.6$', fontsize=8, rotation=35, ha='center', va='center', color='red')
axes[0].text(-0.22, -0.525, rf'$\eta=-0.9$', fontsize=8, rotation=61, ha='center', va='center', color='red')
axes[0].scatter([0,0], [R,-R], color='r', s=100, marker='o', label='Focus 1', zorder=10)


axes[0].set_xlabel(r'$x$')
axes[0].set_ylabel(r'$z$')
axes[0].set_box_aspect(1) # Equal aspect ratio
max_range =  0.6
axes[0].set_xlim([-max_range, max_range])
axes[0].set_ylim([-max_range, max_range])

plt.tight_layout()
plt.show()

Ellipsoid of constant xi with eta and phi grid lines.


3. Separation of Variables

The main advantage of prolate spheroidal coordinates is that they allow us to separate the Schrödinger equation into ordinary differential equations. This is possible because the two-center Coulomb potential and the Laplacian have compatible mathematical structures in these coordinates.

To simplify the following expressions, we use atomic units (\(\hbar=m_e=e=4\pi\varepsilon_0=1\)). For two fixed protons separated by \(R\), the electronic Schrödinger equation is

\[ \left[ -\frac12\nabla^2 -\frac1{r_A} -\frac1{r_B} \right]\psi =E_e\psi. \]

The nucleus–nucleus repulsion \(1/R\) does not affect the electronic wave function at fixed \(R\) and is added afterward to obtain the total energy.

In prolate spheroidal coordinates, the potential becomes

\[ -\frac1{r_A}-\frac1{r_B} = -\frac{4\xi}{R(\xi^2-\eta^2)}, \]

as derived in Section 2. The Laplacian takes the form

\[ \begin{aligned} \nabla^2 =\frac{4}{R^2(\xi^2-\eta^2)} \Bigg[ &\frac{\partial}{\partial\xi} \left((\xi^2-1)\frac{\partial}{\partial\xi}\right)\\ +{}& \frac{\partial}{\partial\eta} \left((1-\eta^2)\frac{\partial}{\partial\eta}\right)\\ +{}& \left( \frac1{\xi^2-1}+\frac1{1-\eta^2} \right)\frac{\partial^2}{\partial\phi^2} \Bigg]. \end{aligned} \]

The crucial feature is the common factor \((\xi^2-\eta^2)^{-1}\), which also appears in the Coulomb potential. Multiplying the Schrödinger equation by \(R^2(\xi^2-\eta^2)\) therefore allows the coordinate dependence to be separated.

The separation ansatz

We seek solutions that can be written as products of functions of the individual coordinates:

\[ \psi(\xi,\eta,\phi) = \Lambda(\xi)\,M(\eta)\,\Phi(\phi). \]

Because the Hamiltonian is independent of the azimuthal angle \(\phi\), its dependence separates immediately. As in the hydrogen atom,

\[ \Phi(\phi)=e^{im\phi}, \qquad m=0,\pm1,\pm2,\ldots, \]

where the integer \(m\) follows from the requirement that the wave function be single-valued.

Consequently,

\[ \frac{\partial^2\Phi}{\partial\phi^2}=-m^2\Phi. \]

Inserting the product ansatz into the Schrödinger equation, dividing by \(\psi\), and collecting all terms that depend on \(\xi\) and \(\eta\) separately leads to

\[ \boxed{ F(\xi)+G(\eta)=0, } \]

with

\[ \begin{aligned} F(\xi)={}& \frac1{\Lambda} \frac{d}{d\xi} \left[(\xi^2-1)\frac{d\Lambda}{d\xi}\right] -\frac{m^2}{\xi^2-1} +2R\xi+\frac{R^2E_e}{2}\xi^2, \\[8pt] G(\eta)={}& \frac1M \frac{d}{d\eta} \left[(1-\eta^2)\frac{dM}{d\eta}\right] -\frac{m^2}{1-\eta^2} -\frac{R^2E_e}{2}\eta^2. \end{aligned} \]

This is the essential step in separating the variables: \(F\) depends only on \(\xi\), while \(G\) depends only on \(\eta\).

Since \(\xi\) and \(\eta\) are independent coordinates, their sum can vanish everywhere only if both functions are constant. For example, differentiating \(F(\xi)+G(\eta)=0\) with respect to \(\xi\) immediately gives \(dF/d\xi=0\).

We therefore introduce a separation constant \(A\) such that

\[ \boxed{ F(\xi)=A, \qquad G(\eta)=-A. } \]

The constant \(A\) is called the separation constant. Its value is determined, together with the energy \(E_e\), by requiring that both differential equations have physically acceptable solutions.

The separated equations

Substituting the definitions of \(F\) and \(G\) gives two ordinary differential equations:

\[ \boxed{ \begin{aligned} \frac{d}{d\xi} \left[(\xi^2-1)\frac{d\Lambda}{d\xi}\right] + \left[ \frac{R^2E_e}{2}\xi^2 +2R\xi -\frac{m^2}{\xi^2-1} -A \right]\Lambda &=0, \\[10pt] \frac{d}{d\eta} \left[(1-\eta^2)\frac{dM}{d\eta}\right] + \left[ -\frac{R^2E_e}{2}\eta^2 -\frac{m^2}{1-\eta^2} +A \right]M &=0. \end{aligned} } \tag{1}\]

The original three-dimensional partial differential equation has thus been reduced to two ordinary differential equations, together with the already determined azimuthal dependence \(e^{im\phi}\).

The two equations are linked through the same energy \(E_e\) and separation constant \(A\). For a given internuclear distance \(R\) and magnetic quantum number \(m\), we must find values of \(E_e\) and \(A\) for which both equations have physically acceptable solutions satisfying the appropriate boundary conditions.

Starting from the electronic Schrödinger equation in atomic units,

\[ \left[-\frac12\nabla^2 -\frac{4\xi}{R(\xi^2-\eta^2)} \right]\psi=E_e\psi, \]

we substitute the Laplacian in prolate spheroidal coordinates:

\[ \nabla^2= \frac{4}{R^2(\xi^2-\eta^2)} \left[ D_\xi+D_\eta+ \left( \frac1{\xi^2-1}+\frac1{1-\eta^2} \right)\partial_\phi^2 \right], \]

where, for compactness,

\[ D_\xi= \frac{\partial}{\partial\xi} \left[(\xi^2-1)\frac{\partial}{\partial\xi}\right], \qquad D_\eta= \frac{\partial}{\partial\eta} \left[(1-\eta^2)\frac{\partial}{\partial\eta}\right]. \]

The Schrödinger equation becomes

\[ -\frac{2}{R^2(\xi^2-\eta^2)} \left[ D_\xi+D_\eta+ \left( \frac1{\xi^2-1}+\frac1{1-\eta^2} \right)\partial_\phi^2 \right]\psi - \frac{4\xi}{R(\xi^2-\eta^2)}\psi =E_e\psi. \]

Multiplying by \(-R^2(\xi^2-\eta^2)/2\) gives

\[ \left[ D_\xi+D_\eta+ \left( \frac1{\xi^2-1}+\frac1{1-\eta^2} \right)\partial_\phi^2 \right]\psi +2R\xi\psi +\frac{R^2E_e}{2}(\xi^2-\eta^2)\psi =0. \]

Now insert the product ansatz

\[ \psi=\Lambda(\xi)M(\eta)e^{im\phi} \]

and use \(\partial_\phi^2\psi=-m^2\psi\).

Dividing by the wave function yields

\[ \begin{aligned} &\frac1{\Lambda} \frac{d}{d\xi} \left[(\xi^2-1)\frac{d\Lambda}{d\xi}\right] + \frac1M \frac{d}{d\eta} \left[(1-\eta^2)\frac{dM}{d\eta}\right]\\ &\quad -m^2\left( \frac1{\xi^2-1}+\frac1{1-\eta^2} \right) +2R\xi +\frac{R^2E_e}{2}(\xi^2-\eta^2) =0. \end{aligned} \]

Every term can now be assigned uniquely to either \(\xi\) or \(\eta\). Rearranging,

\[ \begin{aligned} \underbrace{ \frac1{\Lambda} \frac{d}{d\xi} \left[(\xi^2-1)\frac{d\Lambda}{d\xi}\right] -\frac{m^2}{\xi^2-1} +2R\xi+\frac{R^2E_e}{2}\xi^2 }_{F(\xi)} \\[6pt] + \underbrace{ \frac1M \frac{d}{d\eta} \left[(1-\eta^2)\frac{dM}{d\eta}\right] -\frac{m^2}{1-\eta^2} -\frac{R^2E_e}{2}\eta^2 }_{G(\eta)} =0. \end{aligned} \]

Because the two coordinates are independent, we must have

\[ F(\xi)=A, \qquad G(\eta)=-A. \]

Multiplying the first equation by \(\Lambda\) and the second by \(M\) produces the two ordinary differential equations shown above.

Physical interpretation

The separation constant \(A\) is related to the eigenvalues of the differential operators appearing in the separated Schrödinger equation. In the hydrogen atom, the angular dependence is governed by the orbital angular momentum operator \(\hat L^2\), whose eigenvalues are \(\ell(\ell+1)\) in atomic units.

For H\(_2^+\), the potential has only axial symmetry, so \(\hat L^2\) no longer commutes with the Hamiltonian. Consequently, \(\ell\) is not a good quantum number, and \(A\) is generally not equal to \(\ell(\ell+1)\).

In the united-atom limit \(R\to0\), spherical symmetry is restored. The angular equation then reduces to the eigenvalue equation for \(\hat L^2\), and

\[ A\longrightarrow\ell(\ell+1). \]

The system then approaches the electronic structure of the helium ion He\(^+\).

In the opposite limit \(R\to\infty\), the electron becomes localized around one of the widely separated protons, and the lowest electronic energy approaches that of an isolated hydrogen atom. The dissociation products are therefore H and H\(^+\).

The important lesson is that the choice of coordinates determines whether the symmetries and mathematical structure of a problem can be exploited to simplify the Schrödinger equation.


4. Angular Momentum and Reflection Symmetries in H\(_2^+\)

In the hydrogen atom, the potential depends only on the radial distance \(r\), so the Hamiltonian commutes with both \(\hat{L}^2\) and \(\hat{L}_z\). This implies full rotational symmetry and allows eigenstates to be labeled by the quantum numbers \((\ell, m)\) of total and projected orbital angular momentum.

For the hydrogen molecular ion H\(_2^+\), this symmetry is partially broken. The potential \[ V(\vec{r}) = -\frac{e^2}{4\pi\varepsilon_0}\!\left(\frac{1}{r_A} + \frac{1}{r_B}\right) \] depends on the distances to two fixed nuclei, not on the total radius \(r = |\vec{r}|\) from a single center. As a result, the Hamiltonian is not spherically symmetric but only axially symmetric about the internuclear axis (the \(z\)-axis).


4.1 Loss of Spherical Symmetry

Mathematically, this means that the total orbital angular momentum operator \[ \hat{L}^2 = -\hbar^2\!\left[ \frac{1}{\sin\theta}\frac{\partial}{\partial\theta} \!\left(\sin\theta \frac{\partial}{\partial\theta}\right) + \frac{1}{\sin^2\theta}\frac{\partial^2}{\partial\phi^2} \right] \] does not commute with the Hamiltonian: \[ [\hat{H}_e, \hat{L}^2] \neq 0. \] A simple way to see this is to note that \(\hat{L}^2\) generates any rotation, whereas the potential is invariant only under rotations about the \(z\)-axis. By Noether’s theorem, conservation of a component of angular momentum corresponds to a rotational symmetry. Because the potential loses full spherical symmetry but retains axial symmetry, only the \(z\)-component of angular momentum remains conserved.


4.2 The Conserved Component \(\hat{L}_z\)

The \(z\)-component operator is \[ \hat{L}_z = -i\hbar\frac{\partial}{\partial\phi}. \] Since \(V(\vec{r})\) does not depend on the azimuthal angle \(\phi\), we have \[ [\hat{H}_e, \hat{L}_z] = 0. \] Therefore, the eigenfunctions of the Hamiltonian can be chosen to be simultaneous eigenfunctions of \(\hat{L}_z\), with eigenvalue \[ \hat{L}_z \psi = \hbar \lambda \psi. \]

The corresponding azimuthal dependence is \[ \Phi(\phi) = e^{i\lambda \phi}. \] Because the potential of H\(_2^+\) is invariant under reflection through any plane containing the molecular axis, the states with \(\lambda\) and \(-\lambda\) are physically equivalent and degenerate. Hence, it is conventional to define \(\lambda\) as a non-negative integer: \[ \lambda = 0, 1, 2, \ldots \] Only the absolute value of the angular momentum projection has physical meaning for this system.

The electronic Hamiltonian of H\(_2^+\) is invariant under reflection in any plane containing the molecular axis. To understand why this symmetry leads to the degeneracy of states with opposite angular momentum projections, we first need to examine how angular momentum transforms under reflection.

Ordinary vectors and reflections

Consider a reflection in the \(xz\)-plane:

\[ (x,y,z)\longrightarrow(x,-y,z). \]

An ordinary vector, such as position \(\vec r\) or linear momentum \(\vec p\), transforms in the same way:

\[ (V_x,V_y,V_z)\longrightarrow(V_x,-V_y,V_z). \]

The component perpendicular to the mirror plane changes sign, while the two components parallel to the plane remain unchanged. Such vectors are called polar vectors.

Angular momentum behaves differently

Orbital angular momentum is defined by the cross product

\[ \vec L=\vec r\times\vec p. \]

In particular, its component along the molecular axis (\(z\)) is

\[ L_z=xp_y-yp_x. \]

Under reflection in the \(xz\)-plane, both \(\vec r\) and \(\vec p\) transform as ordinary vectors:

\[ (x,y,z)\longrightarrow(x,-y,z), \qquad (p_x,p_y,p_z)\longrightarrow(p_x,-p_y,p_z). \]

Now consider the three components of orbital angular momentum:

\[ \begin{aligned} L_x &= yp_z-zp_y,\\ L_y &= zp_x-xp_z,\\ L_z &= xp_y-yp_x. \end{aligned} \]

Applying the reflection gives

\[ \boxed{ (L_x,L_y,L_z)\longrightarrow(-L_x,L_y,-L_z). } \]

Notice that the transformation is different from that of an ordinary vector: the component perpendicular to the mirror plane (\(L_y\)) remains unchanged, while the components parallel to the plane (\(L_x\) and \(L_z\)) reverse sign.

This transformation behavior is characteristic of an axial vector, or pseudovector. In particular, reflection in a plane containing the molecular axis reverses \(L_z\), the component relevant to the quantum number \(\lambda\).

Visualizing the reflection with a rotating wheel

Imagine a wheel rotating around the \(z\)-axis. Viewed along the positive \(z\)-direction, a counterclockwise rotation corresponds to angular momentum along \(+z\), according to the right-hand rule.

Now reflect the wheel in a plane containing its rotation axis. The reflected motion is clockwise, and the angular momentum therefore points along \(-z\).

The following illustration shows this reversal. The coordinates are drawn in the \(xy\)-plane, viewed along the molecular axis.

Reflection in the xz-plane reverses the sense of rotation and the axial angular momentum Lz.

The symbols \(\odot\) and \(\otimes\) indicate vectors pointing out of and into the page, respectively.

The important distinction is that angular momentum describes the orientation and sense of rotation. Under a mirror reflection, the handedness of the coordinate system reverses, and so does the transformation behavior of the cross product \(\vec r\times\vec p\).

Comparing polar and axial vectors under reflection

The rotating wheel illustrates how reflection reverses angular momentum along the rotation axis. We can now generalize this observation by comparing how polar vectors and axial vectors transform under the same reflection.

Again consider reflection in the \(xz\)-plane, which changes \(y\to-y\) while leaving \(x\) and \(z\) unchanged.

For an ordinary (polar) vector, the component perpendicular to the mirror plane changes sign, whereas the components parallel to the plane remain unchanged:

\[ (V_x,V_y,V_z)\longrightarrow(V_x,-V_y,V_z). \]

For an axial vector, such as angular momentum, the behavior is reversed: the component perpendicular to the mirror plane remains unchanged, while the components parallel to the plane change sign:

\[ (A_x,A_y,A_z)\longrightarrow(-A_x,A_y,-A_z). \]

The following figure compares these transformations for vectors oriented parallel, perpendicular, and diagonally to the mirror plane. The blue arrows represent the original vectors, and the orange arrows their reflected counterparts.

Comparison of polar and axial vector transformations under reflection in the xz-plane. Blue arrows represent the original vectors; orange arrows represent their reflected counterparts.

The comparison illustrates the defining distinction between polar and axial vectors under reflection. Under ordinary rotations, both types of vectors transform identically; their different behavior becomes apparent only under transformations that reverse spatial orientation, such as reflections.

This difference can be expressed mathematically through the transformation properties of the cross product, as derived in the box below.

We have seen that angular momentum transforms differently from an ordinary vector under reflection. We can derive this behavior directly from its definition

\[ \vec L=\vec r\times\vec p. \]

The key is to understand how a cross product transforms under rotations and reflections.

Statement: Transformation of a cross product

Let \(M\) be an orthogonal matrix describing a rotation or reflection, so that \(M^TM=I\). Then, for any two vectors \(\vec a\) and \(\vec b\),

\[ \boxed{ (M\vec a)\times(M\vec b) = \det(M)\,M(\vec a\times\vec b). } \]

The factor \(\det(M)\) distinguishes transformations that preserve orientation from those that reverse it:

  • Rotations: \(\det(M)=+1\). The cross product transforms like an ordinary vector.
  • Reflections: \(\det(M)=-1\). The cross product acquires an additional minus sign.

This is precisely the property that characterizes an axial vector, or pseudovector.

Proof

The proof relies on the geometric interpretation of the scalar triple product,

\[ (\vec a\times\vec b)\cdot\vec c, \]

which gives the signed volume of the parallelepiped spanned by three vectors.

Under a linear transformation \(M\), signed volumes are multiplied by \(\det(M)\). Therefore,

\[ [(M\vec a)\times(M\vec b)]\cdot(M\vec c) = \det(M)\,(\vec a\times\vec b)\cdot\vec c. \]

Because \(M\) is orthogonal, it preserves scalar products:

\[ (M\vec u)\cdot(M\vec v)=\vec u\cdot\vec v. \]

We can thus rewrite the right-hand side as

\[ [\det(M)\,M(\vec a\times\vec b)]\cdot(M\vec c). \]

Comparing both sides, we obtain

\[ [(M\vec a)\times(M\vec b)]\cdot(M\vec c) = [\det(M)\,M(\vec a\times\vec b)]\cdot(M\vec c). \]

Since this equality holds for every vector \(\vec c\), and \(M\) is invertible, the vectors inside the scalar products must be equal:

\[ \boxed{ (M\vec a)\times(M\vec b) = \det(M)\,M(\vec a\times\vec b). } \]

This completes the proof.

Why does the determinant distinguish rotations and reflections?

For an orthogonal matrix,

\[ M^TM=I. \]

Taking determinants gives

\[ \det(M^T)\det(M)=1. \]

Since \(\det(M^T)=\det(M)\),

\[ \boxed{\det(M)=\pm1.} \]

The determinant measures how a transformation changes oriented volume:

  • A positive determinant preserves the handedness of the coordinate system.
  • A negative determinant reverses its handedness.

Because rotations preserve handedness, they have determinant \(+1\). Reflections reverse handedness and have determinant \(-1\).

Thus, the additional sign in the cross-product transformation law reflects the reversal of spatial orientation.

Application to angular momentum

Since both \(\vec r\) and \(\vec p\) are ordinary vectors, the transformation law immediately gives

\[ \begin{aligned} \vec L' &=(M\vec r)\times(M\vec p)\\ &=\det(M)\,M(\vec r\times\vec p). \end{aligned} \]

Therefore,

\[ \boxed{ \vec L'=\det(M)\,M\vec L. } \]

For reflection in the \(xz\)-plane,

\[ M= \begin{pmatrix} 1&0&0\\ 0&-1&0\\ 0&0&1 \end{pmatrix}, \qquad \det(M)=-1, \]

so

\[ \begin{pmatrix} L_x'\\L_y'\\L_z' \end{pmatrix} = - \begin{pmatrix} 1&0&0\\ 0&-1&0\\ 0&0&1 \end{pmatrix} \begin{pmatrix} L_x\\L_y\\L_z \end{pmatrix} = \begin{pmatrix} -L_x\\L_y\\-L_z \end{pmatrix}. \]

As expected, the angular momentum component along the molecular axis reverses sign under reflection in a plane containing that axis.

Application to the molecular angular momentum

In H\(_2^+\), the molecular axis defines the \(z\)-direction. The electronic orbital angular momentum projection satisfies

\[ \hat L_z\psi_\lambda =\lambda\hbar\,\psi_\lambda. \]

Consider the reflection operator \(\hat{\sigma}_v\) associated with the \(xz\)-plane. Since this reflection reverses the azimuthal angle,

\[ \phi\longrightarrow-\phi, \]

the angular part of the wave function transforms as

\[ e^{i\lambda\phi} \longrightarrow e^{-i\lambda\phi}. \]

Therefore, reflection maps a state with angular momentum projection \(+\lambda\hbar\) onto a state with projection \(-\lambda\hbar\):

\[ \boxed{ \hat{\sigma}_v\psi_\lambda \propto\psi_{-\lambda}. } \]

This is consistent with the transformation of angular momentum derived above.

The rotating-wheel picture is a classical analogy for the direction of angular momentum. A quantum state with definite \(L_z\) does not describe an electron following a definite circular trajectory; instead, its azimuthal dependence carries the corresponding angular momentum projection.

Why the energies are equal

The final step follows from the symmetry of the Hamiltonian. Because reflecting the entire system in a plane containing the molecular axis leaves the two-center Coulomb potential unchanged,

\[ [\hat H_e,\hat{\sigma}_v]=0. \]

Suppose that \(\psi_\lambda\) is an energy eigenstate:

\[ \hat H_e\psi_\lambda=E_\lambda\psi_\lambda. \]

Applying the reflection operator gives

\[ \begin{aligned} \hat H_e(\hat{\sigma}_v\psi_\lambda) &=\hat{\sigma}_v\hat H_e\psi_\lambda\\ &=E_\lambda(\hat{\sigma}_v\psi_\lambda). \end{aligned} \]

Thus, the reflected state has the same energy as the original state, but the opposite angular momentum projection:

\[ \boxed{ E_{+\lambda}=E_{-\lambda}. } \]

For \(\lambda\neq0\), these are distinct states and are therefore degenerate. For \(\lambda=0\), reflection does not produce a different value of the angular momentum projection, so this argument does not imply a twofold degeneracy.

This degeneracy follows directly from reflection symmetry and is a general property of cylindrically symmetric, reflection-invariant systems.


4.3 Molecular Angular Momentum Labels

The quantum number \(\lambda\) specifies the magnitude of the orbital angular momentum projection along the internuclear axis.
Since \(\lambda \ge 0\) by convention, the total angular momentum quantum number \(\ell\) no longer appears explicitly.

Spectroscopically, the values of \(\lambda\) are denoted by Greek letters: \[ \begin{array}{c|c} \lambda & \text{Label} \\ \hline 0 & \sigma \\ 1 & \pi \\ 2 & \delta \\ 3 & \phi \\ \vdots & \vdots \end{array} \] Thus, \(\lambda = 0\) corresponds to a \(\sigma\) state, \(\lambda = 1\) to a \(\pi\) state, and so on.
In this chapter we avoid using the symbol \(\sigma\) to denote spin (Pauli matrices) to prevent confusion.

The labels \(\sigma\), \(\pi\), \(\delta\), etc. are also widely used to describe molecular orbitals and chemical bonds in more complex molecules. However, their precise meaning depends on the symmetry of the molecule.

Linear molecules: For a linear molecule, such as H\(_2^+\), N\(_2\), or CO\(_2\), the Hamiltonian is invariant under rotations about the molecular axis. The projection of orbital angular momentum onto that axis is therefore conserved, and molecular orbitals can be classified by \(\Lambda=|\lambda|\):

\[ \Lambda=0,1,2,3,\ldots \quad\longrightarrow\quad \sigma,\pi,\delta,\phi,\ldots \]

These are rigorous symmetry labels associated with the rotational symmetry of the molecular Hamiltonian.

Nonlinear molecules: In molecules without continuous rotational symmetry, such as ethylene (C\(_2\)H\(_4\)) or benzene (C\(_6\)H\(_6\)), the projection of orbital angular momentum onto a chosen axis is generally not conserved. Nevertheless, the terms sigma and pi remain widely used to describe the symmetry and spatial character of molecular orbitals and bonds.

For example, the carbon–carbon double bond in ethylene consists of:

  • A \(\sigma\) bond, formed primarily by orbital overlap along the C–C bond axis.
  • A \(\pi\) bond, formed by the sideways overlap of two carbon \(p\) orbitals, with a nodal plane containing the C–C bond axis.

In this context, the labels describe the bonding geometry and orbital symmetry rather than eigenvalues of \(\hat L_z\).

Thus, while the terminology is closely related, \(\sigma\) and \(\pi\) are exact angular-momentum-projection classifications for linear molecules, but are used more broadly to characterize bonding in nonlinear molecules.


4.4 Including Electron Spin

Each electronic state is further characterized by the spin projection quantum number \(m_s = \pm \tfrac{1}{2}\). The spin and orbital projections are often combined to describe the total angular momentum projection along the molecular axis \[ \Omega = |\lambda + m_s|. \] For H\(_2^+\), which has only one electron, this simply distinguishes spin-up and spin-down components for each orbital state.


4.5 Inversion Symmetry: Gerade and Ungerade

An additional symmetry of H\(_2^+\) is inversion through the midpoint between the two nuclei. Choosing this point as the origin, inversion transforms the electron coordinates according to

\[ (x,y,z)\longrightarrow(-x,-y,-z), \]

or, equivalently,

\[ \vec r\longrightarrow-\vec r. \]

This operation interchanges the two identical nuclei and leaves the electronic Hamiltonian unchanged. Consequently, the Hamiltonian commutes with the parity operator \(\hat P\):

\[ [\hat H_e,\hat P]=0. \]

Since applying inversion twice returns every point to its original position, \(\hat P^2=1\). Its eigenvalues must therefore be \(+1\) or \(-1\). The electronic energy eigenstates can be chosen to have definite inversion parity:

\[ \boxed{ \hat P\psi(\vec r)=\psi(-\vec r) = \begin{cases} +\psi(\vec r) & \text{gerade (g)},\\ -\psi(\vec r) & \text{ungerade (u)}. \end{cases} } \]

The German terms gerade (even) and ungerade (odd) describe whether the wave function remains unchanged or reverses sign under inversion.

Connection to molecular bonding

The distinction becomes particularly intuitive when considering the electron density between the two nuclei.

For an ungerade wave function,

\[ \psi(-\vec r)=-\psi(\vec r). \]

At the inversion center, where \(\vec r=0\), this requires

\[ \psi(0)=-\psi(0) \quad\Longrightarrow\quad \boxed{\psi(0)=0.} \]

Thus, an ungerade orbital must have a node at the center of inversion.

For the lowest \(\sigma_u\) orbital of H\(_2^+\), the wave function is antisymmetric under reflection in the plane halfway between the nuclei. Consequently, the entire midplane is a nodal plane, and the electron density vanishes there.

This is closely connected to the distinction between bonding and antibonding molecular orbitals:

  • The lowest \(1s\sigma_g\) orbital is symmetric under inversion. Its wave function has the same sign around both nuclei, allowing constructive overlap and enhanced electron density between them. This favors bonding.
  • The \(2p\sigma_u\) orbital is antisymmetric under inversion. Its wave function changes sign between the nuclei and has a nodal plane at their midpoint. The absence of electron density in this region contributes to its antibonding character.

We will examine this connection more quantitatively using the linear combination of atomic orbitals (LCAO) method in the next chapter.

The \(g/u\) classification is not restricted to homonuclear diatomic molecules. It can be used whenever the molecular Hamiltonian has inversion symmetry.

For a homonuclear diatomic molecule, such as H\(_2^+\), N\(_2\), or O\(_2\), inversion through the midpoint exchanges the two identical nuclei and leaves the molecular structure unchanged. Heteronuclear diatomic molecules, such as CO or HCl, do not possess this symmetry.

However, larger molecules can also have a center of inversion. Examples include:

  • CO\(_2\): Inversion through the central carbon atom exchanges the two oxygen atoms.
  • Benzene (C\(_6\)H\(_6\)): Inversion through the center of the molecular ring maps the molecule onto itself.
  • Ethylene (C\(_2\)H\(_4\)): In its planar equilibrium geometry, inversion through the midpoint of the C–C bond leaves the molecular structure unchanged.

In all these cases, electronic orbitals can be classified as gerade or ungerade according to their behavior under inversion.

The general requirement is therefore inversion symmetry, rather than the presence of identical atoms throughout the molecule.


Summary

  • The H\(_2^+\) Hamiltonian is not spherically symmetric, so total \(L\) is not conserved.
  • The system remains axially symmetric, so \(L_z\) is conserved.
  • Molecular states are labeled by the quantum number \(\lambda\) (orbital angular momentum projection) and spin projection \(m_s\).
  • The familiar spectroscopic notation (\(\sigma\), \(\pi\), \(\delta\), …) reflects the value of \(|\lambda|\).

This framework connects directly to the structure of the potential energy curves discussed in the next section.


5. The Energy Eigenvalues

While we will not attempt to solve the coupled differential equations (1) explicitly here, we can discuss the structure and qualitative behavior of the energy eigenvalues.

Just as in the atomic hydrogen problem, the stationary Schrödinger equation admits only discrete eigenvalues for bound electronic states. These discrete levels arise because the wavefunction must remain finite and single-valued—boundary conditions that can only be satisfied for specific energy values.

However, there is an important difference compared to the atomic case. For the hydrogen molecular ion, the internuclear distance \(R\) enters the Hamiltonian explicitly. In the Born–Oppenheimer approximation, the nuclei are treated as fixed in space, so \(R\) acts merely as a parameter in the electronic Schrödinger equation.

For each fixed value of \(R\), we can solve the electronic problem and obtain a discrete set of eigenvalues: \[ E_n(R), \quad n = 1, 2, 3, \ldots \]

If we now plot these electronic energies as a function of \(R\), we obtain the potential energy curves for the molecule. These curves determine how the total molecular energy changes as the nuclei move relative to one another.

At certain distances, one of the potential curves may exhibit a minimum—indicating a stable or quasi-stable equilibrium separation. Such a minimum corresponds to a bound molecular state. Higher-lying curves may be purely repulsive or correspond to excited electronic configurations that dissociate more easily.

Below is an illustrative plot showing four typical potential energy curves for H\(_2^+\), labeled according to their symmetry.

Code
"""H2+ Born-Oppenheimer curves, from numerical finite differences.
Atomic units throughout: length a0, energy Hartree.
"""
import numpy as np
import matplotlib.pyplot as plt
from scipy.sparse import diags, eye, kron
from scipy.sparse.linalg import eigsh
from numpy.polynomial.legendre import leggauss
from scipy.interpolate import CubicSpline

plt.rcParams['text.usetex'] = True
plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.size'] = 12


# Numerical controls (refine for convergence)
NR, NZ = 100, 171
RHO_MAX, Z_MAX = 14.0, 20.0   # in Bohr radii
# DISTANCES = np.linspace(0.4, 9.0, 30)  # internuclear distance, a0

# More points at small R, fewer at large R
t = np.linspace(0, 1, 20)
DISTANCES = 0.4 + (9.0 - 0.4) * t**2



R_fine = np.linspace(DISTANCES.min(), DISTANCES.max(), 500)



def electronic_levels(R, m, k=5):
    """Return low electronic eigenvalues classified by z-reflection parity.

    psi(rho,z,phi) = u(rho,z)*exp(i*m*phi).
    H_m = -1/(2*rho)*d_rho(rho*d_rho) - 1/2*d_z^2
          + m**2/(2*rho**2) - 1/r_A - 1/r_B.

    Finite-volume radial Laplacian on cell centers rho=(i+1/2)*dr,
    transformed with sqrt(rho) to a real symmetric matrix.
    """
    dr = RHO_MAX / NR
    dz = 2 * Z_MAX / (NZ + 1)
    rho = (np.arange(NR) + 0.5) * dr
    z = (np.arange(NZ) + 1) * dz - Z_MAX

    rho_plus = (np.arange(NR) + 1) * dr
    rho_minus = np.arange(NR) * dr
    rad_diag = (rho_plus + rho_minus) / (2 * rho * dr**2)
    rad_off = -rho_plus[:-1] / (2 * dr**2 * np.sqrt(rho[:-1] * rho[1:]))
    radial = diags([rad_off, rad_diag, rad_off], [-1, 0, 1], format='csr')

    axial = diags(
        [-np.ones(NZ-1)/(2*dz**2), np.ones(NZ)/dz**2,
         -np.ones(NZ-1)/(2*dz**2)],
        [-1, 0, 1], format='csr'
    )
    kinetic = kron(eye(NZ, format='csr'), radial, format='csr') + \
              kron(axial, eye(NR, format='csr'), format='csr')

    rr = rho[None, :]
    zz = z[:, None]
    # Cell-average Coulomb attraction, weighted by cylindrical volume rho*d(rho)*dz.
    # This avoids artificial spikes when a nuclear singularity crosses grid nodes.
    qx, qw = leggauss(5)
    coulomb = np.zeros((NZ, NR))
    for a, wa in zip(qx, qw):
        rq = rr + 0.5 * dr * a
        for b, wb in zip(qx, qw):
            zq = zz + 0.5 * dz * b
            vq = -1 / np.hypot(rq, zq - R/2) - 1 / np.hypot(rq, zq + R/2)
            coulomb += wa * wb * (rq / rr) * vq * 0.25
    potential = coulomb + m**2 / (2 * rr**2)
    H = kinetic + diags(potential.ravel(), format='csr')

    eigvals, eigvecs = eigsh(H, k=k, which='SA', tol=1e-8)
    levels = {}
    for n, energy in enumerate(eigvals):
        u = eigvecs[:, n].reshape(NZ, NR)
        parity = np.vdot(u, u[::-1, :]).real / np.vdot(u, u).real
        if abs(parity) < 0.85:
            raise RuntimeError('Parity not resolved; increase the grid or eigenpair count')
        label = 'even' if parity > 0 else 'odd'
        if label not in levels or energy < levels[label]:
            levels[label] = float(energy)
    if len(levels) != 2:
        raise RuntimeError('Both reflection parities not found; increase k')
    return levels


if __name__ == '__main__':
    curves = {'1s sigma_g': [], '2p sigma_u': [],
              '2p pi_u': [], '3d pi_g': []}
    for R in DISTANCES:
        sigma = electronic_levels(R, m=0, k=3)
        pi = electronic_levels(R, m=1, k=3)
        # Under inversion (z -> -z, phi -> phi+pi), total parity is (-1)^m
        # times z-reflection parity. Thus m=1, even-z corresponds to ungerade.
        curves['1s sigma_g'].append(sigma['even'] + 1/R)
        curves['2p sigma_u'].append(sigma['odd'] + 1/R)
        curves['2p pi_u'].append(pi['even'] + 1/R)
        curves['3d pi_g'].append(pi['odd'] + 1/R)
        # print(f'R={R:5.2f} a0  1sigma_g={curves["1s sigma_g"][-1]: .6f} Eh', flush=True)

    fig, ax = plt.subplots(figsize=(9, 5.5))
    labels = {'1s sigma_g': r'$1s\sigma_g$', '2p sigma_u': r'$2p\sigma_u$',
              '2p pi_u': r'$2p\pi_u$', '3d pi_g': r'$3d\pi_g$'}

    for key, color in zip(curves, ['tab:blue', 'tab:red', 'tab:green', 'tab:orange']):
        energies_ry = 2 * np.asarray(curves[key])
        spline = CubicSpline(DISTANCES, energies_ry)

        ax.plot(R_fine, spline(R_fine), lw=2.3,
                color=color, label=labels[key])

    ax.axhline(-1, color='0.55', ls=':', lw=1,
               label=r'H(1s) + H$^+$ dissociation limit')
    ax.set(xlabel=r'Internuclear distance $R$ ($a_0$)',
           ylabel='Born–Oppenheimer energy (Ry)',
           xlim=(0, DISTANCES[-1]), ylim=(-1.4, 1.2))
    ax.grid(alpha=0.25)
    ax.legend(loc='upper right')
    fig.tight_layout()
    plt.show()

H2+ Born-Oppenheimer curves, from numerical finite differences.

At small internuclear separations (\(R\to0\)), the nuclear repulsion \(1/R\) dominates, causing the total Born–Oppenheimer energies to rise steeply. At large separations (\(R\to\infty\)), the potential-energy curves approach their respective atomic dissociation limits: H(1s) + H\(^+\) for the two lowest \(\sigma\) states, and H(\(n=2\)) + H\(^+\) for the two \(\pi\) states.

The lowest curve, corresponding to the \(1s\sigma_g\) state, exhibits a pronounced potential minimum near \(R=2a_0\), indicating a stable molecular ion. The excited-state curves show more complicated behavior. Although they appear predominantly repulsive in the present calculation, solving the same Schrödinger equation with higher numerical accuracy reveals shallow potential wells in some excited states, particularly at larger internuclear separations. These features may not be resolved with the finite spatial grid and limited range of internuclear distances used here.