I’m doing the Stanford “Quantum Physics for Engineers” online course just now. Separately, a few months ago I was reading the Sussman “Structure And Interpretation of Classical Mechanics” book which is notable for using scheme as a mathematical notation, thereby avoiding a lot of the ambiguities of ‘normal’ maths notation (a big win in Lagrangian mechanics, which makes heavy use of partial derivatives).
Anyhow, the Stanford Quantum course requires you to do various exercises, such as the following:
An electron has a 1nm wavelength. Is it reasonable to treat this electron as an approximately non-relativistic particle (i.e. traveling much slower than the speed of light)?
As usual, this requires plugging the supplied numbers and a bunch of physics constants into the right equation. At school, I would’ve done this by hand – hopefully remembering constants like ‘c’ (3e8 m/s) and h (6.62e-34).
But I can also do this using scheme, as per the SICM book. The ‘scmutils’ library comes with a bunch of built-in constants, with the correct units:
:c => (& 299792458. (* &meter (expt &second -1))) :h => (& 6.62606896e-34 (* (expt &meter 2) &kilogram (expt &second -1)))
In scmutils, the ampersand function attaches units to a number.
So now I can use de Broglie’s wavelength relation to find velocity as a function of mass and wavelength:
(define (velocity mass wavelength) (/ :h (* mass wavelength)))
then plug in the appropriate values to find the velocity:
(velocity :m_e (& 1e-9 &meter)) => (& 727389.4676462485 (* &meter (expt &second -1)))
The question actually asked “can you treat it as non-relativistic” so we want to know if it’s close to the speed of light or not:
(/ (velocity :m_e (& 1e-9 &meter)) :c) => 2.43e-3
So it’s much slower than the speed of light, and the answer is “yes, it’s reasonable to treat this as a non-relativistic particle). But thanks to scheme/scmutils, I’m also pretty confident I haven’t made errors with units (because scheme tracked them for me) or constants (because I didn’t have to enter them).
Although not required for this exercise, the scmutils package also handles symbolic differentiation which is pretty nifty! For example:
(define (foo x) (log x)) (foo 'a) => (log a) ((D foo) 'x) => (/ 1 x)
The scmutils library is very elegant once you realise how it works. The definition of the scheme ‘foo’ function is just that – a scheme function. You can use it in one of two ways. You can pass a number to it – eg. (foo 5) – and it’ll evaluate it numerically – eg. 1.609. Or you can pass that same function a symbol, such as ‘a, and it’ll give you back a symbolic expression – eg. “log a”. It has a built-in simplifier too, as seen here:
(define (addaddadd x) (+ x x x)) => #| addaddadd |# (addaddadd 'a) => #| (* 3 a) |#