5
\$\begingroup\$

Here is the formula for the deBroglie wavelength of an electron versus its kinetic energy: $$ \lambda(E_k) = h\left/\sqrt{\frac{(E_k+m_eC^2)^2-m_e^2C^4}{C^2}}\right.$$ and here is simple script that prints a CSV with plot data:

#!/usr/bin/python
import csv
from scipy import constants as spc
import numpy as np

vev = np.arange(1,1e6,100);
vWavelength = map( lambda n: \
               spc.h/np.sqrt( (np.power(spc.eV*n+spc.m_e*np.power(spc.c,2),2)-np.power(spc.m_e,2)*np.power(spc.c,4))/np.power(spc.c,2) ), \
               vev );
np.savetxt('plotdata/1a.csv', np.transpose(np.array([vev, vWavelength])));

The vWavelength line is abysmal, in my opinion. How can I make this code better?

\$\endgroup\$
0

1 Answer 1

9
\$\begingroup\$

First, simplify: factor out \$C^4\$ out of square root:

\$\lambda(E_k) = h\left/C\sqrt{(\frac{E_k}{C^2}+m_e)^2-m_e^2}\right.\$

Simplify even more: factor out \$m_e^2\$:

\$\lambda(E_k) = h\left/C m_e\sqrt{(\frac{E_k}{(C m_e)^2}+1)^2-1}\right.\$

Do not put everything in lambda:

# These are all constants; no need to recompute them.
# Consider putting them into a namespace.
# I didn't think too hard to figure appropriate names; my physics is too rusty

CM = spc.c * spc.me
e1 = spc.ev/(CM * CM)
scale = spc.h / CM

# This is an actual computation.
# Can be converted to lambda, but I strongly advise against.

def deBroglieWaveLength(n):
    arg = e1 * n + 1.0
    return scale / np.sqrt(arg * arg - 1)
\$\endgroup\$
2
  • \$\begingroup\$ Why avoid lambdas? \$\endgroup\$ Commented Mar 24, 2017 at 21:10
  • \$\begingroup\$ @enthdegree Mostly to give it a clear and definite name. \$\endgroup\$
    – vnp
    Commented Mar 24, 2017 at 21:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.