view 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
line wrap: on
line source
1 (ns rlm.thermal-noise
2 (:refer-clojure :only [])
3 (:require rlm.ns-rlm mobius.base))
4 (rlm.ns-rlm/ns-clone mobius.base)
6 (defrecord imaginary [real complex])
8 (defmethod + [imaginary Number] [i r]
9 (imaginary. (+ (:real i) r) (:complex i)))
10 (defmethod + [Number imaginary] [r i]
11 (+ i r))
12 (defmethod + [imaginary imaginary] [i1 i2]
13 (imaginary. (+ (:real i1) (:real i2))
14 (+ (:complex i1) (:complex i2))))
17 (defmethod * [imaginary Number] [i r]
18 (imaginary. (* r (:real i)) (* r (:complex i))))
19 (defmethod * [Number imaginary] [r i]
20 (* i r))
21 (defmethod * [imaginary imaginary] [i1 i2]
22 (let [[a1 b1] [(:real i1) (:complex i1)]
23 [a2 b2] [(:real i2) (:complex i2)]]
24 (imaginary. (- (* a1 a2) (* b1 b2))
25 (+ (* a1 b2) (* a2 b1)))))
27 (defmethod / imaginary [i]
29 (cond (and (not= (:real i) 0) (not= (:complex i) 0))
30 (let [[a b] [(:real i) (:complex i)]
31 d (- (/ (/ a) (+ (/ a b) (/ b a))))
32 c (/ (+ 1 (* b d)) a)]
33 (imaginary. c d))
34 (= (:real i) 0)
35 (imaginary. 0 (- (/ (:complex i))))
36 (= (:complex i) 0)
37 (imaginary. (/ (:real i)) 0)))
40 (defmethod / [imaginary imaginary] [i1 i2]
41 (* i1 (/ i2)))
43 (defmethod / [imaginary Number] [i r]
44 (* i (/ r)))
46 (defmethod / [Number imaginary] [r i]
47 (* r (/ i)))
49 (defmulti norm class)
50 (defmethod norm Number [r] r)
51 (defmethod norm imaginary [i]
52 (sqrt (+ (sq (:real i) ) (sq (:complex i)))))
57 (def i (imaginary. 0 1))
59 (defn h** [w_0 v_0 y w]
60 (/ v_0 (+ (- (sq w)) (* 2 y i w) (sq w_0))))
62 (def f_0 10e3)
63 (def w_0 (* f_0 2 Math/PI))
64 (def v_0 0.01)
65 (def h* (partial h** w_0 v_0))
68 (def x (range 1 1e7 100))
70 (def y-range [0.1 0.5 1 2 5 10 100 1000])
73 (defn graphs []
74 (let [plot (xy-plot)]
75 (dorun
76 (for [ y y-range]
77 (let [result (vec (map (partial (comp norm h*) y) x))]
78 (add-lines plot (vec (map log10 x)) (vec (map log10 result))))))
79 (set-x-label plot "log frequency")
80 (set-y-label plot "log h*")))
82 (def rrr (imaginary. 1 1))