123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- from sympy.core.numbers import Float
- from sympy.core.singleton import S
- from sympy.functions.combinatorial.factorials import factorial
- from sympy.functions.elementary.exponential import exp
- from sympy.functions.elementary.miscellaneous import sqrt
- from sympy.functions.special.polynomials import assoc_laguerre
- from sympy.functions.special.spherical_harmonics import Ynm
- def R_nl(n, l, r, Z=1):
- """
- Returns the Hydrogen radial wavefunction R_{nl}.
- Parameters
- ==========
- n : integer
- Principal Quantum Number which is
- an integer with possible values as 1, 2, 3, 4,...
- l : integer
- ``l`` is the Angular Momentum Quantum Number with
- values ranging from 0 to ``n-1``.
- r :
- Radial coordinate.
- Z :
- Atomic number (1 for Hydrogen, 2 for Helium, ...)
- Everything is in Hartree atomic units.
- Examples
- ========
- >>> from sympy.physics.hydrogen import R_nl
- >>> from sympy.abc import r, Z
- >>> R_nl(1, 0, r, Z)
- 2*sqrt(Z**3)*exp(-Z*r)
- >>> R_nl(2, 0, r, Z)
- sqrt(2)*(-Z*r + 2)*sqrt(Z**3)*exp(-Z*r/2)/4
- >>> R_nl(2, 1, r, Z)
- sqrt(6)*Z*r*sqrt(Z**3)*exp(-Z*r/2)/12
- For Hydrogen atom, you can just use the default value of Z=1:
- >>> R_nl(1, 0, r)
- 2*exp(-r)
- >>> R_nl(2, 0, r)
- sqrt(2)*(2 - r)*exp(-r/2)/4
- >>> R_nl(3, 0, r)
- 2*sqrt(3)*(2*r**2/9 - 2*r + 3)*exp(-r/3)/27
- For Silver atom, you would use Z=47:
- >>> R_nl(1, 0, r, Z=47)
- 94*sqrt(47)*exp(-47*r)
- >>> R_nl(2, 0, r, Z=47)
- 47*sqrt(94)*(2 - 47*r)*exp(-47*r/2)/4
- >>> R_nl(3, 0, r, Z=47)
- 94*sqrt(141)*(4418*r**2/9 - 94*r + 3)*exp(-47*r/3)/27
- The normalization of the radial wavefunction is:
- >>> from sympy import integrate, oo
- >>> integrate(R_nl(1, 0, r)**2 * r**2, (r, 0, oo))
- 1
- >>> integrate(R_nl(2, 0, r)**2 * r**2, (r, 0, oo))
- 1
- >>> integrate(R_nl(2, 1, r)**2 * r**2, (r, 0, oo))
- 1
- It holds for any atomic number:
- >>> integrate(R_nl(1, 0, r, Z=2)**2 * r**2, (r, 0, oo))
- 1
- >>> integrate(R_nl(2, 0, r, Z=3)**2 * r**2, (r, 0, oo))
- 1
- >>> integrate(R_nl(2, 1, r, Z=4)**2 * r**2, (r, 0, oo))
- 1
- """
- # sympify arguments
- n, l, r, Z = map(S, [n, l, r, Z])
- # radial quantum number
- n_r = n - l - 1
- # rescaled "r"
- a = 1/Z # Bohr radius
- r0 = 2 * r / (n * a)
- # normalization coefficient
- C = sqrt((S(2)/(n*a))**3 * factorial(n_r) / (2*n*factorial(n + l)))
- # This is an equivalent normalization coefficient, that can be found in
- # some books. Both coefficients seem to be the same fast:
- # C = S(2)/n**2 * sqrt(1/a**3 * factorial(n_r) / (factorial(n+l)))
- return C * r0**l * assoc_laguerre(n_r, 2*l + 1, r0).expand() * exp(-r0/2)
- def Psi_nlm(n, l, m, r, phi, theta, Z=1):
- """
- Returns the Hydrogen wave function psi_{nlm}. It's the product of
- the radial wavefunction R_{nl} and the spherical harmonic Y_{l}^{m}.
- Parameters
- ==========
- n : integer
- Principal Quantum Number which is
- an integer with possible values as 1, 2, 3, 4,...
- l : integer
- ``l`` is the Angular Momentum Quantum Number with
- values ranging from 0 to ``n-1``.
- m : integer
- ``m`` is the Magnetic Quantum Number with values
- ranging from ``-l`` to ``l``.
- r :
- radial coordinate
- phi :
- azimuthal angle
- theta :
- polar angle
- Z :
- atomic number (1 for Hydrogen, 2 for Helium, ...)
- Everything is in Hartree atomic units.
- Examples
- ========
- >>> from sympy.physics.hydrogen import Psi_nlm
- >>> from sympy import Symbol
- >>> r=Symbol("r", positive=True)
- >>> phi=Symbol("phi", real=True)
- >>> theta=Symbol("theta", real=True)
- >>> Z=Symbol("Z", positive=True, integer=True, nonzero=True)
- >>> Psi_nlm(1,0,0,r,phi,theta,Z)
- Z**(3/2)*exp(-Z*r)/sqrt(pi)
- >>> Psi_nlm(2,1,1,r,phi,theta,Z)
- -Z**(5/2)*r*exp(I*phi)*exp(-Z*r/2)*sin(theta)/(8*sqrt(pi))
- Integrating the absolute square of a hydrogen wavefunction psi_{nlm}
- over the whole space leads 1.
- The normalization of the hydrogen wavefunctions Psi_nlm is:
- >>> from sympy import integrate, conjugate, pi, oo, sin
- >>> wf=Psi_nlm(2,1,1,r,phi,theta,Z)
- >>> abs_sqrd=wf*conjugate(wf)
- >>> jacobi=r**2*sin(theta)
- >>> integrate(abs_sqrd*jacobi, (r,0,oo), (phi,0,2*pi), (theta,0,pi))
- 1
- """
- # sympify arguments
- n, l, m, r, phi, theta, Z = map(S, [n, l, m, r, phi, theta, Z])
- # check if values for n,l,m make physically sense
- if n.is_integer and n < 1:
- raise ValueError("'n' must be positive integer")
- if l.is_integer and not (n > l):
- raise ValueError("'n' must be greater than 'l'")
- if m.is_integer and not (abs(m) <= l):
- raise ValueError("|'m'| must be less or equal 'l'")
- # return the hydrogen wave function
- return R_nl(n, l, r, Z)*Ynm(l, m, theta, phi).expand(func=True)
- def E_nl(n, Z=1):
- """
- Returns the energy of the state (n, l) in Hartree atomic units.
- The energy doesn't depend on "l".
- Parameters
- ==========
- n : integer
- Principal Quantum Number which is
- an integer with possible values as 1, 2, 3, 4,...
- Z :
- Atomic number (1 for Hydrogen, 2 for Helium, ...)
- Examples
- ========
- >>> from sympy.physics.hydrogen import E_nl
- >>> from sympy.abc import n, Z
- >>> E_nl(n, Z)
- -Z**2/(2*n**2)
- >>> E_nl(1)
- -1/2
- >>> E_nl(2)
- -1/8
- >>> E_nl(3)
- -1/18
- >>> E_nl(3, 47)
- -2209/18
- """
- n, Z = S(n), S(Z)
- if n.is_integer and (n < 1):
- raise ValueError("'n' must be positive integer")
- return -Z**2/(2*n**2)
- def E_nl_dirac(n, l, spin_up=True, Z=1, c=Float("137.035999037")):
- """
- Returns the relativistic energy of the state (n, l, spin) in Hartree atomic
- units.
- The energy is calculated from the Dirac equation. The rest mass energy is
- *not* included.
- Parameters
- ==========
- n : integer
- Principal Quantum Number which is
- an integer with possible values as 1, 2, 3, 4,...
- l : integer
- ``l`` is the Angular Momentum Quantum Number with
- values ranging from 0 to ``n-1``.
- spin_up :
- True if the electron spin is up (default), otherwise down
- Z :
- Atomic number (1 for Hydrogen, 2 for Helium, ...)
- c :
- Speed of light in atomic units. Default value is 137.035999037,
- taken from http://arxiv.org/abs/1012.3627
- Examples
- ========
- >>> from sympy.physics.hydrogen import E_nl_dirac
- >>> E_nl_dirac(1, 0)
- -0.500006656595360
- >>> E_nl_dirac(2, 0)
- -0.125002080189006
- >>> E_nl_dirac(2, 1)
- -0.125000416028342
- >>> E_nl_dirac(2, 1, False)
- -0.125002080189006
- >>> E_nl_dirac(3, 0)
- -0.0555562951740285
- >>> E_nl_dirac(3, 1)
- -0.0555558020932949
- >>> E_nl_dirac(3, 1, False)
- -0.0555562951740285
- >>> E_nl_dirac(3, 2)
- -0.0555556377366884
- >>> E_nl_dirac(3, 2, False)
- -0.0555558020932949
- """
- n, l, Z, c = map(S, [n, l, Z, c])
- if not (l >= 0):
- raise ValueError("'l' must be positive or zero")
- if not (n > l):
- raise ValueError("'n' must be greater than 'l'")
- if (l == 0 and spin_up is False):
- raise ValueError("Spin must be up for l==0.")
- # skappa is sign*kappa, where sign contains the correct sign
- if spin_up:
- skappa = -l - 1
- else:
- skappa = -l
- beta = sqrt(skappa**2 - Z**2/c**2)
- return c**2/sqrt(1 + Z**2/(n + skappa + beta)**2/c**2) - c**2
|