annotate src/rlm/thermal_noise.clj @ 0:78a630e650d2

initial import
author Robert McIntyre <rlm@mit.edu>
date Tue, 18 Oct 2011 00:57:08 -0700
parents
children
rev   line source
rlm@0 1 (ns rlm.thermal-noise
rlm@0 2 (:refer-clojure :only [])
rlm@0 3 (:require rlm.ns-rlm mobius.base))
rlm@0 4 (rlm.ns-rlm/ns-clone mobius.base)
rlm@0 5
rlm@0 6 (defrecord imaginary [real complex])
rlm@0 7
rlm@0 8 (defmethod + [imaginary Number] [i r]
rlm@0 9 (imaginary. (+ (:real i) r) (:complex i)))
rlm@0 10 (defmethod + [Number imaginary] [r i]
rlm@0 11 (+ i r))
rlm@0 12 (defmethod + [imaginary imaginary] [i1 i2]
rlm@0 13 (imaginary. (+ (:real i1) (:real i2))
rlm@0 14 (+ (:complex i1) (:complex i2))))
rlm@0 15
rlm@0 16
rlm@0 17 (defmethod * [imaginary Number] [i r]
rlm@0 18 (imaginary. (* r (:real i)) (* r (:complex i))))
rlm@0 19 (defmethod * [Number imaginary] [r i]
rlm@0 20 (* i r))
rlm@0 21 (defmethod * [imaginary imaginary] [i1 i2]
rlm@0 22 (let [[a1 b1] [(:real i1) (:complex i1)]
rlm@0 23 [a2 b2] [(:real i2) (:complex i2)]]
rlm@0 24 (imaginary. (- (* a1 a2) (* b1 b2))
rlm@0 25 (+ (* a1 b2) (* a2 b1)))))
rlm@0 26
rlm@0 27 (defmethod / imaginary [i]
rlm@0 28
rlm@0 29 (cond (and (not= (:real i) 0) (not= (:complex i) 0))
rlm@0 30 (let [[a b] [(:real i) (:complex i)]
rlm@0 31 d (- (/ (/ a) (+ (/ a b) (/ b a))))
rlm@0 32 c (/ (+ 1 (* b d)) a)]
rlm@0 33 (imaginary. c d))
rlm@0 34 (= (:real i) 0)
rlm@0 35 (imaginary. 0 (- (/ (:complex i))))
rlm@0 36 (= (:complex i) 0)
rlm@0 37 (imaginary. (/ (:real i)) 0)))
rlm@0 38
rlm@0 39
rlm@0 40 (defmethod / [imaginary imaginary] [i1 i2]
rlm@0 41 (* i1 (/ i2)))
rlm@0 42
rlm@0 43 (defmethod / [imaginary Number] [i r]
rlm@0 44 (* i (/ r)))
rlm@0 45
rlm@0 46 (defmethod / [Number imaginary] [r i]
rlm@0 47 (* r (/ i)))
rlm@0 48
rlm@0 49 (defmulti norm class)
rlm@0 50 (defmethod norm Number [r] r)
rlm@0 51 (defmethod norm imaginary [i]
rlm@0 52 (sqrt (+ (sq (:real i) ) (sq (:complex i)))))
rlm@0 53
rlm@0 54
rlm@0 55
rlm@0 56
rlm@0 57 (def i (imaginary. 0 1))
rlm@0 58
rlm@0 59 (defn h** [w_0 v_0 y w]
rlm@0 60 (/ v_0 (+ (- (sq w)) (* 2 y i w) (sq w_0))))
rlm@0 61
rlm@0 62 (def f_0 10e3)
rlm@0 63 (def w_0 (* f_0 2 Math/PI))
rlm@0 64 (def v_0 0.01)
rlm@0 65 (def h* (partial h** w_0 v_0))
rlm@0 66
rlm@0 67
rlm@0 68 (def x (range 1 1e7 100))
rlm@0 69
rlm@0 70 (def y-range [0.1 0.5 1 2 5 10 100 1000])
rlm@0 71
rlm@0 72
rlm@0 73 (defn graphs []
rlm@0 74 (let [plot (xy-plot)]
rlm@0 75 (dorun
rlm@0 76 (for [ y y-range]
rlm@0 77 (let [result (vec (map (partial (comp norm h*) y) x))]
rlm@0 78 (add-lines plot (vec (map log10 x)) (vec (map log10 result))))))
rlm@0 79 (set-x-label plot "log frequency")
rlm@0 80 (set-y-label plot "log h*")))
rlm@0 81
rlm@0 82 (def rrr (imaginary. 1 1))
rlm@0 83
rlm@0 84