import numpy as np
import matplotlib.pyplot as plt
def solve_poisson_boltzmann(charge_density, epsilon, kappa, dx, max_iter=1000, tol=1e-6):
"""
Solve the Poisson-Boltzmann equation in 1D with Dirichlet boundary conditions.
Args:
- charge_density (ndarray): Array containing the charge density.
- epsilon (float): Dielectric constant of the medium.
- kappa (float): Inverse Debye length.
- dx (float): Grid spacing.
- max_iter (int): Maximum number of iterations for the solver.
- tol (float): Tolerance for convergence.
Returns:
- potential (ndarray): Array containing the electrostatic potential.
"""
n = len(charge_density)
potential = np.zeros(n)
for _ in range(max_iter):
old_potential = np.copy(potential)
for i in range(1, n - 1):
potential[i] = 0.5 * (old_potential[i - 1] + old_potential[i + 1] +
dx**2 / epsilon * charge_density[i] -
kappa**2 * np.sinh(old_potential[i]))
if np.max(np.abs(potential - old_potential)) < tol:
break
return potential
# Parameters
charge_density = np.array([0, 1, 0, -1, 0])
epsilon = 1.0
kappa = 0.1
dx = 1.0
# Solve Poisson-Boltzmann equation
potential = solve_poisson_boltzmann(charge_density, epsilon, kappa, dx)
# Plotting
plt.figure()
plt.plot(np.arange(len(charge_density)), charge_density, label='Charge Density')
plt.plot(np.arange(len(potential)), potential, label='Potential')
plt.xlabel('Position')
plt.ylabel('Value')
plt.legend()
plt.show()
aW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKCmRlZiBzb2x2ZV9wb2lzc29uX2JvbHR6bWFubihjaGFyZ2VfZGVuc2l0eSwgZXBzaWxvbiwga2FwcGEsIGR4LCBtYXhfaXRlcj0xMDAwLCB0b2w9MWUtNik6CiAgICAiIiIKICAgIFNvbHZlIHRoZSBQb2lzc29uLUJvbHR6bWFubiBlcXVhdGlvbiBpbiAxRCB3aXRoIERpcmljaGxldCBib3VuZGFyeSBjb25kaXRpb25zLgogICAgCiAgICBBcmdzOgogICAgLSBjaGFyZ2VfZGVuc2l0eSAobmRhcnJheSk6IEFycmF5IGNvbnRhaW5pbmcgdGhlIGNoYXJnZSBkZW5zaXR5LgogICAgLSBlcHNpbG9uIChmbG9hdCk6IERpZWxlY3RyaWMgY29uc3RhbnQgb2YgdGhlIG1lZGl1bS4KICAgIC0ga2FwcGEgKGZsb2F0KTogSW52ZXJzZSBEZWJ5ZSBsZW5ndGguCiAgICAtIGR4IChmbG9hdCk6IEdyaWQgc3BhY2luZy4KICAgIC0gbWF4X2l0ZXIgKGludCk6IE1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIHRoZSBzb2x2ZXIuCiAgICAtIHRvbCAoZmxvYXQpOiBUb2xlcmFuY2UgZm9yIGNvbnZlcmdlbmNlLgogICAgCiAgICBSZXR1cm5zOgogICAgLSBwb3RlbnRpYWwgKG5kYXJyYXkpOiBBcnJheSBjb250YWluaW5nIHRoZSBlbGVjdHJvc3RhdGljIHBvdGVudGlhbC4KICAgICIiIgogICAgbiA9IGxlbihjaGFyZ2VfZGVuc2l0eSkKICAgIHBvdGVudGlhbCA9IG5wLnplcm9zKG4pCiAgICBmb3IgXyBpbiByYW5nZShtYXhfaXRlcik6CiAgICAgICAgb2xkX3BvdGVudGlhbCA9IG5wLmNvcHkocG90ZW50aWFsKQogICAgICAgIGZvciBpIGluIHJhbmdlKDEsIG4gLSAxKToKICAgICAgICAgICAgcG90ZW50aWFsW2ldID0gMC41ICogKG9sZF9wb3RlbnRpYWxbaSAtIDFdICsgb2xkX3BvdGVudGlhbFtpICsgMV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHgqKjIgLyBlcHNpbG9uICogY2hhcmdlX2RlbnNpdHlbaV0gLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2FwcGEqKjIgKiBucC5zaW5oKG9sZF9wb3RlbnRpYWxbaV0pKQogICAgICAgIGlmIG5wLm1heChucC5hYnMocG90ZW50aWFsIC0gb2xkX3BvdGVudGlhbCkpIDwgdG9sOgogICAgICAgICAgICBicmVhawogICAgcmV0dXJuIHBvdGVudGlhbAoKIyBQYXJhbWV0ZXJzCmNoYXJnZV9kZW5zaXR5ID0gbnAuYXJyYXkoWzAsIDEsIDAsIC0xLCAwXSkKZXBzaWxvbiA9IDEuMAprYXBwYSA9IDAuMQpkeCA9IDEuMAoKIyBTb2x2ZSBQb2lzc29uLUJvbHR6bWFubiBlcXVhdGlvbgpwb3RlbnRpYWwgPSBzb2x2ZV9wb2lzc29uX2JvbHR6bWFubihjaGFyZ2VfZGVuc2l0eSwgZXBzaWxvbiwga2FwcGEsIGR4KQoKIyBQbG90dGluZwpwbHQuZmlndXJlKCkKcGx0LnBsb3QobnAuYXJhbmdlKGxlbihjaGFyZ2VfZGVuc2l0eSkpLCBjaGFyZ2VfZGVuc2l0eSwgbGFiZWw9J0NoYXJnZSBEZW5zaXR5JykKcGx0LnBsb3QobnAuYXJhbmdlKGxlbihwb3RlbnRpYWwpKSwgcG90ZW50aWFsLCBsYWJlbD0nUG90ZW50aWFsJykKcGx0LnhsYWJlbCgnUG9zaXRpb24nKQpwbHQueWxhYmVsKCdWYWx1ZScpCnBsdC5sZWdlbmQoKQpwbHQuc2hvdygp