1 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
6 ;;;; Purpose: RLC Functions
7 ;;;; Programmer: Kevin M. Rosenberg
8 ;;;; Date Started: Jan 2003
10 ;;;; $Id: kboot.lisp 8414 2003-12-28 19:46:57Z kevin $
11 ;;;; *************************************************************************
15 (defun plot-series-rlc-current (v r l c t-inc t-end &optional (t-start 0))
16 (let ((path (make-pathname
17 :directory '(:absolute "tmp")
19 (concatenate 'string "rlc-data-"
20 (write-to-string (get-universal-time)))
22 (write-series-rlc-graph path v r l c t-inc t-end t-start)
27 (defun run-xgraph (path)
28 (kl::run-shell-command "xgraph ~A" (namestring path)))
30 (defun write-series-rlc-current-graph (path v r l c t-inc t-end
31 &optional (t-start 0))
32 (multiple-value-bind (x y)
33 (series-rlc-current-graph-data v r l c t-inc t-end t-start)
34 (with-open-file (out path :direction :output :if-exists :supersede
35 :if-does-not-exist :create)
36 (dotimes (i (length x))
37 (format out "~D ~D~%" (aref x i) (aref y i))))))
39 (defun series-rlc-current-graph-data (v r l c t-inc t-end &optional (t-start 0))
40 (let* ((formula-list (series-rlc-current-formula v r l c))
41 (formula-eval (eval formula-list))
42 (formula (compile nil formula-eval))
43 (n (ceiling (- t-end t-start) t-inc)))
45 (tm t-start (+ tm t-inc))
46 (x-pts (make-array n))
47 (y-pts (make-array n)))
50 (setf (aref x-pts i) tm)
51 (setf (aref y-pts i) (funcall formula tm)))))
53 (defun series-rlc-current-time (v r l c tm)
54 (let* ((formula-list (series-rlc-current-formula v r l c))
55 (formula (eval formula-list)))
56 (funcall formula tm)))
58 (defun circuit-type (r l c)
60 ((and (zerop r) (zerop l) (zerop c))
62 ((and (/= 0 r) (zerop l) (zerop c))
64 ((and (zerop r) (/= 0 l) (zerop c))
66 ((and (zerop r) (zerop l) (/= 0 c))
68 ((and (/= 0 r) (/= 0 l) (zerop c))
70 ((and (/= 0 r) (zerop l) (/= 0 c))
72 ((and (zerop r) (/= 0 l) (/= 0 c))
77 (defun series-rlc-current-formula (v r l c)
78 "Returns formula for currrent through a series RLC circuit with a step-voltage applied at time 0."
79 (ecase (circuit-type r l c)
83 `(lambda (tm) ,(/ v r)))
94 (* ,(/ v r) (- 1 (exp (- (* tm ,(/ r l))))))))
96 `(lambda (tm) (* ,(/ v r) (exp (- (* tm ,(/ 1 r c)))))))
98 (let ((lc-root (sqrt (* l c))))
100 (* ,(/ (* v lc-root) l) (sin (* tm ,(/ 1 lc-root)))))))
102 (let* ((r/2l (when (/= 0 l) (/ r (+ l l))))
103 (rr/4ll (when r/2l (* r/2l r/2l)))
104 (v/l (when (/= 0 l) (/ v l)))
105 (1/lc (when (and (/= 0 l) (/= 0 c)) (/ 1 (* l c)))))
110 (let* ((root (sqrt (- rr/4ll 1/lc)))
111 (p1 (+ (- r/2l) root))
112 (p2 (- (- r/2l) root)))
114 (* ,(/ v/l (- p1 p2))
115 (- (exp (* ,p1 tm)) (exp (* ,p2 tm)))))))
116 ;; RLC critcally-damped
121 (exp (- (* tm ,r/2l))))))
124 (let ((diff (- 1/lc rr/4ll)))
126 (* ,(/ v/l (sqrt diff))
127 (exp (- (* tm ,r/2l)))
128 (sin (* tm ,(sqrt diff))))))))))))