Mercurial > rlm
comparison 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 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:78a630e650d2 |
---|---|
1 (ns rlm.thermal-noise | |
2 (:refer-clojure :only []) | |
3 (:require rlm.ns-rlm mobius.base)) | |
4 (rlm.ns-rlm/ns-clone mobius.base) | |
5 | |
6 (defrecord imaginary [real complex]) | |
7 | |
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)))) | |
15 | |
16 | |
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))))) | |
26 | |
27 (defmethod / imaginary [i] | |
28 | |
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))) | |
38 | |
39 | |
40 (defmethod / [imaginary imaginary] [i1 i2] | |
41 (* i1 (/ i2))) | |
42 | |
43 (defmethod / [imaginary Number] [i r] | |
44 (* i (/ r))) | |
45 | |
46 (defmethod / [Number imaginary] [r i] | |
47 (* r (/ i))) | |
48 | |
49 (defmulti norm class) | |
50 (defmethod norm Number [r] r) | |
51 (defmethod norm imaginary [i] | |
52 (sqrt (+ (sq (:real i) ) (sq (:complex i))))) | |
53 | |
54 | |
55 | |
56 | |
57 (def i (imaginary. 0 1)) | |
58 | |
59 (defn h** [w_0 v_0 y w] | |
60 (/ v_0 (+ (- (sq w)) (* 2 y i w) (sq w_0)))) | |
61 | |
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)) | |
66 | |
67 | |
68 (def x (range 1 1e7 100)) | |
69 | |
70 (def y-range [0.1 0.5 1 2 5 10 100 1000]) | |
71 | |
72 | |
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*"))) | |
81 | |
82 (def rrr (imaginary. 1 1)) | |
83 | |
84 |