misc/python/bohr.py
2018-08-05 18:53:07 +02:00

109 lines
2.0 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env nix-script
#!>python3
#! python3 | sympy
from sympy.physics.units import *
from sympy import symbols, solve, Eq, pi
##
## Bohr model for the hydrogen atom
##
# Constants
ε_0, e, m_e, h, c, π = symbols('ε_0 e m_e h c π')
values = {
e : 1.602176565e-19 * C,
m_e: 9.10938291e-31 * kg,
h : planck,
ε_0: electric_constant,
c : speed_of_light,
π : pi }
# Variables
v, r, λ, ν, n = symbols('v r λ v n')
##
## Electron velocity
##
# Coulomb force is a centripetal force
F_c = m_e * v**2/r
F = 1/(4*π*ε_0) * e**2 / r**2
# Equate and solve for the velocity (taking the positive solution)
v = solve(Eq(F_c, F), v)[1]
##
## Energy levels
##
# Total energy of the electron
U = -e**2 / (4*π * ε_0 * r)
K = m_e * v**2 / 2
E = U + K
# De Broglie wavelength of the electron
λ = h / (m_e*v)
# Hypothesize the orbits are quantized
C_o = 2*π * r
C_q = n * λ
# Solve for the radius
r_n = solve(Eq(C_o, C_q), r)[0]
# Bohr radius is the radius of the first orbit
r_1 = r_n.subs(n, 1)
# Substitute r_n in the energy equation
E_n = E.subs(r, r_n)
# The ground state is lowest energy level
E_1 = E_n.subs(n, 1)
##
## Spectum of emission
##
# Energy of the emitted photon from PlanckEinstein relation
λ = symbols('λ')
ν = c/λ
E_γ = h*ν
# Energy radiated by the electron
# for n > m
E_n # initial state
E_m = E_n.subs(n, m) # final state
E = E_n - E_m
# Equate and solve for λ
λ = solve(Eq(E_γ, E), λ)[0]
# Find the inverse wavelength
λ_1 = 1/λ
# Substitute the Rydberg constant
R_h = e**4 * m_e / (8 * c * ε_0**2 * h**3)
λ_1 = λ_1.subs(R_h, symbols('R_h'))
value = lambda x: x.subs(values).evalf(10)
results = '''
Bohr radius: {r_1}{vr_1}
Ground state / Rydberg energy: {E_1}{vE_1}
Rydberg constant: {R_h}{vR_h}
Energy of the nth level: E_n = {E_n}
Rydberg equation: 1/λ = {λ_1}
''' .format(vr_1=value(r_1),
vE_1=value(E_1),
vR_h=value(R_h),
**locals()
).replace('**','^').replace('*', ' ')
print(results)